การส่งผ่านตัวแปรผ่าน locate_template


50

ในขณะที่ฉันมักจะใช้includeหรือเป็นrequireของตัวเองเพื่อบันทึกการบำรุงรักษาโค้ดระยะยาวฉันเริ่มใช้งานget_template_partและการlocate_templateใช้เวิร์ดเพรสในตัวเป็นสิ่งที่ดีที่สุดเสมอ

คำถามของฉันคือคุณควรจะสามารถส่งผ่านตัวแปรไปยังผลลัพธ์ของอย่างใดอย่างหนึ่งget_template_partหรือlocate_template?

<?php
$var = get_option( 'my-custom-option' );

get_template_part( 'custom-template-part' );
?>

ในโค้ดด้านบน$varจะถูกพิมพ์ภายในเทมเพลตที่กำหนดเอง แต่ตัวแปรดูเหมือนจะไม่ทำงาน ฉันทำอะไรบางอย่างขาดหายไปหรือพฤติกรรมนี้เป็นสิ่งที่คาดหวัง

ฉันพบว่าพวกเขาไม่ผ่านในตัวอย่างด้านบนหรือเมื่อใช้ locate_template

<?php
locate_template( 'custom-template-part.php', true );
?>

คำตอบ:


62

เช่นเดียวกับMathSmath เขียน , get_template ()ไม่สนับสนุนการกลับมาใช้ตัวแปรของคุณ

แต่loc_Template () infact ไม่รวมอยู่เลย มันตั้งอยู่ไฟล์สำหรับการรวม

ดังนั้นคุณสามารถใช้การรวมเพื่อให้ทำงานเช่นเดียวกับที่คุณคาดหวัง:

include(locate_template('custom-template-part.php'));

$var จากตัวอย่างของคุณสามารถใช้ในส่วนเทมเพลตแล้ว

คำถามที่เกี่ยวข้องกับคำอธิบายทางเทคนิคเพิ่มเติมเกี่ยวกับขอบเขตตัวแปรและ get_template (): ข้อผิดพลาดในการส่งแบบฟอร์มด้วย get_template_part ()


โทรดีมาก ฉันไม่ได้สังเกตว่า loc_template () มี param ที่ให้คุณเลือกที่จะเรียก load_template () พร้อมผลลัพธ์ (ซึ่ง get_template_part ทำ) หรือส่งคืน ฉันวนลูปในโครงการปัจจุบันเพื่ออัปเดตรหัสโดยใช้วิธีนี้ ... ขอบคุณ!
MathSmath

ไม่นานหลังจากที่ฉันโพสต์ที่นี่ฉันลงเอยด้วยวิธีการเดียวกัน
curtismchale

21676พูดถึงสิ่งนี้ แต่ดูเหมือนว่าจะไม่เกิดขึ้น
Ian Dunn

อาจไม่ถูกต้อง แต่: locate_template()infact ทำการรวมหากพารามิเตอร์ถูกตั้งค่าเป็นtrue-as ในคำถาม (ค่าเริ่มต้นคือfalseอย่าวางเวอร์ชันของคำถามลงในคำตอบที่ยอมรับ) คุณสามารถใช้set_query_var('var', $var);และใช้งานได้get_template_part()ตามปกติ จากนั้นคุณยังสามารถใช้ตัวแปร Worpdress เริ่มต้นที่สามารถเข้าถึงได้ภายใน templatefile ตามที่ @MathSmath พูดถึง
Jonas Lundman

13

วิธีแก้ปัญหาที่เป็นระเบียบที่พบในcodex

ดังนั้นหากคุณวนลูปผ่านโพสต์ที่กำหนดเองคุณสามารถทำได้:

foreach ($custom_posts as $custom_post) {
    set_query_var( 'my_post', $custom_post );
    get_template_part( 'content', 'part' );
}

$my_postและในแม่แบบที่ตัวเองคุณจะได้รับ


นี่จะเป็นคำตอบที่ถูกต้องหากโค้ดตัวอย่างตอบคำถาม (ตัวเลือกการผ่านไม่ใช่โพสต์ในอาร์เรย์ที่สมบูรณ์)
Jonas Lundman

