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

8

Eu tenho um caso em que há muitos widgets em várias barras laterais personalizadas. Eu estou querendo saber se há 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 plugin.

Eu gostaria de adicionar algo como um valor de meta-campo por postagem 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"

Eu sei que existe um filtro widget_title , mas como você segmenta widgets específicos?

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

    
por Wyck 03.06.2012 / 20:33

2 respostas

8

Você pode usar o widget_display_callback (disparado , previsivelmente, apenas 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 argumento $widget é um objeto da sua classe de widget e, portanto, $widget->id_base conterá o ID de seu widget (se estiver segmentando uma classe de widget específica).

    
por Stephen Harris 03.06.2012 / 20:50
7

Você pode usar seu próprio gancho para widget_title action. Você pode determinar o widget específico pelo parâmetro $id_base 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 fazer eco dele ( como mostrado nos widgets padrão ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);
    
por Eugene Manuilov 03.06.2012 / 20:57

Tags