web-dev-qa-db-fra.com

Filtrer une sortie de shortcode spécifique?

Existe-t-il un point d'ancrage dans WordPress que je peux utiliser pour filtrer la sortie d'un shortcode spécifique? Quelque chose comme ça:

add_filter('shortcode_output', 'my_filter_function', 2);

function my_filter_function ( $output, $shortcode ) {
    ....
}

$shortcode serait quelque chose comme [my_schortcode] ou même mieux, shortcode et ses attributs séparés dans un tableau.

7
ragulka

Il n'y a pas de filtre que je sache qui est destiné à cibler les codes courts individuels comme vous le souhaitez.

Vous pouvez filtrer les attributs avec shortcode_atts_{$shortcode} quoique.

Vous pouvez pirater un autre shortcode en créant votre propre rappel et en l'enregistrant avec le slug de shortcode d'origine. Je pense que c'est ce que vous allez probablement devoir faire.

Preuve de concept:

function my_gallery_shortcode($atts) {
  return 'howdy';
}
add_shortcode('gallery','my_gallery_shortcode');

Maintenant, essayez d'utiliser une galerie :)

5
s_ha_dum

WordPress 4.7 a introduit un nouveau filtre, do_shortcode_tag , pour faire exactement cela.

10
Shawn H

Bien qu'il n'y ait pas de crochet, il existe une petite solution de contournement qui rend votre objectif final possible. Vous pouvez créer un nouveau code court qui, à chaque instance, vous entoure toujours de tout autre code court dont vous voulez filtrer la sortie.

Utilisation dans un post, etc.:

Here is some post text. Blah blah...
[filter][target_annoying_shortcode size="small" limit="20"][/filter] 
Here is some more text in my post. More blah blah...

Dans functions.php:

function my_shortcode_output_filter( $attr, $content ) {

    // Express the shortcode into its output
    $content_translated = do_shortcode(trim($content));
    if($shortcode_to_modify == $content || !$content_translated) {
        // Error handling
        return 'There was an error in filtering shortcode: '.$content;  
    }

    // Now modify the output as you like, here...

    $content_translated_and_filtered = $content_translated;

    return $content_translated_and_filtered;
 }
 add_shortcode('filter', 'my_shortcode_output_filter');
1
Adam Friedman

La seule chose que vous pouvez filtrer sont les attributs du shortcode:

apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );

Le point est que $shortcode est l'argument tiers lors de l'enregistrement d'un shortcode. Cet argument est plutôt nouveau et presque aucun shortcode ne l'utilise, il sera donc remplacé par défaut - une variable string de ''.

Cela conduit à un résultat amusant:

add_filter( 'shortcode_atts_', 'wpse112294_shortcode_atts_cb' );
function wpse112294_shortcode_atts_cb( $out, $pairs, $atts )
{
    // here we need to find a way to uniquely identify a shortcode
    // for which we ain't got a name

    // something that makes the shortcode unique:
    $found = isset( $pairs['foo_attribute_key'] );
    if ( $found )
    {
        // Instantly remove this filter to save processing time:
        remove_filter( current_filter(), __FUNCTION__ );

        // do something stunning in here!
    }

    return $out;
}

Donc, yes , avec une probabilité de 90%, nous devons filtrer la sortie de chaque shortcode (!) Et essayer de l'identifier d'une manière ou d'une autre par des arguments par défaut ($pairs) ou par des arguments d'entrée (impossible). Ensuite, enfin nous sommes en mesure de traiter la sortie. Sommes-nous capables de traiter la chaîne elle-même? Non, cela doit être fait comme @s_ha_dum montré ci-dessus.

0
kaiser

Alors que @s_ha_dum a donné une réponse décente, vous pouvez créer un nouveau shortcode dans le but de filtrer un shortcode existant. Par exemple,

function filter_function($atts, $content) {
    extract(shortcode_atts(array(
            'att1' => 'val1',
            'att2' => 'val2'
    ), $atts));

    //save shortcode output in $return
    $return = do_shortcode("[existing_shortcode att1='$att1' att2='$att2'".$content."/existing_shortcode]");

    //insert code to modify $return

    echo $return;
}
add_shortcode('new_shortcode','filter_function');

notez que pour le shortcode [embed], vous devez utiliser

global $wp_embed;
$return = $wp_embed->run_shortcode("[embed ...

au lieu de do_shortcode

0
yitwail