¿Hay alguna forma de alterar dinámicamente los títulos de los widgets?

8

Tengo un caso en el que hay muchos widgets en varias barras laterales personalizadas. Me pregunto si hay una manera simple de alterar los títulos de cada widget dinámicamente. Normalmente, un widget tiene un campo de título que puede configurar manualmente o en el complemento mismo.

Deseo agregar algo como un valor de metacampo por publicación a cada título de widget.

La lógica sería algo como:

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

Sé que hay un widget_titlefiltro, pero ¿cómo se dirigen a widgets específicos?

PD. No puedo usar los register_sidebarparámetros regulares debido a que tengo muchos widgets que necesitan títulos específicos.

Wyck
fuente

Respuestas:

8

Puede usar el widget_display_callback(despedido, previsiblemente, justo antes de mostrar 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;
}

El $widgetargumento es un objeto de su clase de widget y, por $widget->id_baselo tanto , contendrá la ID de su widget (si se dirige a una clase de widget específica).

Stephen Harris
fuente
7

Puedes usar tu propio gancho para la widget_titleacción. Puede determinar un widget específico por $id_baseparámetro que se pasa como tercer argumento al gancho. Debería funcionar así:

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

Para los widgets personalizados, deberá aplicar este filtro al título del widget antes de repetirlo ( como se muestra en los widgets predeterminados ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);
Eugene Manuilov
fuente
1
+1 una respuesta ordenada, pero requiere que el widget aplique el widget_titlefiltro.
Stephen Harris
Donde puede probar esto con los 'enlaces' predeterminados, no puedo hacer que funcione, ¿tal vez porque le falta el widget_title?
Wyck