Esiste un modo per modificare dinamicamente i titoli dei widget?


8

Ho un caso in cui ci sono molti widget in diverse barre laterali personalizzate. Mi chiedo se esiste un modo semplice per modificare dinamicamente i titoli di ciascun widget. In genere un widget ha un campo del titolo che puoi impostare manualmente o sul plugin stesso.

Vorrei aggiungere qualcosa come un valore di meta campo per post a ciascun titolo di widget.

La logica sarebbe qualcosa del tipo:

$dynamic_title = get_the_title();
// add a filter to change the widget titles per post value
//
// The widget title would be something like "Recent Posts for $dynamic_title"

So che esiste un widget_titlefiltro, ma come target specifici widget?

ps. Non riesco a utilizzare i register_sidebarparametri regolari a causa del fatto che molti widget necessitano di titoli specifici.

Risposte:


8

Puoi usare il widget_display_callback(sparato, prevedibilmente, appena prima di visualizzare un widget :)).

add_filter('widget_display_callback','wptuts54095_widget_custom_title',10,3);

function wptuts54095_widget_custom_title($instance, $widget, $args){

    if ( is_single() ){
       //On a single post.
       $title = get_the_title();
       $instance['title'] = $instance['title'].' '.$title;
    }

    return $instance;
}

L' $widgetargomento è un oggetto della classe del widget e quindi $widget->id_baseconterrà l'ID per il widget (se si sceglie come target una classe di widget specifica).


7

Puoi usare il tuo gancio per widget_titleagire. È possibile determinare widget specifici per $id_baseparametro che viene passato come terzo argomento all'hook. Dovrebbe funzionare così:

function myplugin_widget_title( $title, $instance, $id_base ) {
    if ( !is_single() ) {
        return $title;
    }

    $post_title = get_the_title();
    switch ( $id_base ) {
        case 'pages': return sprintf( '%s "%s"', $title, $post_title );
        case 'links': return sprintf( 'Links for "%s" post.', $post_title );
        // other widgets ...
        default: return $title;
    }
}
add_filter( 'widget_title', 'myplugin_widget_title', 10, 3 );

Per i widget personalizzati dovrai applicare questo filtro al titolo del widget prima di riecheggiarlo ( come mostrato dai widget predefiniti ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);

1
+1 una risposta chiara, ma richiede che il widget applichi il widget_titlefiltro.
Stephen Harris,

Dove sei in grado di testarlo con i "link" predefiniti, non riesco a farlo funzionare, forse perché manca il widget_title?
Wyck,
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.