เป็นไปได้ที่จะแทนที่ผลลัพธ์ของ get_template_part ()?


11

ฉันกำลังทำงานกับธีมลูกฉันไม่ต้องการแทนที่ไฟล์เทมเพลตหลักเพื่อรักษาความเรียบง่ายของธีมลูกรวมทั้งลดจำนวนรหัสและการบำรุงรักษาเมื่อเวลาผ่านไป

ในลูปเท็มเพลต index.php ในธีมพาเรนต์ใช้: get_template_part( 'content' );

ซึ่งจะนำมาในcontent.phpฉันต้องการให้มันมีลักษณะเหมือนget_template_part( 'content', get_post_format() );หรือคล้ายกันมากขึ้นเพื่อที่จะนำเทมเพลตต่างๆเช่นcontent-apart.phpเป็นต้นโดยไม่ต้องสร้างindex.phpในธีมลูกเพื่อเขียนทับ ผู้ปกครองสำหรับการเปลี่ยนแปลงบรรทัดเดียว

get_template_part() ประกอบด้วย:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

จึงมีการดำเนินการในกรณีของฉันที่เรียกว่า get_template_part_content

ฉันขอเชื่อมโยงการกระทำกับสิ่งที่ชอบ:

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

เห็นได้ชัดว่าส่งผลให้เกิดการโพสต์ซ้ำหนึ่งจากฟังก์ชั่นติดยาเสพติดของฉันซึ่งสามารถแสดงแม่แบบที่ต้องการและอื่น ๆ จากการlocate_templateโทรปกติในget_template_part()

ฉันมีปัญหาในการหาวิธีที่จะทำสิ่งนี้ให้สำเร็จโดยไม่ต้องทำซ้ำหรือไม่แสดงหน้าจบหลังจากที่ให้บริการส่วนเทมเพลตของฉันด้วยการทำสิ่งที่โง่เช่น a breakหรือexit


ตรวจสอบโพสต์นี้
Pieter Goosen

3
ยินดีต้อนรับสู่ชีวิตที่ไม่มีความสุขโดยไม่มีการสืบทอดเทมเพลต :)
Rarst

คำตอบ:


3

ไม่มีตะขอในการทำเช่นนี้ คัดลอก index.php ไปยังธีมลูกและทำการเปลี่ยนแปลงบรรทัดเดียว นอกจากนี้ให้บอกผู้แต่งชุดรูปแบบของผู้ปกครองว่าพวกเขาควรทำการเปลี่ยนแปลงในชุดรูปแบบเดียวกันเพื่อความยืดหยุ่น


นี่เป็นเรื่องเท็จในขณะนี้ดู @ t-toudua ตอบที่นี่
Ivan Castellanos

คำตอบของเขาไม่ใช่วิธีแก้ปัญหาเนื่องจากส่วนแม่แบบยังคงโหลดและรวม เบ็ดการกระทำไม่สามารถแทนที่
อ็อตโต

จริง แต่คุณสามารถใช้ob_startภายในมันและob_endตะขอในภายหลังเพื่อดำเนินการ แต่ไม่เคยสะท้อนซึ่งมักจะดีพอ หรือคุณสามารถใช้ exit () เพื่อบังคับให้ยุติ PHP (หลังจากที่คุณเพิ่มทุกอย่างที่ยังคงหายไป: ส่วนท้าย, ฯลฯ )
Ivan Castellanos

และนั่นก็ยังไม่เป็นทางออก การระงับเอาต์พุตไม่เหมือนกับการเอาชนะสิ่งต่าง ๆ
อ็อตโต

การออกไม่ได้ยับยั้งเอาต์พุต มันหยุดการทำงานอย่างมีประสิทธิภาพ ณ จุดนั้น
Ivan Castellanos

6

ฉันคิดว่ามันเป็นไปไม่ได้อย่างที่คุณต้องการจะบรรลุ เป็นเรื่องน่ารำคาญจริงๆที่ไม่ได้รับตัวกรองเพื่อเปลี่ยนชื่อไฟล์เทมเพลต :(

ฉันมีวิธีแก้ปัญหามัน ให้ใช้content.phpสำหรับการเปรียบเทียบ

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

ฉันไม่ได้ใช้อาร์กิวเมนต์ที่สองของget_template_partฟังก์ชั่น แต่ฉันผ่านคำต่อท้ายในอาร์กิวเมนต์แรกเพื่อหลีกเลี่ยงการเรียก infinitive ในcontent.phpไฟล์ถ้าไม่มี'content-'. $formatไฟล์


ฉันคิดว่านี่เป็นวิธีที่ดีในการทำเช่นนั้น ไม่แน่ใจว่าทำไมมันไม่ได้รับการยอมรับ :)
Anh Tran

ชื่อเสียงอาจจะ :)
Shazzad

ขอโทษ @Shazzad ฉันให้คำตอบของคุณว่า upvote เพราะมันฉลาดมาก :) ถ้าฉันสามารถยอมรับสองฉันจะ
TomHarrigan

3

มีวิธีแก้ไข :

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

แต่คิดให้ดีซึ่งตะขอที่คุณควรแทรกการกระทำนั้น ... เพื่อให้ได้ตำแหน่งการใช้เช่น locate_template('content-header.php', false);


0

ถ้าคุณต้องการดึงไฟล์ชื่อ content-apart.php คุณเรียกใช้ฟังก์ชันดังนี้:

get_template_part( 'content', 'aside' );

พารามิเตอร์ที่สองคือชื่อของตัวกรองหลังจากเครื่องหมายขีดกลาง หากไฟล์ของคุณอยู่ในไดเรกทอรีย่อย (template / content-apart.php):

get_template_part( 'templates/content', 'aside' );

นั่นคือสิ่งที่คุณต้องการทำใช่ไหม


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