เปลี่ยน the_title () ของหน้าเว็บแบบไดนามิก


9

ฉันกำลังพัฒนาปลั๊กอินที่ไม่ได้ใช้ประเภทโพสต์ที่กำหนดเอง แต่แยกตารางฐานข้อมูล เป็นปลั๊กอินที่แสดงรายการของหลักสูตรที่มีลิงก์ที่นำไปสู่หน้ารายละเอียดหลักสูตรที่แตกต่างกันซึ่งผู้ใช้สามารถสมัครเรียนหลักสูตรได้

ในสถานะปัจจุบันฉันใช้รหัสย่อเพื่อดึงข้อมูลปลั๊กอินลงในหน้าด้วยเทมเพลตหน้าแบบกำหนดเอง (page-courses.php)

ตอนนี้ฉันต้องการเปลี่ยนthe_title()แบบไดนามิกตามหน้าเว็บที่ปลั๊กอินแสดง (รายการหลักสูตรหน้ารายละเอียดหลักสูตรพร้อมแบบฟอร์มหน้าส่งแบบฟอร์มสำเร็จ) แต่เมื่อใดก็ตามที่ฉันทำอย่างนั้นกับตัวกรองต่อไปนี้ลิงก์ไปยังหน้าอื่น ๆ ในส่วนท้ายก็เปลี่ยนไปเช่นกัน:

<?php

add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Custom Title';
}

แก้ไข

ใน footer.php ฉันมีฟังก์ชั่นที่มีลิงค์ส่วนท้ายด้วยwp_nav_menu()ดังนั้นฉันจึงสามารถกำหนดได้ในลักษณะ> เมนู แต่ด้วยตัวกรองด้านบนลิงก์ทั้งหมดในส่วนท้ายก็เปลี่ยนเป็น 'ชื่อที่กำหนดเอง' แต่ฉันต้องการเปลี่ยนชื่อของหน้าไม่ส่งผลต่อลิงก์เมนูในส่วนท้าย

การพยายามเพิ่มแท็กแบบมีเงื่อนไขin_the_loop()ลิงก์ส่วนท้ายยังคงได้รับผลกระทบแม้ว่าจะไม่ได้อยู่ในลูปก็ตาม

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    if ( in_the_loop() ) {
        add_filter( 'the_title', 'custom_page_title' );
    }
}

function custom_page_title() {
    return 'Custom Title';
}

คล้ายกับคำถามนี้: กรอง the_title ปัญหาใน navเพียงว่าลิงก์ที่ได้รับผลกระทบอยู่ในส่วนท้ายและin_the_loop()ไม่ทำงาน

ฉันฉันจะเปลี่ยนthe_title()ในขณะที่เพียงส่งผลกระทบต่อชื่อของหน้าปัจจุบันการแสดงไม่ได้มีผลกระทบต่อการเชื่อมโยงในส่วนท้าย ?

แก้ไข 2 - โซลูชัน

ในที่สุดฉันก็ทำให้มันทำงาน:

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
}

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-listcourses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}

ไฟล์ page-listcourses.php เป็นเทมเพลตโพสต์ที่กำหนดเองที่ฉันกำหนดให้กับหน้าสแตติกชื่อ 'หลักสูตร'

ฉันคิดว่ามันใช้งานไม่ได้เพราะชื่อของหน้าสแตติกและชื่อไฟล์ของเทมเพลตโพสต์ที่กำหนดเองเหมือนกัน


1
ทำไมคุณกลิ้งตารางฐานข้อมูลของคุณเอง? ชีวิตของคุณจะง่ายมากถ้าคุณดำเนินการของคุณเนื้อหาที่กำหนดเองเป็นที่กำหนดเองประเภทโพสต์
Chip Bennett

จริง ๆ แล้วฉันคิดว่าคำถามนี้จะมา ฉันพัฒนาปลั๊กอินนี้เพื่อทำความรู้จักกับ Wordpress ดังนั้นก่อนอื่นฉันไม่รู้เกี่ยวกับประเภทโพสต์ที่กำหนดเอง ฉันมีตารางฐานข้อมูลสองตารางตารางหนึ่งสำหรับหลักสูตรและอีกหนึ่งตารางสำหรับประเภทหลักสูตร หมวดหมู่เดียวสามารถมีหลายหลักสูตรดังนั้นจึงมีการเชื่อมโยงสองตาราง ฉันไม่คิดว่าการทำโพสต์ประเภทกำหนดเองทำได้ง่าย ๆ แน่นอนว่าฉันสามารถใช้ Tax Taxies แบบกำหนดเองสำหรับหลักสูตรได้ แต่ฉันจะต้องเพิ่มฟิลด์เพิ่มเติมเนื่องจากหมวดหมู่หลักสูตรไม่เพียง แต่มีชื่อ เพียงแค่ตอนนี้มันง่ายมากที่จะทำกับตารางฐานข้อมูลที่กำหนดเอง
Gchtr

1
กรณีการใช้งานของคุณเป็นกรณีการใช้งานที่แน่นอนและตั้งใจไว้สำหรับประเภทโพสต์ที่กำหนดเองและ Taxonomies ที่กำหนดเอง คุณอาจเข้าใจผิดเกี่ยวกับความสง่างามความยืดหยุ่นและพลังของ CPT และอนุกรมวิธานที่กำหนดเอง
Chip Bennett

