current_shortcode () - détecte le shortcode actuellement utilisé


11

Dans une classe de plugin, je veux fournir des champs simples pour les données publiques: email, numéro de téléphone, Twitter, etc. La liste peut être étendue.

Voir le plugin Public Contact Data sur GitHub pour plus de détails.

Pour simplifier l'utilisation, je souhaite également proposer des shortcodes faciles à taper:

  • [public_email]
  • [public_phone]
  • [public_something]

La seule différence est la deuxième partie. Je ne veux pas d'autres arguments pour les shortcodes car ils sont sujets aux erreurs. Donc j'enregistrer un gestionnaire de shortcode pour tous les champs dans ma classe de plug - in:

foreach ( $this->fields as $key => $value )
{
    add_shortcode( 'public_' . $key, array( $this, 'shortcode_handler' ) );
}

Il shortcode_handler()faut maintenant savoir quel shortcode a été appelé. Ma question est: comment faire?

Ma solution de contournement actuelle est une autre fonction:

protected function current_shortcode()
{
    $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
    return $backtrace[3]['args'][0][2];
}

Cela… fonctionne pour the_content(). Mais il n'est ni élégant ni robuste.
J'ai lu wp-includes/shortcodes.php, mais je ne vois pas pour l'instant comment faire mieux.


1
Vous m'avez tous curieux maintenant. J'examinerai cela sous peu. Je sais que shortcodes.php n'est qu'un tas de fonctions, s'il avait été écrit correctement en utilisant OOP, il aurait sans doute eu une variable de classe current_shortcode et aurait rendu tout plus facile. À ma connaissance, Wordpress ne stocke que tous les shortcodes et rappels dans un tableau, je me demande s'il existe un moyen de le faire stocker chaque shortcode dans une variable pendant son traitement et sans pirater les fichiers de base?
Dwayne Charrington

@toscho D'accord, je pense que c'est vraiment un problème. Je serais ravi de vous aider à ce sujet et de l'envoyer plus tard en tant que mise à jour au Core.
Webord

@brasofilo C'est vrai, je l'ai fait tout à l'heure.
fuxia

Réponses:


3

Ceci n'est pas testé , mais la fonction de rappel est fournie avec un tableau d'arguments, $argsqui donnent (le cas échéant) les paramètres fournis avec le shortocode. L'entrée zéro contient parfois le nom du shortcode utilisé (par exemple public_email). Parfois, je veux dire ...

L'entrée zéro du tableau d'attributs ($ atts [0]) contiendra la chaîne correspondant au regex de shortcode, mais UNIQUEMENT si cela diffère du nom de rappel, qui apparaît sinon comme le troisième argument de la fonction de rappel.

(Voir le Codex ). Pour vos fins $atts[0]contiendra alors soit public_email, public_phoneetc.

function shortcode_handler($atts,$content=NULL){
     if(!isset($atts[0]))
         return; //error?

     switch($atts[0]):
         case 'public_email':
              //deal with this case
              break;
         case 'public_phone':
              //deal with this case
              break;
         case 'public_something':
              //deal with this case
              break;
     endswitch;   
}

Ah, je me souviens, j'ai rencontré quelque chose de similaire il y a longtemps. Dans mon cas, c'est le troisième argument du gestionnaire de shortcode. Le premier est $args, le second $contentet le dernier le shortcode!
fuxia

Vraiment? Le shortcode diffère du nom de rappel 'shortcode_handler' ... J'aurais pensé qu'il aurait été donné dans le $args. Mais si cela fonctionne pour vous ...: D.
Stephen Harris

2

Sur la base de la réponse de Stephen Harris, j'ai fait en sorte que mon gestionnaire catch all accepte un troisième argument, qui est le nom du shortcode:

/**
 * Handler for all shortcodes.
 *
 * @param  array  $args
 * @param  NULL   $content Not used.
 * @param  string $shortcode Name of the current shortcode.
 * @return string
 */
public function shortcode_handler(  $args = array (), $content = NULL, $shortcode = '' )
{
    $key = $this->current_shortcode_key( $shortcode );
    $args['print'] = FALSE;
    return $this->action_handler( $key, $args );
}

/**
 * Returns the currently used shortcode. Sometimes.
 *
 * @return string
 */
protected function current_shortcode_key( $shortcode )
{
    return substr( $shortcode, 7 );
}

Voyez-le en action dans le plugin lié dans ma question.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.