web-dev-qa-db-fra.com

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

Dans une classe de plug-in, je souhaite 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 que l'utilisation soit simple, je souhaite également proposer des codes courts faciles à saisir:

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

La seule différence est la deuxième partie. Je ne veux pas d’autres arguments pour les codes abrégés car ils sont sujets aux erreurs. Je me suis donc inscrit one gestionnaire de shortcode pour tous les champs de ma classe de plugin:

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

Maintenant, shortcode_handler() doit savoir quel shortcode a été appelé. Ma question est: comment puis-je faire cela?

Ma solution actuelle est une autre fonction:

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

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

10
fuxia

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

L'entrée zeroeth du tableau d'attributs ($ atts [0]) contiendra la chaîne correspondant à l'expression rationnelle shortcode, mais UNIQUEMENT si elle diffère du nom de rappel, qui apparaît sinon comme troisième argument de la fonction de rappel.

(Voir le Codex ). Pour vos besoins, $atts[0] contiendra soit public_email, public_phone, etc.

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;   
}
1
Stephen Harris

Basé sur Stephen Harris répond J'ai fait accepter à mon gestionnaire tout 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é à ma question.

2
fuxia