เป็นไปได้จริง ๆ ที่ฉันทำได้ ฉันน่าจะลอง ขอบคุณสำหรับคำแนะนำ.
Gchtr

in_the_loop()ถูกตั้งค่าเป็นtrueเมื่อใดก็ตามที่the_post()ถูกไล่ออก โดยไม่ต้องขุดลึกเกินไปในหลักและรู้ว่าเมนู nav เป็นตัวloopsผมคาดเดาบางที่ไปพร้อมกันwp_nav_menu()instantiates ห่วงก่อให้เกิดผลตอบแทนin_the_loop() true
Chip Bennett

คำตอบ:


5

ฉันจะใช้ตามis_page_template()เงื่อนไข:

if ( is_page_template( 'page-courses.php' ) ) {
    // The current page uses your
    // custom page template;
    // do something
}

แก้ไข

คุณจะใช้เงื่อนไขนี้ในการเรียกกลับตัวกรองของคุณ:

function wpse83525_filter_the_title( $title ) {
    if ( is_page_template( 'page-courses.php' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

ตอนนี้จะแยกเฉพาะชื่อของหน้าเว็บที่ใช้แม่แบบหน้าของคุณคุณสามารถใช้ประโยชน์จากพารามิเตอร์อื่น ๆ ที่ส่งผ่านไปยัง:the_title $idเนื่องจากคุณทราบรหัสของโพสต์ที่ชื่อถูกกรองคุณสามารถค้นหา_wp_page_templateโพสต์เมตาและตรวจสอบให้แน่ใจว่าเท่ากับเทมเพลตหน้าของคุณ:

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );

แก้ไข 2

หากคุณต้องการกำหนดเป้าหมายหน้า "หลักสูตร" โดยเฉพาะให้ใช้is_page()กับกระสุนหน้า'courses'หรือชื่อหน้าของ'Courses':

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Courses' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

แม้ว่าฉันจะแนะนำให้เปลี่ยนpage-courses.phpเป็นเทมเพลตของหน้าเว็บเองซึ่งจะทำให้กระบวนการทั้งหมดนี้แข็งแกร่งยิ่งขึ้น


นั่นไม่ได้ผลในตอนนี้ แต่ฉันกลั่นกรองคำถามของฉันเพราะอาจไม่เจาะจงพอ บางทีปัญหาอยู่ที่อื่น
Gchtr

คุณหมายความว่าอย่างไร " ที่ไม่ได้ผลในตอนนี้ " สิ่งที่ว่าคุณไม่ลอง? คุณคาดหวังว่าจะเกิดอะไรขึ้นนั่นไม่ใช่หรือเกิดอะไรขึ้นโดยไม่คาดคิด?
Chip Bennett

ดูคำตอบที่อัปเดตซึ่งควรระบุชื่อรายการเมนู nav
Chip Bennett

ฉันบอกว่าเพราะฉันคิดว่าคำตอบของคุณอาจเป็นคำตอบที่ถูก (ผลักไปในทิศทางที่ถูกต้อง) แต่ฉันอาจไม่ได้ถามคำถามที่ชัดเจน get_post_meta( $id, '_wp_page_template', true )ผลตอบแทนdefaultและฉันไม่รู้จะทำอย่างไรกับสิ่งนี้ เมื่อฉันตั้งค่า 'page-courses.php' เป็น 'ค่าเริ่มต้น' การเชื่อมโยง nav ทั้งหมดจะเปลี่ยนไปยกเว้นเมื่อฉันขอthe_titleตัวกรองloop_startจากนั้นเฉพาะการเชื่อมโยงส่วนท้ายเท่านั้น ฉันตรวจสอบไฟล์เทมเพลตที่ใช้และเป็น 'page-courses.php' และไม่ใช่ 'page.php' (ซึ่งฉันคิดว่าอาจเป็นไฟล์เริ่มต้น)
Gchtr

ดังนั้น "หลักสูตร" เป็นชื่อของหน้าคงที่ของคุณหรือไม่
Chip Bennett

1

หากคุณต้องการแก้ไขชื่อหน้าปัจจุบันให้ใช้in_the_loop()เงื่อนไขดังเช่นใน:

add_filter( 'the_title', 'modify_onpage_title', 10, 2);

function modify_onpage_title( $title , $id = null ) {

    if(!in_the_loop()){
        // returns early if not relevant (as in custom menu loops)
        return $title;
    }

    // Tweak your title
    $title = "Yolo! ". $title;
    return $title;
}


0

ในขณะที่ใช้is_page_template()งานได้ฉันต้องการวางโค้ดประเภทนี้ลงในเทมเพลตของเพจเพื่อให้ได้รหัสทั้งหมดที่สร้างเพจประเภทนี้ในไฟล์เดียว


1
มันจะทำงานอย่างไรภายใต้สมมติฐานที่ว่ารหัสที่เป็นปัญหาใช้the_title()? ตัวอย่างรหัส?
Chip Bennett

@ChipBennett ฉันไม่เข้าใจคำถาม get_header()หากเขาต้องการตัวกรองเพื่อนำมาใช้เฉพาะสำหรับหน้าเว็บที่มีแม่แบบที่เฉพาะเจาะจงแล้วเขาสามารถวางรหัสเดียวกันในแม่แบบก่อนที่จะเรียก
Mark Kaplun

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