প্লাগইন ফোল্ডার থেকে কাস্টম পোস্ট ধরণের টেম্পলেট?


57

আমি আমার কাস্টম পোস্ট টাইপটিকে প্লাগিন হিসাবে প্রস্তাব দিতে চাই, যাতে লোকেরা তাদের থিম ফোল্ডারটি স্পর্শ না করেই এটি ব্যবহার করতে পারে। তবে কাস্টম পোস্টের ধরণের টেম্পলেটগুলি - যেমন একক-চলচ্চিত্র.পিএপি - থিম ফোল্ডারে থাকে। প্লাগইনের ফোল্ডারে একক-সিনেমা.পিএফপি পরীক্ষা করার জন্য ডাব্লুপি পাওয়ার কোনও উপায় আছে কি? ফাইলার হায়ারার্কিতে কোনও ফাংশন আঁকছেন ? অথবা 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;

}

এটি দুর্দান্ত উত্তর। দয়া করে ভাগ করে নিতে পারতাম আমি কী সমস্ত একক টেমপ্লেটই সিঙ্গল_টেমপ্লেটের মতো উপলব্ধ হুক পেতে পারি।
গৌরি

6
@ গৌরি ফিল্টারটি get_query_template()ফাংশন দ্বারা ডাকা হয় । এটি একটি ভেরিয়েবল হুক, সুতরাং {$type}_templateপরামিতিটি সেই ফাংশনে কী পাস হবে তার উপর নির্ভর করে প্রথম অংশটি পরিবর্তিত হয়। কিছু সাধারণের জন্য ডাব্লুপি-অন্তর্ভুক্ত / টেম্পলেট.পিএফ দেখুন
শেয়া

এই টিউটোরিয়ালটি ভাল ব্যাখ্যার সাথে একক_প্লেষক হুকটি coversেকে রেখেছে। আপনি একবার হুকগুলি বুঝতে পারলে @ শেয়ার মন্তব্য add_filter( 'single-movies_template', 'my_custom_template' );লিঙ্কযুক্ত টিউটোরিয়ালের মতো ব্যবহার করে @ বেনটারনেটের জবাবের চেয়ে সহজ পদ্ধতির পরামর্শ দেয় । (এই প্রশ্নটি নতুন উত্তরে বন্ধ রয়েছে, তাই আমি এটি নিজেই এটিকে যুক্ত করতে পারি না))
গ্রেগ পেরহাম

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' );

পুরানো উত্তর

@ ব্রেনটারনেট উত্তরে থিম ফোল্ডারে একটি কাস্টম পোস্ট ধরণের নির্দিষ্ট টেম্পলেটটির জন্য একটি চেক যুক্ত করা হয়েছে।

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(এখানে পাওয়া গেছে: কোড . tutsplus.com/tutorials/… )।
ফেলিক্স

1
আপডেট করা উত্তর কাজ করে না, গৃহীত উত্তর (বা আপনার পুরানো উত্তর) কাজ করে।
এডওয়ার্ড

2
আপনি ঠিক বলেছেন, অ্যাডওয়ার্ড, এটি একটি ভয়াবহ আপডেট ছিল। ফেলিক্সের পরামর্শ নিয়ে আমি আবার এটি আপডেট করেছি। এছাড়াও এবার পোস্ট করার আগে আমি কোডটি পরীক্ষা করেছি :)
ক্যাম্পস জোস

4

আমি উল্লেখ করতে চাই যে আপনি যখন এর জন্য ফিল্টার পদ্ধতি ব্যবহার করছেন তখন ফিল্টারটিকে এভাবে অগ্রাধিকার দেওয়া অত্যন্ত জরুরি:

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

আপনি যদি এটি না করেন তবে কখনও কখনও ডাব্লুপি এই ফিল্টারটির পরে পুনরায় পরীক্ষা করার চেষ্টা করবে। 2 ঘন্টা মত এই কারণে আমার চুল টানছিল।


0

এটি করার আরও অনেক ভাল উপায় আছে যা আমি আমার প্লাগিনগুলির জন্য ব্যবহার করছি।

@ ক্যাম্পসজোস যেমন এখানে উল্লেখ করেছেন , ফাইল অস্তিত্ব চেকের পরিবর্তে, আপনি এটি পরীক্ষা করতে পারেন 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');

{$ প্রকার} _ টেম্পলেট ফিল্টার হুক আমার পক্ষে কাজ করে না

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
এটি সিঙ্গল-সিপিটি.পিএফপি কোনও শিশু বা থিমে উপস্থিত কিনা তা পরীক্ষা করে না। এটি কেবল সিঙ্গল.ফ্পের বিরুদ্ধে যাচাই করে যা সর্বদা যে কোনও থিমে উপস্থিত থাকবে।
newpxsn

এটা ঠিক, যখন আমি এটি লিখেছিলাম যখন আমি সত্যিই খালি থিমটি ব্যবহার করছিলাম তখন আরও ভাল উপায় থাকতে হবে!
ডিজিটাল ডিজাইনডিজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.