ปัญหาเกี่ยวกับ title-tag และ document_title_parts


12

Wordpress version 4.5.1

ฉันพยายามอัปเดตชื่อหน้าเว็บในเทมเพลตเฉพาะ หลังจากที่จำนวนมากของการขุดและการเรียนรู้เกี่ยวกับการเปลี่ยนแปลงที่ฉันพยายามที่จะใช้wp_title() document_title_partsอย่างไรก็ตามฉันไม่สามารถเรียกใช้ตัวกรองได้เลย

ฉันอยู่ในชุดรูปแบบของเด็ก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 );

ฉันลองทั้งสองรูปแบบของการเพิ่มการสนับสนุนชุดรูปแบบตามที่แสดงด้านบน แต่ดูบันทึกของฉันไม่มีอะไรปรากฏบนหน้าโหลดซ้ำ ที่error_logทำงานกับฟังก์ชั่นอื่น ๆ (เช่นwp_title) ดังนั้นการบันทึกข้อผิดพลาดจึงใช้งานได้

ฉันได้ลองpre_get_document_titleแล้วเช่นกันซึ่งใช้งานในการโหลดหน้าเว็บ แต่ฉันไม่สามารถเปลี่ยนชื่อได้

ดังนั้น! ฉันกำลังใช้ตัวกรองไม่ถูกต้องไม่ได้ตั้งค่าชุดรูปแบบของฉันอย่างถูกต้องหรืออย่างอื่นที่ฉันไม่ทราบ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!

แก้ไขเพื่อเพิ่มรายละเอียดเพิ่มเติม

กำลังพยายามฟังก์ชั่น init แต่ไม่ได้ผล: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

นอกจากนี้ในขณะที่ฉันลบการอ้างอิงใด ๆ ออก<title>จากheader.phpชื่อไซต์จริงยังคงปรากฏในแหล่งที่มา


ทำไมคุณไม่ออกความเห็นบรรทัดนี้//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? เป็นการใช้งานที่ถูกต้องของการเพิ่มการสนับสนุนชุดรูปแบบ
Sumit

@Sumit ฉันลองทั้งคอมเม้นท์และคอมเม้นท์แล้ว
hookedonwinter

อาจลองเพิ่มadd_theme_support()ฟังก์ชันในเบ็ดเริ่มต้น อีกสิ่งหนึ่งคือให้แน่ใจว่าคุณเขียนทับheader.phpไฟล์ของคุณเพื่อไม่มี<title>แท็กhtml
Howdy_McGee

@Howdy_McGee เพียงแค่พยายามก็ยังคงไม่มีอะไร gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter

@hookedonwinter และคุณแน่ใจหรือว่าไม่มี<title>แท็กในของคุณheader.php? อาจจะลองเปลี่ยนด้วย10 PHP_MAX_INTนอกจากนี้พารามิเตอร์ที่ส่งผ่านเป็นอาร์เรย์แทนค่าสตริง
Howdy_McGee

คำตอบ:


13

ฉันใช้ตัวกรองของคุณในพื้นที่พัฒนาของฉัน มันไม่ทำงาน จากนั้นฉันปิดปลั๊กอินของ Yoast SEO ซึ่งฉันรู้ว่ามันยุ่งกับชื่อหน้า จากนั้นก็ใช้งานได้ ดังนั้นข้อเสนอแนะของฉันจะเป็นปลั๊กอินอื่นกำลังยุ่งอยู่กับมัน

ในกรณีของ Yoast เป็นการเรียกตัวกรองเพื่อpre_get_document_titleคืนค่าว่างเปล่า ในกรณีwp_get_document_titleนั้นจะลัดวงจรและส่วนที่เหลือของฟังก์ชั่นรวมถึงdocuments_title_partsตัวกรองไม่ได้รับการประเมินตามที่คุณเห็นจากบรรทัดแรกของรหัส:

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

pre_get_document_titleดังนั้นผมเอาตัวกรองของคุณและเปลี่ยนเบ็ดไป มันไม่ทำงาน จากนั้นฉันเปลี่ยนลำดับความสำคัญเป็นระดับที่สูงกว่าตัวกรองเดียวกันใน Yoast จากนั้นก็ใช้งานได้ ดังนั้นฉันไม่รู้เกี่ยวกับการตั้งค่าของคุณ แต่ฉันขอแนะนำให้คุณลองทำสิ่งนี้:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );

