कस्टम पोस्ट प्रकार और Template_redirect


9

मेरे पास दो कस्टम पोस्ट प्रकार (जैसे post_type_1 और post_type_2) हैं जो मैं अपने प्रदर्शन को संभालने के लिए स्वतंत्र टेम्प्लेट (एकल- post_type_1.php और सिंगल-पोस्ट_type_2.php) पर पुनर्निर्देशित करना चाहूंगा। मैं थीम फ़ोल्डर में डिस्प्ले टेम्प्लेट नहीं रखना चाहता क्योंकि मैं उन्हें अपने संबंधित प्लगइन फ़ोल्डर में आत्म-निहित चाहता हूं।

मैं उनमें से प्रत्येक को दूसरे को प्रभावित किए बिना एक template_redirect हुक कैसे पंजीकृत कर सकता हूं? या मुझे एक अलग तकनीक का उपयोग करना चाहिए?

वर्तमान में, मैं प्लगइन 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;
        }

    }
}

एक बार जब मैं प्लगइन 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 रीडायरेक्ट करने के लिए एक सुविधाजनक हुक है, आदि ... लेकिन अन्य टेम्प्लेट पथों को शामिल करने के लिए उपयोग नहीं किया जाना चाहिए क्योंकि वर्डप्रेस इसे 'template_include' फ़िल्टर के साथ सहज रूप से करता है।

template_includeऔर single_templateहुक केवल सामग्री प्रदान करने के लिए उपयोग किए जाने वाले टेम्पलेट के पथ के साथ सौदा करते हैं। टेम्पलेट पथ को समायोजित करने के लिए यह उचित स्थान है।

@ChipBennett की टिप्पणी से अपडेट करें:

single_template3.4 के रूप में हटा दिया गया है। इसके बजाय {posttype} _template का उपयोग करें।


तो, यह काम करता है, लेकिन यह टेम्प्लेट_रेड अप्रत्यक्ष और एकल_प्लेट कार्य को भी पूरा करता है। मेरे द्वारा निर्धारित वास्तविक समस्या यह थी कि मेरे पास एक कस्टम व्यवस्थापक कॉलम है जो फ़ंक्शन को 'अनुरोध' फ़िल्टर में हुक करता है और मैं $ var चर के संशोधन को केवल उस समय सीमित नहीं कर रहा था जब पोस्ट प्रकार एक निश्चित प्रकार का था। लेकिन, मुझे template_include हुक के बारे में जानकर खुशी हुई। फिर भी यह निश्चित नहीं है कि खाका_प्रत्यक्ष, साँचा_संकुलित और single_template के बीच क्या अंतर है।
anderly

@anderly मैंने अपना उत्तर अपडेट किया। उम्मीद है की यह मदद करेगा।
ब्रायन फीगर

तो, single_template के बारे में क्या? यह लिंक ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) कहता है कि इसका उपयोग पोस्ट या पेज के लिए टेम्पलेट को समायोजित करने के लिए किया जा सकता है जब एकल टेम्पलेट कहा जाता है। यही मैं करने की कोशिश कर रहा हूं। किसी भी स्थिति में, टेम्प्लेट_किन्यूड या सिंगल_टेमप्लेट फ़िल्टर का उपयोग करके काम करते हैं और एक ही चीज़ को पूरा करने के लिए दिखाई देते हैं।
anderly

1
Single_template उसी तरह से काम करता है, सिवाय इसके कि इसे सशर्त कहा जाए। यह पूरी साइट पर एक हथौड़ा फिल्टर का उपयोग करने के बजाय पथ परिवर्तनों को अलग करने में मदद करता है।
ब्रायन फीगर

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