2012-03-04 16 views
6

Sto scrivendo un semplice plugin per WordPress che utilizza lo shortcode. Voglio che la pagina che contiene lo shortcode abbia tag specifici <meta>. È possibile? E se è così, c'è un modo elegante per farlo?Usa il codice corto di WordPress per aggiungere i tag <meta>

So che posso aggiungere i tag <meta> con l'hook wp_head, ma voglio che il contenuto del meta tag corrisponda a una stringa prodotta dal plugin. Potrei spostare tutto il codice nell'intestazione, ma poi non sono sicuro di come fare riferimento più tardi dallo shortcode. In altre parole, quando dichiaro una variabile nel <head> con un filtro, non è disponibile per i metodi di classe che sto chiamando con lo shortcode.

Qualche idea?

UPDATE:

stata proposta una soluzione piacevole in cui la funzione del gestore per shortcode aggiunge l'azione al gancio wp_head:

add_shortcode('fakeshortcode', 'fakeshortcode_handler'); 
function fakeshortcode_handler() { 

    function add_meta_tags() { 
     //echo stuff here that will go in the head 
    } 
    add_action('wp_head', 'add_meta_tags'); 
} 

Questo è gonfiano, ma il problema è che wp_head accade PRIMA lo shortcode viene analizzato e aggiunge l'azione (quindi niente viene aggiunto alla testa con il codice sopra ALONE). Per farlo funzionare, ho preso in prestito la soluzione in this post. È fondamentalmente una funzione che "guarda avanti" nel post e vede se c'è qualche codice corto in arrivo. In tal caso, l'IT aggiunge lo add_action('wp_head'....

MODIFICA: Ho rimosso la mia domanda di follow-up su come passare la variabile. È una nuova domanda here.

risposta

11

Primo tentativo (non usare questo ... vedere la 'modifica' sotto):

In primo luogo, è necessario impostare il codice funzione con qualcosa di simile:

add_shortcode('metashortcode', 'metashortcode_addshortcode'); 

Poi , si creerà la funzione in cui si dovrà aggiungere un gancio per wp_head con qualcosa di simile:

function metashortcode_addshortcode() { 
    add_action('wp_head', 'metashortcode_setmeta'); 
} 

Poi, si definisce wha t che vuole fare nella wp_head:

function metashortcode_setmeta() { 
    echo '<meta name="key" content="value">'; 
} 

Aggiungendo lo shortcode [metashortcode] dovrebbe aggiungere i metadati in base alle esigenze. Il codice è stato fornito solo per aiutarti a capire come farlo accadere. Non è stato completamente testato.

Modifica: il codice precedente era solo un concetto e non può funzionare a causa dell'ordine di esecuzione. Ecco un esempio di lavoro che otterrà il risultato atteso:

// Function to hook to "the_posts" (just edit the two variables) 
function metashortcode_mycode($posts) { 
    $shortcode = 'metashortcode'; 
    $callback_function = 'metashortcode_setmeta'; 

    return metashortcode_shortcode_to_wphead($posts, $shortcode, $callback_function); 
} 

// To execute when shortcode is found 
function metashortcode_setmeta() { 
    echo '<meta name="key" content="value">'; 
} 

// look for shortcode in the content and apply expected behaviour (don't edit!) 
function metashortcode_shortcode_to_wphead($posts, $shortcode, $callback_function) { 
    if (empty($posts)) 
    return $posts; 

    $found = false; 
    foreach ($posts as $post) { 
    if (stripos($post->post_content, '[' . $shortcode) !== false) { 
     add_shortcode($shortcode, '__return_empty_string'); 
     $found = true; 
     break; 
    } 
    } 

    if ($found) 
    add_action('wp_head', $callback_function); 

    return $posts; 
} 

// Instead of creating a shortcode, hook to the_posts 
add_action('the_posts', 'metashortcode_mycode'); 

Enjoy!

+0

È bello. Non mi ero reso conto che lo shortcode è stato analizzato PRIMA che le azioni wp_head siano avvenute. Darò una prova subito. Se hai ragione sono sicuro che risolverà bene il mio problema! – emersonthis

+0

Il mio sospetto era corretto. Le azioni wp_head vengono attivate PRIMA che il codice corto venga analizzato. Quindi questa soluzione non funziona esattamente come descritto. TUTTAVIA, l'approccio può essere modificato ... [vedi il mio aggiornamento sopra] – emersonthis

+0

Scusa Emerson, ho frainteso quello che stavi cercando di fare.NON è stato eseguito prima. Pertanto, ho modificato la mia soluzione per farlo funzionare correttamente. – Maxime

Problemi correlati