कस्टम पोस्ट प्रकार प्लगइन फ़ोल्डर से टेम्पलेट्स?


57

मैं एक प्लगइन के रूप में अपने कस्टम पोस्ट प्रकार की पेशकश करना चाहता हूं, ताकि लोग अपने थीम फ़ोल्डर को छूने के बिना इसका उपयोग कर सकें। लेकिन कस्टम पोस्ट टाइप टेम्प्लेट्स - जैसे कि सिंगल-मूवीज। पीपीपी - थीम फोल्डर में रहते हैं। क्या प्लग-इन फ़ोल्डर में एकल-फिल्मों के लिए WP की जांच करने का एक तरीका है। फाइलिंग पदानुक्रम में एक फ़ंक्शन को हुक करना ? या get_template_directory (); ?

जवाबों:


90

आप single_templateफिल्टर हुक का उपयोग कर सकते हैं ।

/* Filter the single_template with our custom function*/
add_filter('single_template', 'my_custom_template');

function my_custom_template($single) {

    global $post;

    /* Checks for single template by post type */
    if ( $post->post_type == 'POST TYPE NAME' ) {
        if ( file_exists( PLUGIN_PATH . '/Custom_File.php' ) ) {
            return PLUGIN_PATH . '/Custom_File.php';
        }
    }

    return $single;

}

यह कमाल का जवाब है। कृपया साझा करें कि क्या मुझे one_template जैसे सभी टेम्पलेट उपलब्ध हुक मिल सकते हैं।
गोवरी

6
@gowri get_query_template()फ़ंक्शन द्वारा फ़िल्टर कहा जाता है । यह एक वैरिएबल हूक है, इसलिए पहला {$type}_templateफंक्शन उस फंक्शन के लिए किस पैरामीटर के आधार पर बदलता है। देखें WP-शामिल / template.php कुछ आम लोगों के लिए
शीया

यह ट्यूटोरियल अच्छी व्याख्या के साथ single_template हुक को कवर करता है। एक बार जब आप हुक को समझ जाते हैं, तो @ शिया की टिप्पणी, add_filter( 'single-movies_template', 'my_custom_template' );लिंक किए गए ट्यूटोरियल की तरह उपयोग करते हुए, @ Bainternet के उत्तर की तुलना में सरल दृष्टिकोण का सुझाव देती है । (यह प्रश्न नए उत्तरों के लिए बंद है, इसलिए मैं इसे स्वयं नहीं जोड़ सकता।)
ग्रेग पेरहम

2
आप के PLUGIN_PATHसाथ बदल सकते हैं plugin_dir_path( __FILE__ )और फिर अपने फ़ाइल नाम से पहली स्लैश को हटा सकते हैं। पूरा रास्ता कुछ इस तरह दिखाई देगा:return plugin_dir_path( __FILE__ ) . 'Custom_File.php';
फ्रिट्स

1
PLUGIN_PATH ने एक त्रुटि की, यहां एक शानदार पोस्ट दिखाया गया है कि यह कैसे करना है और यह मेरे लिए बॉक्स से बाहर काम करता है: wpsites.net/free-tutorials/…
नाथन

22

अद्यतन उत्तर

क्लीनर और छोटा संस्करण।

function load_movie_template( $template ) {
    global $post;

    if ( 'movie' === $post->post_type && locate_template( array( 'single-movie.php' ) ) !== $template ) {
        /*
         * This is a 'movie' post
         * AND a 'single movie template' is not found on
         * theme or child theme directories, so load it
         * from our plugin directory.
         */
        return plugin_dir_path( __FILE__ ) . 'single-movie.php';
    }

    return $template;
}

add_filter( 'single_template', 'load_movie_template' );

पुराना उत्तर

@Brainternet उत्तर थीम फ़ोल्डर में एक कस्टम पोस्ट प्रकार विशिष्ट टेम्पलेट के लिए एक चेक जोड़ा गया।

function load_cpt_template($template) {
    global $post;

    // Is this a "my-custom-post-type" post?
    if ($post->post_type == "my-custom-post-type"){

        //Your plugin path 
        $plugin_path = plugin_dir_path( __FILE__ );

        // The name of custom post type single template
        $template_name = 'single-my-custom-post-type.php';

        // A specific single template for my custom post type exists in theme folder? Or it also doesn't exist in my plugin?
        if($template === get_stylesheet_directory() . '/' . $template_name
            || !file_exists($plugin_path . $template_name)) {

            //Then return "single.php" or "single-my-custom-post-type.php" from theme directory.
            return $template;
        }

        // If not, return my plugin custom post type template.
        return $plugin_path . $template_name;
    }

    //This is not my custom post type, do nothing with $template
    return $template;
}
add_filter('single_template', 'load_cpt_template');

