Existe alguma maneira de alterar dinamicamente os títulos dos widgets?

8

Eu tenho um caso em que existem muitos widgets em várias barras laterais personalizadas. Gostaria de saber se existe uma maneira simples de alterar os títulos de cada widget dinamicamente. Normalmente, um widget tem um campo de título que você pode definir manualmente ou no próprio plug-in.

Desejo adicionar algo como um valor de meta-campo por post para cada título de widget.

A lógica seria algo como:

$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"

Sei que existe um widget_titlefiltro, mas como você segmenta widgets específicos?

ps. Não consigo usar os register_sidebarparâmetros regulares devido a muitos widgets que precisam de títulos específicos.

Wyck
fonte

Respostas:

8

Você pode usar o widget_display_callback(acionado, previsivelmente, antes de exibir um 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;
}

O $widgetargumento é um objeto da sua classe de widget e, portanto $widget->id_base, conterá o ID do seu widget (se estiver direcionando uma classe de widget específica).

Stephen Harris
fonte
7

Você pode usar seu próprio gancho para widget_titleação. Você pode determinar o widget específico por $id_baseparâmetro que é passado como terceiro argumento para o gancho. Deve funcionar assim:

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

Para widgets personalizados, você precisará aplicar esse filtro ao título do widget antes de repeti-lo ( como mostrado nos widgets padrão ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);
Eugene Manuilov
fonte
11
Marcar uma resposta com +1, mas exige que o widget aplique o widget_titlefiltro.
Stephen Harris
Onde você pode testar isso com os 'links' padrão, não consigo fazê-lo funcionar, talvez porque esteja faltando o widget_title?
Wyck