Masalah dengan tag-judul dan document_title_parts

12

Wordpress version 4.5.1

Saya mencoba memperbarui judul halaman secara dinamis pada templat tertentu. Setelah banyak menggali dan mempelajari tentang wp_title()perubahan, saya mencoba menggunakannya document_title_parts. Namun, saya tidak bisa menjalankan filter sama sekali.

Aku di tema anak, functions.php:

add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });

add_filter( 'document_title_parts', function( $title )
{
    error_log('here');
    return $title;

}, 10, 1 );

Saya sudah mencoba kedua variasi penambahan dukungan tema seperti yang ditunjukkan di atas, tetapi menonton log saya, tidak ada yang muncul di halaman yang dimuat ulang. Itu error_logbekerja dengan fungsi-fungsi lain (seperti wp_title), sehingga logging kesalahan berfungsi.

Saya juga sudah mencoba pre_get_document_title, yang tidak bisa memuat halaman, meskipun saya tidak bisa mengubahnya untuk mengubah judul.

Begitu! Saya salah menggunakan filter, tidak mengatur tema saya dengan benar, atau sesuatu yang tidak saya sadari. Bantuan apa pun akan sangat dihargai!

edit untuk menambahkan lebih detail

Mencoba fungsi init, tetapi itu juga tidak berfungsi: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Selain itu, walaupun saya telah menghapus referensi apa pun <title>dari header.php, judul situs yang sebenarnya masih muncul di sumbernya.

musim dingin kait
sumber
Mengapa Anda mengomentari baris ini //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? Itu benar penggunaan menambahkan dukungan tema.
Sumit
@Sumit Saya mencoba versi komentar dan versi aktif.
hookedonwinter
Mungkin mencoba menambahkan add_theme_support()fungsi di hook init . Hal lain adalah memastikan bahwa Anda menimpa header.phpfile Anda agar tidak memiliki <title>tag html .
Howdy_McGee
@ Howdy_McGee Baru saja mencobanya, tetap saja tidak ada. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter
@hookedonwinter Dan Anda yakin tidak ada <title>tag di Anda header.php? Mungkin coba ganti 10dengan PHP_MAX_INT. Selain itu, parameter yang dikirimkan adalah array bukan nilai string.
Howdy_McGee

Jawaban:

13

Saya menjalankan filter Anda di area pengembangan saya. Itu tidak berhasil. Kemudian saya mematikan plugin SEO Yoast, yang saya tahu juga mengacaukan judul halaman. Lalu berhasil. Jadi saran saya adalah plugin lain yang mengacaukannya.

Dalam kasus Yoast, itu adalah panggilan filter untuk pre_get_document_titlemengembalikan non kosong. Dalam hal wp_get_document_titleini hubungan pendek dan fungsi lainnya, termasuk documents_title_partsfilter, tidak dievaluasi, seperti yang Anda lihat dari baris pertama kode:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
    }

Jadi, saya mengambil filter Anda dan mengganti pengaitnya pre_get_document_title. Itu tidak berhasil. Kemudian saya mengubah prioritas ke level yang lebih tinggi daripada filter yang sama di Yoast. Lalu berhasil. Jadi, saya tidak tahu tentang pengaturan Anda, tetapi saya sarankan Anda mencoba ini:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );
cjbj
sumber
1
Kamu mendapatkannya! Saya menemukan hal yang sama, dan menonaktifkan Yoast. Saya baru saja mengaktifkan kembali dan menggunakan prioritas Anda dan itu berhasil. TERIMA KASIH!
hookedonwinter
Lebih banyak tentang kait di sini: wordpress.stackexchange.com/questions/109869/…
cjbj
Dari situs saya, pre_get_document_titleprioritas 15 sudah cukup.
vee
7

Setelah beberapa percobaan saya menemukan saran berikut: mungkinkah, bahwa <title>tag itu "kode keras" di dalam tema orang tua Anda header.php? Jika demikian, Anda dapat mencoba menghapus <title>tag dari tema anak Anda header.php(salin orangtua header.phpAnda ke folder tema anak Anda) dan kemudian tambahkan dukungan tema kembali melalui functions.php:

add_theme_support( 'title-tag' );

Saya akan mencoba menjelaskan apa yang menuntun saya ke saran ini: Saya mencoba seperti yang Anda dan orang lain sarankan - tetapi ternyata saya menemukan dua <title>tag dalam kode sumber. Yang pertama memiliki judul standar , yang kedua adalah judul yang dimodifikasi . Tapi (tentu saja) di bar judul browser saya hanya bisa melihat judul default.

Saya kemudian memeriksa header.phptema induk yang saya gunakan (dua puluh empat belas) dan <title>tag itu memang kode keras di dalam template itu seperti ini:

<title><?php wp_title( '|', true, 'right' ); ?></title>

Setelah saya menghapusnya, saya menambahkan kode berikut ke tema anak functions.phpdan berhasil:

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {

    // change title parts here
    $title['title'] = 'My Title'; 
    $title['tagline'] = 'My fancy tagline'; // optional
    $title['site'] = 'example.org'; //optional

// }

return $title; 

}

add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );

