Apakah ada cara untuk mengubah judul widget secara dinamis?

8

Saya punya kasus di mana ada banyak widget di beberapa sidebar khusus. Saya bertanya-tanya apakah ada cara sederhana untuk mengubah judul masing-masing widget secara dinamis. Biasanya widget memiliki bidang judul yang dapat Anda atur secara manual atau di plugin itu sendiri.

Saya ingin menambahkan sesuatu seperti nilai bidang meta per posting ke setiap judul widget.

Logikanya akan menjadi seperti:

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

Saya tahu ada widget_titlefilter tetapi bagaimana Anda menargetkan widget tertentu?

ps. Saya tidak dapat menggunakan register_sidebarparameter reguler karena memiliki banyak widget yang membutuhkan judul tertentu.

Wyck
sumber

Jawaban:

8

Anda dapat menggunakan widget_display_callback(dipecat, dapat diprediksi, sesaat sebelum menampilkan 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;
}

The $widgetargumen adalah sebuah objek dari kelas widget Anda, dan $widget->id_baseakan berisi ID untuk widget Anda (jika menargetkan kelas widget tertentu).

Stephen Harris
sumber
7

Anda dapat menggunakan kait Anda sendiri untuk widget_titlebertindak. Anda dapat menentukan widget spesifik berdasarkan $id_baseparameter yang diteruskan sebagai argumen ketiga ke hook. Seharusnya berfungsi seperti ini:

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

Untuk widget khusus, Anda harus menerapkan filter ini pada judul widget sebelum menggemakannya ( seperti yang ditunjukkan widget default ):

$title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base);
Eugene Manuilov
sumber
1
Memberi +1 pada jawaban yang rapi - tetapi membutuhkan widget untuk menerapkan widget_titlefilter.
Stephen Harris
Di mana Anda dapat menguji ini dengan 'tautan' default, saya tidak dapat membuatnya berfungsi, mungkin karena tidak ada widget_title?
Wyck