अब आप प्लगइन उपयोगकर्ताओं को इसे ओवरराइड करने के लिए अपने थीम से टेम्पलेट को उनकी थीम पर कॉपी करने दे सकते हैं।

इस उदाहरण के साथ, टेम्पलेट को प्लगइन और थीम दोनों की मूल निर्देशिका में होना चाहिए।


1
मेरे लिए क्लीनर विकल्प की तरह ध्वनियों के locate_templateबजाय उपयोग करना get_stylesheet_directory(यहां पाया गया: code.tutsplus.com/tutorials/… )।
फेलिक्स

1
अद्यतित उत्तर काम नहीं किया, स्वीकृत उत्तर (या आपका पुराना उत्तर) काम करता है।
एडवर्ड

2
आप सही हैं, @ एडवर्ड, यह एक भयावह अद्यतन था। मैंने फेलिक्स के सुझाव के साथ इसे फिर से अपडेट किया। इस बार भी मैंने इसे पोस्ट करने से पहले कोड का परीक्षण किया :)
कैम्प्सजोस

4

मैं यह बताना चाहूंगा कि जब आप इसके लिए फ़िल्टर विधि का उपयोग कर रहे हैं, तो फ़िल्टर को प्राथमिकता देना बेहद महत्वपूर्ण है:

add_filter('single_template', 'my_custom_template', 99);

यदि आप ऐसा नहीं करते हैं, तो कभी-कभी WP इस फ़िल्टर के बाद पुनः जाँचने का प्रयास करेगा। 2 घंटे से इस वजह से मेरे बाल खींच रहा था।


0

इसे करने का एक बहुत अच्छा तरीका है जो मैं अपने प्लगइन्स के लिए उपयोग कर रहा हूं।

जैसा कि @campsjos यहाँ उल्लेख करता है , फ़ाइल अस्तित्व की जाँच के बजाय, आप जाँच सकते हैं locate_templateकि विषय ओवररोड टेम्पलेट फ़ाइल में जाँच करेगा। जो काफी स्पष्ट है।

function my_plugin_templates() {
    if (is_singular('movie')) {
        if (file_exists($this->template_dir . 'single-movie.php')) {
            return $this->template_dir . 'single-movie.php';
        }
    }
}

template_includeकोड से ऊपर लोड करने के लिए फ़िल्टर हुक का उपयोग करें ।

add_filter('template_include' , 'my_plugin_templates');

0

इस पृष्ठ के लिए धन्यवाद मैं मेरे लिए एक ही प्रश्न को हल करने में सक्षम था।

संदर्भ के लिए, यह वही है जिसके साथ मैं समाप्त हुआ:

function pluginName_myposttype_single_template($single_template) {
  $myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';
  return get_post_type() === 'myposttype' && file_exists($myposttype_template) ? $myposttype_template : $single_template;
}
add_filter('single_template', 'pluginName_myposttype_single_template');

{$ प्रकार} _template फ़िल्टर हुक ने मेरे लिए काम नहीं किया

function pluginName_myposttype_single_template($single_template) {
  $myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';

  if ( file_exists($myposttype_template) ) {
    $single_template = $myposttype_template;
  }
  return $single_template;
}
add_filter('single-myposttype_template', 'pluginName_myposttype_single_template');

-2

ऊपर एक शानदार जवाब है, लेकिन $ एकल संस्करण के लिए जाँच करने से टेम्पलेट को टेम्पलेट को ओवरराइड करने की अनुमति मिलती है यदि कोई थीम / चाइल्ड थीम द्वारा प्रदान किया जाता है।

/* Filter the single_template with our custom function*/
add_filter('single_template', 'your_cpt_custom_template');

function your_cpt_custom_template( $single ) {
    global $wp_query, $post;
    /* Checks for single template by post type */
    if ( !$single && $post->post_type == 'cpt' ) {
        if( file_exists( plugin_dir_path( __FILE__ ) . 'single-cpt.php' ) )
            return plugin_dir_path( __FILE__ ) . 'single-cpt.php';
    }
    return $single;
}

1
यह जाँच नहीं करता है कि एकल cpt.php बच्चे या विषय में मौजूद है या नहीं। यह केवल single.php के खिलाफ जांच करता है जो हमेशा किसी भी विषय में मौजूद रहेगा।
newpxsn

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