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

8

Ich habe einen Fall, in dem das viele Widgets in mehreren benutzerdefinierten Seitenleisten sind. Ich frage mich, ob es eine einfache Möglichkeit gibt, die Titel jedes 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 jedem Widget-Titel so etwas wie einen Meta-Feldwert pro Beitrag hinzufügen.

Die Logik wäre ungefähr so:

$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_titleFilter gibt, aber wie zielen Sie auf bestimmte Widgets ab?

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

Wyck
quelle

Antworten:

8

Sie können das verwenden widget_display_callback(ausgelöst, vorhersehbar kurz vor dem Anzeigen eines Widgets :)).

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 $widgetArgument ist ein Objekt Ihrer Widget-Klasse und $widget->id_baseenthält daher die ID für Ihr Widget (wenn Sie auf eine bestimmte Widget-Klasse abzielen).

Stephen Harris
quelle
7

Sie können Ihren eigenen Haken zum widget_titleHandeln verwenden. Sie können ein bestimmtes Widget anhand eines $id_baseParameters 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 in den Standard-Widgets gezeigt ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);
Eugene Manuilov
quelle
1
+1 eine nette Antwort - aber es erfordert das Widget, um den widget_titleFilter anzuwenden .
Stephen Harris
Wo Sie dies mit den Standard-Links testen können, kann ich es nicht zum Laufen bringen, vielleicht weil das fehlt widget_title?
Wyck