webentwicklung-frage-antwort-db.com.de

Gibt es eine Möglichkeit, Widget-Titel dynamisch zu ändern?

Ich habe einen Fall, wo das viele Widgets in mehreren benutzerdefinierten Seitenleisten sind. Ich frage mich, ob es eine einfache Möglichkeit gibt, die Titel der einzelnen Widgets dynamisch zu ändern. In der Regel verfügt ein Widget über ein Titelfeld, das Sie manuell oder im Plugin selbst festlegen können.

Ich möchte so etwas wie einen Metafeldwert pro Beitrag zu jedem Widget-Titel hinzufügen.

Die Logik wäre so etwas wie:

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

Ich weiß, dass es einen widget_title-Filter gibt, aber wie können Sie auf bestimmte Widgets abzielen?

ps. Ich kann die regulären register_sidebar-Parameter nicht verwenden, da viele Widgets bestimmte Titel benötigen.

8
Wyck

Sie können den widget_display_callback verwenden (vorhersehbar ausgelöst, kurz bevor ein Widget angezeigt wird :)).

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

Das Argument $widget ist ein Objekt Ihrer Widget-Klasse. Daher enthält $widget->id_base die ID für Ihr Widget (wenn es auf eine bestimmte Widget-Klasse abzielt).

8
Stephen Harris

Sie können Ihren eigenen Hook für widget_title-Aktionen verwenden. Sie können ein bestimmtes Widget anhand des Parameters $id_base bestimmen, der als drittes Argument an den Hook übergeben wird. Es sollte so funktionieren:

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

Bei benutzerdefinierten Widgets müssen Sie diesen Filter auf den Titel des Widgets anwenden, bevor Sie ihn wiedergeben ( wie die Standard-Widgets ):

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