web-dev-qa-db-fra.com

Shortcode API: Comment obtenir le nom correspondant à RegEx shortcode?

Je cherche un moyen de reproduire ce qui est décrit dans la documentation: Un rappel de shortcode surchargé.

Selon la documentation, le tableau $atts contiendra la chaîne correspondant au regcode shortcode. La position dans $atts dépend de si le nom du rappel correspond au shortcode ou non. L'exemple suivant est tiré de la documentation:

add_shortcode('foo','foo'); // two shortcodes referencing the same callback
add_shortcode('bar','foo');
  produces this behavior:
[foo a='b'] ==> callback to: foo(array('a'=>'b'),NULL,"foo");
[bar a='c'] ==> callback to: foo(array(0 => 'bar', 'a'=>'c'),NULL,"");

Alors j'ai enregistré mes shortcodes comme ceci:

add_shortcode('foo', 'foo');
add_shortcode('bar', 'foo');
function foo($attributes, $content = null) {
    echo '<pre>';
    var_dump($attributes);
    echo '</pre>';
}

Malheureusement, $ attributs est toujours vide, il ne contient pas le nom du shortcode (WP 4.0).

Est-ce une erreur dans la documentation ou est-ce que je me trompe quelque part?

1
Sven

Je pense que vous avez simplement oublié d'exécuter les codes courts [foo a='b'] et [bar a='c'] via le filtre do_shortcode:

do_shortcode( '[foo a='b'] [bar a='c']' )

La sortie de the_content() est filtrée à travers le do_shortcode, vous pouvez donc simplement l'ajouter à votre éditeur.

En exécutant votre code, je reçois le résultat suivant pour le dump $arguments:

array (size=1)
  'a' => string 'b' (length=1)

et

array (size=1)
  'a' => string 'c' (length=1)

donc il n'y a pas de '0' => 'bar' partie ici.

Mais vous pouvez obtenir la balise shortcode actuelle à partir du troisième paramètre (=) du rappel (j'en ai entendu parler pour la première fois dans this répond par @toscho)

Je viens de vérifier la source et si nous vérifions la fonction do_shortcode_tag, nous trouverons:

// self-closing tag
return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, null,  $tag ) . $m[6];

$tag est le troisième paramètre contenant la balise shortcode.

Donc, dans votre cas, vous pouvez changer votre rappel en:

function foo( $attributes = array(), $content = null, $tag = '' ) {

    echo $tag; // current shortcode tag

    echo '<pre>';
    var_dump($attributes);
    echo '</pre>';
}

pour obtenir des informations sur la balise shortcode actuelle.

1
birgire

Les rappels de shortcode obtiennent un troisième argument avec le nom de shortcode. il y a une note à ce sujet dans la documentation:

Apparaît toujours comme troisième argument à partir de 2.9.2.

add_shortcode('foo', 'wpse173855_shortcode');
add_shortcode('bar', 'wpse173855_shortcode');

function wpse173855_shortcode($atts, $content, $name)
{
    echo '<pre>';
    var_dump($name);
    echo '</pre>';
}

Un coup d'œil à la source révèle que le shortcode qui a été mis en correspondance est toujours transmis.

1
chrisguitarguy