2009-09-06 5 views
15

Sto provando a filtrare TUTTO l'output del widget tramite un semplice filtro, ma non riesco a trovare nessun hook e speravo di essere indirizzato nella giusta direzione. O forse i miei sforzi non sono nemmeno possibili?Esistono ganci widget (o barra laterale) di WordPress?

mio semplice filtro è qualcosa di simile:

function clean_widget_output($input) { 
    return str_replace(array("\t", "\n", "\r"), '', $input); 
} 

add_[FILTER OR ACTION]('need_a_hook', 'clean_widget_output', 99); 

Tutte le idee? Sono abbastanza nuovo in PHP, ma posso andare in giro.

+0

non sono sicuro di quando hanno introdotto il filtro widget_text, forse non avevano in ' 09 quando questa domanda è stata inizialmente richiesta. Vedere il mio codice di esempio qui sotto nella mia risposta per un esempio di lavoro completo (e molto semplice). –

risposta

7

Questo era nato dal bisogno/desiderio di pulire il terribile codice HTML vomitato dai widget di WordPress. Adoro quello che fanno, ma alcuni dei risultati mi fanno piangere.

La risposta breve è output buffering perché non sono riuscito a trovare alcun widget o hook della barra laterale.

La risposta lunga è:

function tidy_sidebar($sidebar_name_or_id) 
{ 
    ob_start(); 

    $bool = dynamic_sidebar($sidebar_name_or_id); 

    if ($bool) 
    { 
     $str = ob_get_contents(); 
     $str = 'do cleanup stuff...'; 
    } 
    else 
    { 
     $str = ''; 
    } 
    ob_end_clean(); 

    return $str; 
} 

quindi chiamare echo tidy_sidebar('sidebar-name-or-id'); dal vostro tema.

+0

Ora puoi controllare il wrapper del widget e il titolo del widget html quando registri una barra laterale, quindi non sei sicuro di quanto sia necessario. Se non ti piace un widget, è meglio riscriverlo con l'output che ti piace. Dai un'occhiata all'API dei widget (http://codex.wordpress.org/Widgets_API) e alla funzione register_sidebar (http://codex.wordpress.org/Function_Reference/register_sidebar) – roborourke

4

ci sono un sacco di ganci per i widget wordpress che non sono documentati. Il codice wordpress non li elenca, per qualsiasi ragione (come questi ganci potrebbero cambiare in futuro e si interromperà inaspettatamente con nuovi aggiornamenti e versioni) ... quindi usali con estrema cautela.

per scoprire quello che sono, ci sono almeno 2 posti a guardare:

<wordpress install directory>/wp-includes/default-filters.php 
<wordpress install directory>/wp-includes/default-widgets.php 

contenute in questi due file è un buon elenco di tutti i ganci usi wordpress.

Un esempio potrebbe essere un filtro per i widget è widget_title

di nuovo, utilizzare queste con cautela, non sono garantiti per funzionare oltre la specifica versione del codice che stai guardando.

7

Avevo un problema simile e dopo aver guardato attraverso il numero list of all WordPress filter hooks di Adam Brown, ho scoperto che esiste il gancio necessario (widget_title, come indicato da pxl), ma che non esiste un hook per ottenere l'output di tutti i widget. Ho pensato di approfondire la soluzione che ha funzionato per me.

In teoria, l'hook widget_title dovrebbe interessare tutti i widget del tuo blog, ma sono sicuro che alcuni widget di terze parti trascurino di includere la riga di codice necessaria per applicare qualsiasi filtro per i titoli, quindi non è infallibile. Ha funzionato per me, tuttavia, e può essere utilizzato per applicare "shortcode" personalizzato (più precisamente, in questo caso, "longcode") o sintassi ai titoli del widget. Ad esempio, volevo includere di tanto in tanto il codice html nei titoli dei miei widget, ma per impostazione predefinita, tutto il codice HTML viene rimosso. Così, al fine di essere in grado di aggiungere le cose come <em> tag al testo in alcuni dei miei titoli, ho scelto una sintassi personalizzato: [[ invece di < & ]] invece di > (ad es, [[em]] e [[/em]]) e poi creato una funzione in le funzioni del mio tema.php file da elaborare che la sintassi personalizzato e sostituirlo con il codice HTML equivalente:

function parse_html_widget_title($text) { 
    return str_replace(array('[[', ']]'), array('<', '>'), $text); 
} 

Poi ho aggiunto una linea di sotto di essa per aggiungere la funzione di filtro:

add_filter('widget_title', 'parse_html_widget_title', 11); // 11 is one above the default priority of 10, meaning it will occur after any other default widget_title filters 

La funzionalità add_filter/apply_filter automaticamente passa il contenuto filtrato come primo parametro alla funzione specificata come filtro, quindi è tutto ciò che devi fare.

Per fare qualcosa di simile per l'output principale del widget, è necessario guardare tutti i widget per vedere quale hook usano e verificare che abbiano un filtro per l'output principale, rispetto a add_filter() per ogni gancio che si trova con la funzione di richiamata personalizzata (ad esempio, è widget_text per l'output del widget Testo o get_search_form per il modulo di ricerca [lo si può vedere in wp-includes/general-template.php, nella funzione get_search_form()]). Il problema è che alcuni dei widget generati dinamicamente non hanno ganci (come il widget Meta), motivo per cui la soluzione di buffer di output fornita da Jeff è la soluzione più versatile, sebbene non ideale.

+0

GRAZIE !! Ho cercato qualcosa di simile per anni - tu sei un salvagente. :) – Michelle

2

Non sono sicuro che quando hanno introdotto il filtro widget_text, forse non l'avevano nel '09 quando questa domanda era stata inizialmente richiesta, ma dal momento che è lì ora, e per il bene di chiunque abbia questo stackoverflow come ho fatto da Google e succede solo a leggere abbastanza lontano verso il basso per vedere questa risposta, ora è in realtà abbastanza semplice:

function my_widget_filter($content) 
{ 
    // manipulate $content as you see fit 
    return $content; 
} 

add_filter('widget_text', 'my_widget_filter', 99);