current_shortcode () - rileva lo shortcode attualmente utilizzato


11

In una classe di plugin voglio fornire campi semplici per dati pubblici: e-mail, numero di telefono, Twitter ecc. L'elenco può essere esteso.

Vedi il plug-in Dati di contatto pubblico su GitHub per i dettagli.

Per semplificare l'utilizzo, voglio anche offrire codici brevi facili da digitare:

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

L'unica differenza è la seconda parte. Non voglio ulteriori argomenti per i codici brevi perché sono soggetti a errori. Quindi registro un gestore di shortcode per tutti i campi nella mia classe di plugin:

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

Ora shortcode_handler()deve sapere quale shortcode è stato chiamato. La mia domanda è: come posso farlo?

La mia attuale soluzione alternativa è un'altra funzione:

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

Questo ... funziona per the_content(). Ma non è né elegante né robusto.
Ho letto wp-includes/shortcodes.php, ma non riesco a vedere in questo momento come farlo meglio.


1
Mi hai tutti curioso adesso. Lo esaminerò tra poco. So che shortcodes.php è solo un mucchio di funzioni, se fosse stato scritto correttamente usando OOP senza dubbio avrebbe avuto una variabile di classe current_shortcode e avrebbe reso tutto più semplice. Per quanto ne so, Wordpress memorizza solo tutti i codici brevi e le richiamate in un array, mi chiedo se c'è un modo per farlo memorizzare ogni shortcode in una variabile mentre viene elaborato e senza hackerare i file core?
Dwayne Charrington,

@toscho D'accordo, penso che sia davvero un problema, dovrebbe essere in mente un rimodellamento nel modo in cui vengono fatti gli shortcode (abbracciando più OOP come i Widget). Mi piacerebbe aiutarti, e in seguito inviarlo come aggiornamento al Core.
Webord,

@brasofilo Bene, l'ho fatto proprio ora.
fuxia

Risposte:


3

Questo non è testato , ma la funzione di callback è fornita con una serie di argomenti, $argsche danno (se ce ne sono) i parametri forniti con lo shortocode. La voce zeroth a volte contiene il nome dello shortcode utilizzato (ad es public_email.). A volte intendo ...

La voce zeroesima dell'array di attributi ($ atts [0]) conterrà la stringa corrispondente al regex dello shortcode, ma SOLO se differisce dal nome del callback, che altrimenti appare come terzo argomento della funzione callback.

(Vedi il Codice ). Ai tuoi scopi quindi $atts[0]conterrà uno public_email, public_phoneecc.

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;   
}

Ah, ricordo, ho incontrato qualcosa di simile molto tempo fa. Nel mio caso è il terzo argomento per il gestore di shortcode. Il primo è $args, il secondo $contente l'ultimo è lo shortcode!
fuxia

Veramente? Lo shortcode differisce dal nome di callback 'shortcode_handler' ... Avrei pensato che sarebbe stato dato in $args. Ma se questo funziona per te ...: D.
Stephen Harris,

2

Sulla base della risposta di Stephen Harris, ho fatto in modo che tutti i gestori accettassero un terzo argomento, che è il nome dello 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 );
}

Guardalo in azione nel plugin collegato nella mia domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.