1
คุณเข้าใจแล้ว! ฉันพบสิ่งเดียวกันและปิดใช้งาน Yoast ฉันเพิ่งเปิดใช้งานใหม่และใช้ความสำคัญของคุณและได้ผล ขอขอบคุณ!
hookedonwinter

เพิ่มเติมเกี่ยวกับ hooks ที่นี่: wordpress.stackexchange.com/questions/109869/…
cjbj

จากเว็บไซต์ของฉันpre_get_document_titleลำดับความสำคัญ15ก็เพียงพอแล้ว
ve

7

หลังจากการทดลองบางอย่างฉันได้รับคำแนะนำต่อไปนี้: เป็นไปได้ไหมว่า<title>แท็กนั้นเป็น "ฮาร์ดโค้ด" ภายในธีมหลักของheader.phpคุณ หากเป็นกรณีนี้คุณสามารถลองลบ<title>แท็กออกจากธีมลูกของคุณheader.php(คัดลอกพาเรนต์ของคุณheader.phpไปยังโฟลเดอร์ธีมลูกของคุณ) จากนั้นเพิ่มการสนับสนุนธีมกลับผ่านfunctions.php:

add_theme_support( 'title-tag' );

ฉันจะพยายามอธิบายสิ่งที่นำฉันไปสู่คำแนะนำนี้: ฉันพยายามตามที่คุณและคนอื่น ๆ แนะนำ - แต่ปรากฎว่าฉันพบสอง<title>แท็กในซอร์สโค้ด คนแรกที่มีชื่อมาตรฐานที่สองหนึ่งชื่อการปรับเปลี่ยน แต่ (แน่นอน) ในแถบชื่อเบราว์เซอร์ฉันเห็นเฉพาะชื่อเริ่มต้นเท่านั้น

จากนั้นฉันจะตรวจสอบheader.phpชุดรูปแบบของผู้ปกครองที่ฉันใช้ (ยี่สิบสี่) และ<title>แท็กถูกเข้ารหัสอย่างหนักภายในแม่แบบนั้น:

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

หลังจากฉันลบออกฉันเพิ่มรหัสต่อไปนี้ลงในธีมลูกfunctions.phpและทำงานได้:

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

ดังนั้นโดยทั่วไปแล้วจะใช้งานได้ก่อนที่จะลบ<title>แท็กออกจากเทมเพลต - เฉพาะเมื่อมีแท็กสอง <title>แท็กที่แท็กนั้นถูกละเว้นในภายหลัง นี่อาจเป็นปัญหาเดียวกันกับธีมของคุณหรือไม่?

ตั้งแต่ wp 4.4.0 อย่างไรก็ตาม<title>แท็กจะถูกสร้างขึ้นแบบไดนามิกโดยฟังก์ชั่น_wp_render_title_tag()ซึ่งโดยทั่วไปเรียกใช้ฟังก์ชันอื่นwp_get_document_title()และล้อมรอบแท็ก html รอบผลลัพธ์ เรื่องสั้น ๆ สั้น ๆ : หากธีมของคุณheader.phpไม่มี<title>แท็กโอกาสที่คุณจะสามารถแทนที่ชื่อเรื่องได้โดยตรงpre_get_document_titleหรือdocument_title_partsตามที่อธิบายไว้ที่นี่ :

1) เปลี่ยนชื่อโดยตรง:

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

2) การกรองส่วนชื่อ:

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

3

เมื่ออ่านโพสต์ของคุณจากบนลงล่าง botom และจากล่างขึ้นบนคุณมีความน่าจะเป็นของตัวกรองทั้งหมดที่ส่งผ่านชื่อเรื่องผ่านpre_get_document_titleตัวกรอง เงื่อนงำที่นี่คำสั่งต่อไปนี้:

ฉันได้ลองpre_get_document_titleแล้วเช่นกันซึ่งทำหน้าที่โหลดหน้าเว็บ

ดูที่soure codewp_get_document_title()เราจะเห็นโค้ดต่อไปนี้:

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

สิ่งนี้หมายความว่าเมื่อใดก็ตามที่ค่าที่ไม่ว่างเปล่าถูกส่งผ่านpre_get_document_titleตัวกรองwp_get_document_title()ฟังก์ชันจะส่งคืนค่าใดก็ตามที่ถูกส่งผ่านpre_get_document_titleตัวกรอง ในกรณีนี้document_title_separatorตัวกรองและdocument_title_partsตัวกรองจะไม่ถูกดำเนินการเนื่องจากจะทำงานหลังจากpre_get_document_titleตัวกรองเท่านั้น

ดูสิ่งที่คุณพูดไปอีกเล็กน้อย:

