有什么方法可以动态更改小部件标题?


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过滤器,但是您如何定位特定的小部件?

ps。我无法使用常规register_sidebar参数,因为有许多需要特定标题的小部件。

Answers:


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将包含窗口小部件的ID(如果定位到特定的窗口小部件类)。


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过滤器。
Stephen Harris 2012年

在您可以使用默认“链接”进行测试的地方,我无法使其正常工作,也许是因为它缺少widget_title
Wyck 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.