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 les titres de chaque widget de manière dynamique. Généralement, 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 filtre widget_title
, mais comment cibler des widgets spécifiques?
ps. Je ne peux pas utiliser les paramètres register_sidebar
normaux car de nombreux widgets ont besoin de titres spécifiques.
Vous pouvez utiliser le widget_display_callback
(déclenché, de manière prévisible, 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'argument $widget
est un objet de votre classe de widget, et donc $widget->id_base
contiendra l'ID de votre widget (si vous ciblez une classe de widget spécifique).
Vous pouvez utiliser votre propre hook pour l'action widget_title
. Vous pouvez déterminer un widget spécifique à l'aide du paramètre $id_base
qui est transmis au troisième argument en tant que troisième argument. 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 devez appliquer ce filtre au titre du widget avant de le répercuter ( comme indiqué par le widget par défaut ):
$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);