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

10

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 plug-in Données de contact publiques sur GitHub pour plus de détails.

Pour simplifier l'utilisation, 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. J'enregistre donc un gestionnaire de shortcode pour tous les champs de ma classe de plug-in:

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 la suivante: comment puis-je faire cela?

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 comment faire mieux.

    
posée fuxia 20.02.2012 - 04:19

2 réponses

1

Ceci n'est pas testé , mais la fonction de rappel est fournie avec un tableau d'arguments, $args , qui donnent (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 à zéro du tableau d'attributs ($ atts [0]) contiendra la chaîne qui correspond à la regex 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;   
}
    
réponse donnée Stephen Harris 20.02.2012 - 11:36
1

Sur la base de réponse de Stephen Harris , j'ai obligé mon gestionnaire à accepter un troisième argument, le nom de code abrégé. :

/**
 * 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 plug-in lié à ma question.

    
réponse donnée fuxia 05.07.2013 - 00:59

Lire d'autres questions sur les étiquettes