有没有办法动态改变窗口小部件的标题?

时间:2012-06-03 作者:Wyck

我有一个例子,在几个自定义侧栏中有很多小部件。我想知道是否有一种简单的方法可以动态更改每个小部件的标题。通常,小部件有一个标题字段,您可以手动设置或在插件本身上设置。

我希望在每个小部件标题中添加每个帖子的元字段值之类的内容。

逻辑如下:

$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 参数,因为有许多小部件需要特定的标题。

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

您可以使用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;
}
The$widget 参数是widget类的对象,因此$widget->id_base 将包含小部件的ID(如果针对特定的小部件类)。

SO网友:Eugene Manuilov

你可以用你自己的钩子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 );
对于自定义小部件,在回显之前,需要将此过滤器应用于小部件的标题(as shown the default widgets):

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

结束