current_shortcode () - detecta shortcode atualmente usado

10

Em uma classe de plugins, quero fornecer campos simples para dados públicos: email, número de telefone, Twitter etc. A lista pode ser estendida.

Consulte o plug-in Public Contact Data no GitHub para obter detalhes.

Para manter o uso simples, também quero oferecer códigos de acesso fáceis de digitar:

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

A única diferença é a segunda parte. Não quero mais argumentos para os códigos de acesso porque eles são propensos a erros. Então, eu registro um manipulador shortcode para todos os campos na minha classe de plugins:

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

Agora, shortcode_handler() precisa saber qual shortcode foi chamado. Minha pergunta é: como faço isso?

Minha solução atual é outra função:

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

Isso… funciona para the_content() . Mas não é nem elegante nem robusto. Eu li wp-includes/shortcodes.php , mas não consigo ver agora como fazer melhor.

    
por fuxia 20.02.2012 / 04:19

2 respostas

1

Isso não foi testado , mas a função de retorno de chamada é fornecida com uma matriz de argumentos, $args , que fornece (se houver) os parâmetros fornecidos com o shortocode. A entrada zeroth às vezes contém o nome do shortcode usado (por exemplo, public_email ). Às vezes eu quero dizer ...

  

A entrada zeroeth da matriz de atributos ($ atts [0]) conterá a string que corresponde à regex shortcode, mas SOMENTE se isso for diferente do nome da callback, que de outra forma aparece como o terceiro argumento para a função callback. / p>

(Veja o Codex ). Para seus propósitos, então $atts[0] conterá 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;   
}
    
por Stephen Harris 20.02.2012 / 11:36
1

Baseado em resposta de Stephen Harris Eu fiz o meu catch all handler aceitar um terceiro argumento, que é o nome do 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 );
}

Veja isso em ação no plug-in vinculado à minha pergunta.

    
por fuxia 05.07.2013 / 00:59