มันทำงานได้อย่างสวยงามเพื่อส่งข้อมูลเพิ่มเติมไปยังเทมเพลตที่รวมไว้ มันยังใช้งานได้wc_get_template_partใน WooCommerce ซึ่งไม่ต้องสงสัยเลยว่าจะขยาย WP เริ่มต้น
nabrown

8

ฉันมีปัญหากับเรื่องนี้ด้วย (ในขณะที่พยายามรับคิวรีแบบกำหนดเองเพื่อทำงานกับส่วนเทมเพลต) คำตอบสั้น ๆ คือ: ไม่มีส่วนเทมเพลตจะไม่รับค่า vars ที่กำหนดเองโดยอัตโนมัติตามวิธีการรวมปกติ

ทั้ง get_template_part () และ locate_template () ในที่สุดก็ใช้ฟังก์ชั่น load_template () เพื่อโหลดไฟล์จริง (ใช้ต้องการ) ฟังก์ชั่นนี้ทำให้เป็นโกลบอล vars ต่อไปนี้:

$ โพสต์, $ โพสต์, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ comment, $ user_ID

อย่างไรก็ตามไม่มี vars อื่น ๆ ที่ปรากฏอยู่ในส่วนแม่แบบ ฉันเดาว่าเนื่องจากความต้องการที่แท้จริงถูกห่อในฟังก์ชั่นการเปลี่ยนแปลงขอบเขตหรืออะไร?

อย่างไรก็ตามฉันจะลองใช้ vars เพิ่มเติมอื่น ๆ ที่คุณต้องการผ่านการเรียกจากส่วนกลางเหล่านั้นจากส่วนแม่แบบของคุณ


4

เพียงสองเซ็นต์ของฉันสำหรับการอ้างอิงในอนาคตวิธีแก้ปัญหาอย่างน้อยใน Wordpress 3.5 $wp_query->query_varsคือการเพิ่มตัวแปร

ผมจำเป็นต้องมีโลกของฉัน_vk_errorsภายในส่วนแม่แบบและก็ไม่ได้ก่อนที่จะเรียก$wp_query->query_vars['_vk_errors'] = $_vk_errors;get_template_part()


2

มีฟังก์ชั่นการแก้ปัญหาตัวแปรแบบง่ายของฉัน มันทำสิ่งเดียวกับที่ Wordpress get_template_part()ใช้งาน เพียงแค่คัดลอกและวางไปที่function.php

function getTemplatePart($slug = null, $name = null, array $params = array()) {
    global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;

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

    $templates[] = "{$slug}.php";

    $_template_file = locate_template($templates, false, false);

    if (is_array($wp_query->query_vars)) {
        extract($wp_query->query_vars, EXTR_SKIP);
    }
    extract($params, EXTR_SKIP);

    require($_template_file);
}

ตัวอย่างการใช้งานในเทมเพลต

$params = array(
    'utm_source' => 'footer'
);
while ($posts->have_posts()) {
    $posts->the_post(); 
    getTemplatePart('content', 'heighlight', $params);
}

ในcontent-heighlight.phpตัวแปรสามารถเข้าถึงได้ที่มีชื่อ$utm_sourceและความคุ้มค่าfooter


ฟังก์ชั่นที่น่าสนใจ globals และแบบสอบถาม vars ทั้งหมดสามารถเข้าถึงได้ในไฟล์เทมเพลตปกติหรือไม่
คริสเตียน

0

คุณสามารถห่อ get_template_part เก็บวัตถุโมเดลไว้ในโกลบอลวาร์และล้างมันในภายหลัง นี่คือวิธีที่เราทำในโครงการของเรา:

functions.php

$model = null; // this is a global variable 
function my_get_template_part($slug, $name = null, $templateModel = null) {
    global $model;
    $model = $templateModel; // set the global var to the provided model object
    get_template_part($slug,$name); 
    $model = null; // clear the global var
}

function get_model() {
    global $model;
    return $model;
}

การใช้งานในเทมเพลตหลัก:

<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>

การเข้าถึงโมเดลที่มีให้ในเท็มเพลต - ส่วน:

<?php $model = get_model() ?>

ด้วยวิธีนี้คุณไม่จำเป็นต้องคัดลอกและวางฟังก์ชั่น get_template_part ดั้งเดิมไปยังฟังก์ชันของคุณเองในกรณีที่การพัฒนาอาจเปลี่ยนแปลงในภายหลังโดยนักพัฒนา WP

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