Есть ли способ динамически изменять заголовки виджетов?

8

У меня есть случай, когда это много виджетов в нескольких пользовательских боковых панелей. Мне интересно, есть ли простой способ динамического изменения заголовков каждого виджета. Как правило, виджет имеет поле заголовка, которое вы можете установить вручную или на самом плагине.

Я хочу добавить что-то вроде значения метаполя для каждого поста в заголовок каждого виджета.

Логика будет что-то вроде:

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

Я знаю, что есть widget_titleфильтр, но как вы ориентируетесь на конкретные виджеты?

пс. Я не могу использовать обычные register_sidebarпараметры из-за того, что многие виджеты нуждаются в определенных заголовках.

Уик
источник

Ответы:

8

Вы можете использовать widget_display_callback(срабатывает, как и ожидалось, непосредственно перед отображением виджета :)).

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

$widgetАргумент является объектом вашего виджета класса, и так $widget->id_baseбудет содержать идентификатор для виджета (если они нацелены на конкретный класс виджета).

Стивен Харрис
источник
7

Вы можете использовать свой собственный крюк для widget_titleдействий. Вы можете определить конкретный виджет по $id_baseпараметру, который передается в качестве третьего аргумента в ловушку. Это должно работать так:

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

Для пользовательских виджетов вам нужно будет применить этот фильтр к заголовку виджета перед его отображением ( как показано на виджетах по умолчанию ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);
Евгений Мануйлов
источник
1
+1 аккуратный ответ - но для применения widget_titleфильтра требуется виджет .
Стивен Харрис
Где вы можете проверить это с помощью «ссылок» по умолчанию, я не могу заставить его работать, возможно, потому что он пропускает widget_title?
Вик