Jadi itu pada dasarnya juga bekerja sebelum menghapus <title>tag dari template - hanya ada dua <title> tag yang kemudian diabaikan. Mungkinkah ini masalah yang sama dengan tema Anda?

Sejak wp 4.4.0 namun <title>tag dibuat secara dinamis oleh fungsi _wp_render_title_tag()yang pada dasarnya memanggil fungsi lain wp_get_document_title()dan membungkus tag html di sekitar hasilnya. Singkat cerita: jika tema Anda header.phptidak memiliki <title>tag, kemungkinan Anda dapat mengganti judul secara langsung pre_get_document_titleatau document_title_partsseperti yang dijelaskan di sini :

1) ubah judul secara langsung:

add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
    return 'The expected title';
}

2) memfilter bagian judul:

add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
    return array('a', 'b', 'c');
}
sampaiinberlin
sumber
3

Setelah membaca posting Anda dari atas ke bawah dan ke bawah ke atas, Anda mungkin memiliki semua filter yang meneruskan judul melalui pre_get_document_titlefilter. Petunjuk di sini adalah pernyataan berikut:

Saya juga sudah mencoba pre_get_document_title, yang tidak bisa memuat halaman,

Melihat kode sumberwp_get_document_title() , kita melihat kode berikut:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

Artinya, setiap kali nilai yang tidak kosong dilewatkan melalui pre_get_document_titlefilter, wp_get_document_title()fungsi akan mengembalikan nilai apa pun yang dilewatkan melalui pre_get_document_titlefilter. Jika demikian, document_title_separatorfilter dan document_title_partsfilter tidak akan pernah dijalankan karena ini hanya berjalan setelah pre_get_document_titlefilter.

Melihat apa yang Anda katakan sedikit lebih jauh tentang:

... meskipun saya tidak bisa mendapatkannya untuk benar-benar mengubah judul.

Anda pasti memiliki pre_get_document_titlefilter dengan otoritas yang menggantikan instance Anda dari filter yang sama, dan karena filter ini, fungsi mengembalikan apa pun yang diteruskan ke sana yang mengakibatkan document_title_partsfilter Anda tidak dieksekusi.

Yang perlu Anda lakukan adalah menggunakan salah satu grepatau editor yang baik dan mencari seluruh wp-contentfolder Anda untuk pre_get_document_titlefilter itu. Setelah Anda menemukan filter itu, Anda dapat mengambilnya dari sana untuk menghapus filter itu dan menggantinya dengan milik Anda

Pieter Goosen
sumber
Terima kasih atas jawabannya! Sayangnya, mencari semua konten wp untuk document_title_partsatau pre_get_document_titlemengembalikan 0 hasil. Saya menggunakan SublimeText 2 untuk mencari semua konten-wp ...
hookedonwinter
Ini benar-benar mengalahkan saya. Sungguh aneh bahwa satu filter dalam suatu fungsi menyala dengan benar dan setelah itu filter tidak. Coba bersihkan semua cache dan instal ulang WordPress jika Anda yakin itu bukan plugin atau tema Anda. Apa yang terjadi pada instalasi vanili dengan tema yang dibundel, apa yang terjadi jika Anda secara langsung mengubah tema induk. Sayangnya ini sejauh yang saya bisa membantu dengan info yang diberikan. Jika Anda memiliki info tambahan, ajukan pengeditan agar kami dapat membantu Anda menyelesaikan ini
Pieter Goosen
@PieterGoosen Ketika filter pertama mengembalikan non kosong, fungsinya dihubung singkat dan filter kedua tidak dievaluasi.
cjbj
@ cjbj ya, benar, itulah yang saya katakan dalam jawaban saya, masalahnya adalah apa. Seperti kata OP, dia tidak dapat menemukan filter aktif pre_get_document_title, apa yang akan menjelaskan mengapa filter kedua tidak akan menyala. Ini membiarkan pre_get_document_titlefilter kosong, yang berarti dua filter lain dalam fungsi harus diaktifkan, tetapi tidak. Itu membuat saya menyimpulkan inti Wordpress yang korup.
Pieter Goosen
Kecuali saya mendapatkan filter itu untuk bekerja dengan mudah.
cjbj
2

Jika tema induk tidak menyatakan dukungan untuk title-tagAnda dapat melakukannya seperti ini di tema anak

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );

Saring document_title_partsarray tipe pengembalian yang diharapkan, seperti ini, pastikan untuk mengubah kondisi if sesuai kebutuhan Anda, atau hapus sepenuhnya untuk mengubah judul di seluruh situs hanya untuk pengujian jika berfungsi.

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title['title'] - Page Title
 * $title['tagline'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is 'template-homepage.php'
    if ( is_page_template( 'template-homepage.php' ) ) {
        $title['title'] = 'Changed title for a template';
    }

    return $title;

}

add_filter( 'document_title_parts', 'change_title_for_a_template' );

Bisakah Anda mencoba dua fungsi ini?

Nikhil Chavan
sumber
Terima kasih atas jawabannya. Saya mencobanya, menghapus pernyataan if untuk membuatnya lebih luas, dan saya menambahkan beberapa kesalahan log untuk melihat ada apa. Ini kodenya. . Hanya add_theme_support_childdicatat.
hookedonwinter