current_shortcode () - detecta o código curto usado atualmente

11

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

Veja o plugin Dados de Contato Público 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 de shortcode para todos os campos na minha classe de plug-in:

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

Agora, shortcode_handler()é necessário saber qual código de acesso 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 é elegante nem robusto.
Eu li wp-includes/shortcodes.php, mas não consigo ver agora como fazê-lo melhor.

fuxia
fonte
11
Você me deixou curiosa agora. Vou analisar isso em breve. Eu sei que shortcodes.php é apenas um monte de funções, se fosse escrito corretamente usando OOP, sem dúvida, teria uma variável de classe current_shortcode e tornaria tudo mais fácil. Que eu saiba, o Wordpress armazena apenas todos os códigos de acesso e retornos de chamada em uma matriz, gostaria de saber se existe uma maneira de fazer com que cada código de acesso armazene em uma variável à medida que é processada e sem invadir os arquivos principais?
Dwayne Charrington
@toscho Concordo, acho que isso é realmente um problema, uma reforma na maneira como os códigos de acesso são executados (abraçando mais OOP como Widgets) deve estar em mente. Eu adoraria ajudar nisso e, posteriormente, enviar isso como uma atualização para o Core.
Webord 20/02/12
@brasofilo Certo, eu fiz isso agora.
fuxia

Respostas:

3

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

A entrada zero e zero da matriz de atributos ($ atts [0]) conterá a sequência que corresponde ao regex de código abreviado, mas SOMENTE se for diferente do nome do retorno de chamada, que de outra forma aparece como o terceiro argumento da função de retorno de chamada.

(Veja o Codex ). Para seus propósitos, $atts[0]conterá 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;   
}
Stephen Harris
fonte
Ah, lembro-me de que encontrei algo semelhante há muito tempo. No meu caso, é o terceiro argumento para o manipulador de códigos curtos. O primeiro é $args, o segundo $contente o último o shortcode!
fuxia
Realmente? O shortcode difere do nome de retorno de chamada 'shortcode_handler' ... Eu teria pensado que teria sido dado no $args. Mas se isso funcionar para você ...: D.
Stephen Harris
2

Com base na resposta de Stephen Harris , fiz meu manipulador catch all aceitar um terceiro argumento, que é o nome abreviado:

/**
 * 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 em ação no plugin vinculado na minha pergunta.

fuxia
fonte