current_shortcode () - detecta el shortcode utilizado actualmente

11

En una clase de complemento, quiero proporcionar campos simples para datos públicos: correo electrónico, número de teléfono, Twitter, etc. La lista se puede ampliar.

Consulte el complemento Datos de contacto público en GitHub para obtener más detalles.

Para mantener el uso simple, también quiero ofrecer códigos cortos que sean fáciles de escribir:

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

La única diferencia es la segunda parte. No quiero más argumentos para los códigos cortos porque son propensos a errores. Así que registro un controlador shortcode para todos los campos en mi clase de complemento:

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

Ahora shortcode_handler()tiene que saber qué shortcode se ha llamado. Mi pregunta es: ¿Cómo hago esto?

Mi solución actual es otra función:

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

Esto ... funciona para the_content(). Pero no es elegante ni robusto.
He leído wp-includes/shortcodes.php, pero no puedo ver ahora cómo hacerlo mejor.

fuxia
fuente
1
Me tienes todo curioso ahora. Lo investigaré en breve. Sé que shortcodes.php es solo un montón de funciones, si se hubiera escrito correctamente usando OOP, sin duda hubiera tenido una variable de clase current_shortcode y hubiera facilitado todo. Que yo sepa, Wordpress solo almacena todos los códigos cortos y devoluciones de llamada en una matriz, me pregunto si hay una manera de hacer que almacene cada código corto en una variable a medida que se procesa y sin piratear archivos principales.
Dwayne Charrington
@toscho De acuerdo, creo que eso es realmente un problema, una remodelación en la forma en que se hacen los códigos cortos, (abarcando más OOP como Widgets) debería tenerse en cuenta. Me encantaría ayudar en eso, y luego enviar esto como una actualización al Core.
Webord
@brasofilo Bien, lo hice justo ahora.
fuxia

Respuestas:

3

Esto no se ha probado , pero la función de devolución de llamada se proporciona con una serie de argumentos, $argsque proporcionan (si los hay) los parámetros proporcionados con el shortocode. La entrada zeroth a veces contiene el nombre del shortcode utilizado (p public_email. Ej .). Por a veces quiero decir ...

La entrada cero de la matriz de atributos ($ atts [0]) contendrá la cadena que coincide con la expresión regular de código corto, pero SOLO si difiere del nombre de devolución de llamada, que de lo contrario aparece como el tercer argumento para la función de devolución de llamada.

(Ver el Codex ). Para sus propósitos, entonces $atts[0]contendrá cualquiera 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
fuente
Ah, lo recuerdo, me encontré con algo similar hace mucho tiempo. En mi caso, es el tercer argumento para el controlador de shortcode. ¡El primero es $args, el segundo $contenty el último, el shortcode!
fuxia
De Verdad? El shortcode difiere del nombre de devolución de llamada 'shortcode_handler' ... Pensé que se habría dado en el $args. Pero si eso funciona para usted ...: D.
Stephen Harris
2

Según la respuesta de Stephen Harris , hice que mi controlador catch all acepte un tercer argumento, que es el nombre de código corto:

/**
 * 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 );
}

Véalo en acción en el complemento vinculado en mi pregunta.

fuxia
fuente