Custom Post Types และ template_redirect


9

ฉันมีโพสต์ที่กำหนดเองสองประเภท (เช่น post_type_1 และ post_type_2) ที่ฉันต้องการเปลี่ยนเส้นทางไปยังเทมเพลตอิสระ (single-post_type_1.php และ single-post_type_2.php) เพื่อจัดการการแสดงผลของพวกเขา ฉันไม่ต้องการใส่เทมเพลตการแสดงผลในโฟลเดอร์ชุดรูปแบบเพราะฉันต้องการให้พวกเขามีอยู่ในโฟลเดอร์ปลั๊กอินที่เกี่ยวข้อง

ฉันจะให้แต่ละคนลงทะเบียน template_redirect hook ได้อย่างไรโดยไม่กระทบกับคนอื่น ๆ ? หรือฉันควรใช้เทคนิคอื่น

ขณะนี้ฉันกำลังทำสิ่งนี้ในปลั๊กอิน 1:

add_action( 'template_redirect', 'template_redirect_1' );
function template_redirect_1() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

และสิ่งนี้ในปลั๊กอิน 2:

add_action( 'template_redirect', 'template_redirect_2' );
function template_redirect_2() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

เมื่อฉันลงทะเบียน hook_ แม่แบบ template_redirect ของปลั๊กอิน 2 ปลั๊กอิน 1 จะไม่ทำงานอีกต่อไป

ฉันพลาดอะไรไปรึเปล่า?

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

คำตอบ:


13

คุณควรใช้ตัวกรอง template_include สำหรับสิ่งนี้:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirectเป็นการดำเนินการที่เรียกใช้โดยตรงก่อนที่จะส่งส่วนหัวสำหรับเอาต์พุตของเทมเพลตที่แสดงผล เป็นตะขอที่สะดวกในการเปลี่ยนเส้นทาง 404 ฯลฯ ... แต่ไม่ควรใช้สำหรับรวมเส้นทางแม่แบบอื่น ๆ เนื่องจาก WordPress ทำสิ่งนี้โดยกำเนิดด้วยตัวกรอง 'template_include'

template_includeและsingle_templatehooks จะจัดการเฉพาะกับเส้นทางของเทมเพลตที่ใช้สำหรับการแสดงผลเนื้อหา นี่เป็นสถานที่ที่เหมาะสมในการปรับเปลี่ยนเส้นทางแม่แบบ

อัปเดตจากความคิดเห็นโดย @ChipBennett:

single_templateถูกลบออกจาก 3.4 ใช้ {posttype} _template แทน


ดังนั้นมันใช้งานได้ แต่มันกลับกลายเป็น template_redirect และ single_template ก็ทำงานเช่นกัน ปัญหาที่แท้จริงที่ฉันพบคือฉันมีฟังก์ชั่นการเรียงลำดับคอลัมน์ผู้ดูแลระบบที่กำหนดเองลงในตัวกรอง 'คำขอ' และฉันไม่ได้ จำกัด การเปลี่ยนแปลงของตัวแปร $ vars เฉพาะเมื่อชนิดโพสต์เป็นประเภทที่แน่นอน แต่ฉันดีใจที่รู้เกี่ยวกับ template_include hook ยังไม่แน่ใจว่าความแตกต่างระหว่าง template_redirect, template_include และ single_template เป็นอย่างไร
Anderly

@ ตอบอย่างฉับพลันฉันปรับปรุงคำตอบของฉัน หวังว่านี่จะช่วยได้
Brian Fegter

แล้วประมาณ single_template ล่ะ? ลิงค์นี้ ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) กล่าวว่าสามารถใช้เพื่อปรับเทมเพลตสำหรับโพสต์หรือเพจเมื่อเรียกเทมเพลตเดียว นี่คือสิ่งที่ฉันพยายามจะทำ ไม่ว่าในกรณีใดการใช้ตัวกรอง template_include หรือ single_template จะทำงานและดูเหมือนจะทำสิ่งเดียวกันให้สำเร็จ
anderly

1
single_template ทำงานในลักษณะเดียวกันยกเว้นเรียกว่าแบบมีเงื่อนไข สิ่งนี้ช่วยในการแยกการเปลี่ยนเส้นทางแทนที่จะใช้ตัวกรองแฮมเมอร์ในเว็บไซต์
Brian Fegter

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