Detect_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में कस्टम टेम्पलेट के अंदर मुद्रित किया जाएगा, लेकिन चर काम नहीं करता है। क्या मुझे कुछ याद आ रहा है या यह अपेक्षित व्यवहार है?

मैंने पाया है कि वे find_template का उपयोग करते समय ऊपर या उदाहरण में पास नहीं होते हैं

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

जवाबों:


62

जैसे MathSmath ने लिखा , get_template () आपके चर के पुन: उपयोग का समर्थन नहीं करता है।

लेकिन find_template () infact का कोई समावेश नहीं है। यह सिर्फ शामिल करने के लिए एक फ़ाइल का पता लगाता है।

तो अगर आप उपयोग की कर सकते हैं शामिल हैं इस काम कर रहा है, वैसे ही जैसे आप यह उम्मीद:

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

$var आपके उदाहरण से तब टेम्पलेट भाग में उपयोग किया जा सकता है।

चर दायरे और get_template () की अधिक तकनीकी व्याख्या के साथ संबंधित प्रश्न: get_template_part () के साथ त्रुटि सबमिट करना


अच्छा निर्णय। मैंने ध्यान नहीं दिया कि find_template () में एक परम है जो आपको वैकल्पिक रूप से load_template () परिणाम (जो get_template_part करता है) के साथ कॉल करता है, या बस उन्हें वापस कर देता है। मैं इस दृष्टिकोण का उपयोग करके कोड को अपडेट करने के लिए एक वर्तमान परियोजना पर वापस पा रहा हूँ ... धन्यवाद!
मैथ्समैथ

यहाँ पोस्ट करने के तुरंत बाद मैंने उसी विधि का उपयोग करके समाप्त कर दिया।
curtismchale

21676 इसे संबोधित करता है, लेकिन ऐसा नहीं लगता कि यह प्रतिबद्ध होगा।
इयान दून

हो सकता है कि मैं गलत लेकिन: locate_template()वास्तव में करता है, तो पैरामीटर के रूप में सेट किया गया है, शामिल किए जाने के trueसवाल में -as। (डिफ़ॉल्ट है false, इसलिए प्रश्नों के संस्करण को स्वीकृत उत्तर में पेस्ट न करें।) आप केवल set_query_var('var', $var);अपने get_template_part()सामान्य के रूप में उपयोग और उपयोग कर सकते हैं । तब आपके पास @MathSmath के अनुसार डिफ़ॉल्ट Worpdress वैरिएबल भी टेम्पलेटफाइल के भीतर उपलब्ध होगा।
जोनास लुंडमैन

13

कोडेक्स में एक साफ समाधान मिला

इसलिए यदि आप कस्टम पोस्ट के माध्यम से लूपिंग कर रहे हैं, तो आप यह कर सकते हैं:

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

और उस टेम्पलेट में, आप स्वचालित रूप से प्राप्त करेंगे $my_post


यह सही उत्तर होगा यदि उदाहरण कोड प्रश्न का उत्तर दे रहा था। (पासिंग ऑप्शन, पोस्ट्स पूरा नहीं है)
जोनास लुंडमैन

यह शामिल टेम्पलेट में अतिरिक्त जानकारी को पारित करने के लिए खूबसूरती से काम करता है। यह wc_get_template_partWooCommerce में भी काम करता है जिसमें कोई शक नहीं डिफ़ॉल्ट WP का विस्तार करता है।
nabrown

8

मुझे इससे भी परेशानी हुई है (एक टेम्पलेट भाग के साथ काम करने के लिए एक कस्टम क्वेरी प्राप्त करने की कोशिश करते समय)। संक्षिप्त उत्तर है: नहीं, टेम्पलेट भाग स्वचालित रूप से कस्टम वेरिएंट को इनहेरिट नहीं करता है जिस तरह से एक नियमित रूप से शामिल करता है।

दोनों get_template_part () और find_template () अंततः लोड_template () फ़ंक्शन का उपयोग वास्तव में फ़ाइल (एक आवश्यकता का उपयोग करके) लोड करने के लिए करते हैं। यह फ़ंक्शन निम्न vars को ग्लोबलाइज़ करता है:

$ पोस्ट, $ पोस्ट, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ टिप्पणी, $ user_ID

हालाँकि, टेम्पलेट भाग के अंदर से कोई अन्य संस्करण उपलब्ध नहीं होता है। मुझे लगता है कि वास्तविक आवश्यकता एक फ़ंक्शन में लपेटी गई है, गुंजाइश बदलती है या कुछ और?

किसी भी तरह, मैं आपके द्वारा पास किए जाने वाले किसी भी अतिरिक्त संस्करण को वैश्वीकरण करने की कोशिश करूँगा, फिर उन ग्लोबल्स को अपने टेम्पलेट भाग से कॉल करना।


4

भविष्य के संदर्भों के लिए बस मेरे दो सेंट, वर्डप्रेस 3.5 में कम से कम एक वर्कअराउंड चर को जोड़ना है $wp_query->query_vars

मुझे _vk_errorsएक टेम्पलेट भाग के अंदर अपने वैश्विक की आवश्यकता थी और बस $wp_query->query_vars['_vk_errors'] = $_vk_errors;कॉल करने से पहले get_template_part()


2

चर समस्या को हल करने का मेरा सरल कार्य है। यह वही काम कर रहा है जैसे वर्डप्रेस 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


दिलचस्प समारोह। क्या सभी ग्लोबल्स और क्वेरी वर्जन आमतौर पर सामान्य टेम्पलेट फ़ाइलों में सुलभ होते हैं?
क्रिश्चियन

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 डेवलपर्स द्वारा बाद में इसका कार्यान्वयन बदल सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.