Existe-t-il un moyen de modifier dynamiquement les titres des widgets?

8

J'ai un cas où il y a beaucoup de widgets dans plusieurs barres latérales personnalisées. Je me demande s'il existe un moyen simple de modifier dynamiquement les titres de chaque widget. En règle générale, un widget a un champ de titre que vous pouvez définir manuellement ou sur le plugin lui-même.

Je souhaite ajouter quelque chose comme une valeur de champ méta par publication à chaque titre de widget.

La logique serait quelque chose comme:

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

Je sais qu'il existe un widget_titlefiltre, mais comment ciblez-vous des widgets spécifiques?

ps. Je ne peux pas utiliser les register_sidebarparamètres réguliers car de nombreux widgets nécessitent des titres spécifiques.

Wyck
la source

Réponses:

8

Vous pouvez utiliser le widget_display_callback(déclenché, comme prévu, juste avant d'afficher un 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;
}

L' $widgetargument est un objet de votre classe de widget, et $widget->id_basecontiendra donc l'ID de votre widget (si vous ciblez une classe de widget spécifique).

Stephen Harris
la source
7

Vous pouvez utiliser votre propre crochet pour l' widget_titleaction. Vous pouvez déterminer un widget spécifique par $id_baseparamètre qui est transmis comme troisième argument au hook. Cela devrait fonctionner comme ceci:

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

Pour les widgets personnalisés, vous devrez appliquer ce filtre au titre du widget avant de l'écho ( comme indiqué les widgets par défaut ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);
Eugene Manuilov
la source
1
+1 une bonne réponse - mais cela nécessite que le widget applique le widget_titlefiltre.
Stephen Harris
Lorsque vous pouvez tester cela avec les «liens» par défaut, je ne peux pas le faire fonctionner, peut-être parce qu'il manque le widget_title?
Wyck