ウィジェットのタイトルを動的に変更する方法はありますか?


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特定のタイトルを必要とする多くのウィジェットがあるため、通常のパラメーターを使用できません。

回答:


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フックの3番目の引数として渡されるパラメーターによって特定のウィジェットを決定できます。次のように機能するはずです。

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

デフォルトの「リンク」を使用してこれをテストできる場合、おそらくそれが機能しないのwidget_titleでしょうか?
Wyck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.