... แม้ว่าฉันจะไม่สามารถเปลี่ยนชื่อจริงได้

คุณมีpre_get_document_titleตัวกรองที่มีสิทธิอำนาจซึ่งแทนที่อินสแตนซ์ของตัวกรองเดียวกันและเนื่องจากตัวกรองนี้ฟังก์ชันจะส่งคืนสิ่งที่ผ่านไปซึ่งทำให้document_title_partsตัวกรองของคุณไม่ถูกดำเนินการ

สิ่งที่คุณต้องทำคือใช้grepตัวแก้ไขอย่างใดอย่างหนึ่งแล้วค้นหาตัวกรองทั้งหมดในwp-contentโฟลเดอร์ของpre_get_document_titleคุณ เมื่อคุณพบว่าตัวกรองนั้นคุณสามารถนำตัวกรองนั้นไปที่นั่นเพื่อลบตัวกรองนั้นและแทนที่ด้วยตัวคุณเอง


ขอบคุณสำหรับคำตอบ! น่าเสียดายที่การค้นหา wp-content ทั้งหมดเพื่อค้นหาdocument_title_partsหรือแสดงpre_get_document_titleผลลัพธ์ 0 รายการ ฉันใช้ SublimeText 2 เพื่อค้นหาเนื้อหา wp ทั้งหมด ...
hookedonwinter

นี่มันเต้นฉันจริงๆ มันแปลกจริงๆที่ตัวกรองหนึ่งตัวในฟังก์ชั่นยิงอย่างถูกต้องและตัวกรองหลังจากนั้นก็ไม่ได้ ลองล้างแคชทั้งหมดและเริ่มต้น WordPress ใหม่ถ้าคุณแน่ใจว่าไม่ใช่ปลั๊กอินหรือธีมของคุณ เกิดอะไรขึ้นกับการติดตั้งวานิลลาด้วยธีมที่รวมมาจะเกิดอะไรขึ้นถ้าคุณเปลี่ยนธีมหลักโดยตรง น่าเสียดายที่ฉันสามารถช่วยเหลือข้อมูลที่ได้รับ หากคุณมีข้อมูลเพิ่มเติมใด ๆ ให้ยื่นการแก้ไขเพื่อให้เราสามารถช่วยคุณแก้ปัญหานี้ได้
Pieter Goosen

@PieterGoosen เมื่อตัวกรองแรกส่งคืนค่าที่ไม่ว่างเปล่าฟังก์ชันจะลัดวงจรและตัวกรองที่สองไม่ได้รับการประเมิน
cjbj

@cjbj ใช่ถูกต้องนั่นคือสิ่งที่ฉันพูดในคำตอบของฉันปัญหาคืออะไร ตามที่ OP กล่าวเขาไม่สามารถหาตัวกรองได้pre_get_document_titleสิ่งที่จะอธิบายได้อย่างสมบูรณ์ว่าทำไมตัวกรองตัวที่สองจึงไม่ยิง การทำเช่นนี้จะปล่อยให้pre_get_document_titleตัวกรองว่างเปล่าซึ่งหมายความว่าตัวกรองอีกสองตัวในฟังก์ชันจะต้องเริ่มทำงาน แต่จะไม่ทำงาน ทำให้ฉันต้องสรุปว่า Wordpress core ที่เสียหาย
Pieter Goosen

ยกเว้นว่าฉันมีตัวกรองนั้นให้ทำงานได้อย่างง่ายดาย
cjbj

2

หากธีมหลักไม่ประกาศการสนับสนุนtitle-tagคุณสามารถทำได้เช่นนี้ในธีมลูก

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

กรองdocument_title_partsอาเรย์ประเภทผลตอบแทนที่คาดหวังเช่นนี้อย่าลืมเปลี่ยนเงื่อนไข if ตามความต้องการของคุณหรือลบออกอย่างสมบูรณ์เพื่อเปลี่ยนชื่อเรื่องทั่วทั้งไซต์เพื่อทำการทดสอบว่าใช้ได้จริงหรือไม่

/**
 * 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' );

คุณลองฟังก์ชั่นทั้งสองนี้ได้ไหม


ขอบคุณสำหรับคำตอบ. ฉันลองแล้วลบคำสั่ง if เพื่อให้กว้างขึ้นและฉันเพิ่มการบันทึกข้อผิดพลาดเพื่อดูว่าเกิดอะไรขึ้น นี่คือรหัส . เพียงadd_theme_support_childถูกบันทึกไว้
hookedonwinter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.