क्या get_template_part () के परिणाम को ओवरराइड करना संभव है?


11

मैं एक बाल विषय पर काम कर रहा हूं, मैं दृढ़ता से मुख्य टेम्पलेट फाइलों को ओवरराइड नहीं करना चाहता हूं ताकि बाल विषय की सादगी बनाए रखने के साथ-साथ समय के साथ कोड और रखरखाव की मात्रा कम हो सके।

लूप में, मूल विषय में index.php टेम्पलेट का उपयोग करता है: get_template_part( 'content' );

जो content.php में लाएगा , मैं देख रहा हूँ कि यह get_template_part( 'content', get_post_format() );अलग - अलग टेम्प्लेट जैसे सामग्री- अलग - अलग .php , आदि में लाने के लिए अधिक समान या समान व्यवहार करता है , बिना किसी इंडेक्स . 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()

मैं मुसीबत अधिकार के रूप में एक कुछ बेवकूफ इस तरह के कार्य करके मेरे टेम्पलेट भाग की सेवा के बाद दोहराव के बिना यह पूरा करने के लिए, या समाप्त होने के पृष्ठ के बिना प्रस्तुत करना एक तरह से लग रहा हो रही है breakयाexit



3
टेम्पलेट वंशानुक्रम के बिना दयनीय जीवन में आपका स्वागत है। :)
रार्स्ट जूल

जवाबों:


3

ऐसा करने के लिए कोई हुक नहीं है। चाइल्ड थीम पर index.php को कॉपी करें और सिंगल लाइन चेंज करें। इसके अलावा, मूल विषय के लेखक को बताएं कि उन्हें लचीलेपन के लिए अपने विषय में समान परिवर्तन करना चाहिए।


यह अब गलत है, यहाँ @ t-toudua उत्तर देखें
इवान कास्टेलानोस

उसका जवाब समाधान नहीं है, क्योंकि टेम्पलेट भाग अभी भी लोड और शामिल है। कार्रवाई हुक को ओवरराइड नहीं किया जा सकता है।
ओट्टो

सच है, लेकिन आप इसके ob_startअंदर और ob_endकुछ बाद के हुक पर इसका उपयोग कर सकते हैं, लेकिन इसे कभी भी प्रतिध्वनित नहीं किया जा सकता है, जो आमतौर पर काफी अच्छा होता है। या आप PHP को समाप्त करने के लिए निकास () का उपयोग कर सकते हैं (आपके द्वारा मैन्युअल रूप से सब कुछ गायब होने के बाद भी: पाद, आदि)
इवान कास्टेलानोस

और यह अभी भी एक समाधान नहीं है। दमन उत्पादन चीजों को ओवरराइड करने के समान नहीं है।
ओटो

बाहर निकलना उत्पादन को दबा नहीं करता है; यह प्रभावी रूप से उस बिंदु पर निष्पादन को रोकता है।
इवान कैस्टेलानोस

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फ़ंक्शन के दूसरे तर्क का उपयोग नहीं किया है , बल्कि content.phpयदि कोई 'content-'. $formatफ़ाइल नहीं है, तो मैंने फ़ाइल पर इन्फिनिटिव कॉल से बचने के लिए पहले तर्क पर प्रत्यय पारित किया है ।


मुझे लगता है कि यह एक अच्छा तरीका है। यकीन नहीं होता कि इसे स्वीकार क्यों नहीं किया गया है :)
अनह ट्रान

प्रतिष्ठा मायने रखती है, शायद :)
शाज़ाद

क्षमा करें @ शाजाद, मैंने आपके उत्तर को एक अपवित्र रूप दिया, हालांकि यह बहुत चालाक है :) अगर मैं दो को स्वीकार कर सकता हूं, तो मैं करूंगा।
टॉमहृगरन

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

यदि आप सामग्री-अलग नामक फ़ाइल में खींचना चाहते हैं। यदि आप इस तरह से फ़ंक्शन को कॉल करते हैं:

get_template_part( 'content', 'aside' );

दूसरा पैरामीटर हाइफ़न के बाद फाइलर का नाम है। यदि आपकी फ़ाइल उप-निर्देशिका में है (टेम्प्लेट / सामग्री-अलग-अलग.प्रो):

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

क्या आप ऐसा करना चाहते हैं?


धन्यवाद, मैं समझता हूं कि मैं एक एकल पंक्ति परिवर्तन के लिए मूल विषयों index.php को अधिलेखित करने के लिए बच्चे विषय में एक index.php बनाने के लिए नहीं देख रहा हूँ। यह बच्चे के विषय में अधिक रखरखाव जोड़ता है। यदि संभव हो तो हुक के माध्यम से पूरा करने की उम्मीद है।
टॉमहृगरन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.