current_shortcode () - detecta el shortcode usado actualmente

10

En una clase de complemento, deseo 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 información.

Para simplificar el uso, 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 de 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() debe saber a 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 ni elegante ni robusto.
He leído wp-includes/shortcodes.php , pero no puedo ver ahora cómo hacerlo mejor.

    
pregunta fuxia 20.02.2012 - 04:19

2 respuestas

1

Esto no se ha probado , pero la función de devolución de llamada se proporciona con una matriz de argumentos, $args que dan (si los hay) los parámetros provistos con el shortocode. La entrada cero a veces contiene el nombre del shortcode utilizado (por ejemplo, public_email ). A veces me refiero a ...

  

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

(Consulte el Codex ). Para sus propósitos, entonces $atts[0] contendrá 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;   
}
    
respondido por el Stephen Harris 20.02.2012 - 11:36
1

Basado en respuesta de Stephen Harris hice que todos los manejadores aceptaran un tercer argumento, que es el nombre del 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.

    
respondido por el fuxia 05.07.2013 - 00:59

Lea otras preguntas en las etiquetas