একক - custom $ post_type} - কাস্টম পোস্ট ধরণের জন্য ph স্লাগ}। php


20

ওয়ার্ডপ্রেস টেম্পলেট হায়ারার্কির আমার প্রিয় অংশটি হ'ল স্লাগ দ্বারা পৃষ্ঠাগুলির জন্য টেমপ্লেট ফাইলগুলি দ্রুত তৈরি করার ক্ষমতা, কোনও টেমপ্লেট নির্বাচন করার জন্য ওয়ার্ডপ্রেসে পৃষ্ঠা সম্পাদনা না করে।

আমরা বর্তমানে এটি করতে পারি:

page- {স্লাগ্} .php

তবে আমি এটি করতে সক্ষম হতে চাই:

একক {post_type} - {স্লাগ্} .php

যাতে, উদাহরণস্বরূপ, পরিচিত reviewপোস্টের ধরণে, "মাই গ্রেট রিভিউ" নামক একটি পোস্টের জন্য আমি একটি টেমপ্লেট তৈরি করতে পারিsingle-review-my-great-review.php

আগে কি কেউ এটি স্থাপন করেছে? single-{post_type}-{slug}.php


এর আগে কখনও এমন সেটআপ ব্যবহার করেন নি তবে এটি যদি খুব জটিল হয় তবে কেন কেবল একটি টেম্পলেট ফাইল তৈরি করবেন না এবং এটিকে প্রশ্নের পর্যালোচনাতে সংযুক্ত করুন।
শেন

ডাব্লুপি ৩.৪ স্বয়ংক্রিয়ভাবে নিয়ে আসে single-{post_type}-{slug}.php, তাই ডাব্লুপি ৩.৪-তে উন্নীত করা অন্য বিকল্প।
ইয়িটওয়াইল

উত্তর:


19

ক) কোর বেস

আপনি কোডেক্স টেম্পলেট হায়ারার্কির ব্যাখ্যাতে দেখতে পাচ্ছেন , single-{$post_type}.phpইতিমধ্যে সমর্থিত।


খ) মূল স্তরক্রম প্রসারিত করা tend

ভিতরে আনন্দের সাথে কিছু ফিল্টার এবং হুক রয়েছে /wp-includes/template-loader.php

  • do_action('template_redirect');
  • apply_filters( 'template_include', $template )
  • এবং: ভিতরে একটি নির্দিষ্ট ফিল্টার get_query_template( $type, ... )নাম দেওয়া হয়েছে:"$type}_template"

খ .১) এটি কীভাবে কাজ করে

  1. টেমপ্লেট লোডার ফাইল ভিতরে, টেমপ্লেট একটি ক্যোয়ারী Var / wp_query শর্তসাপেক্ষ দ্বারা লোড পরার: is_*()
  2. শর্তসাপেক্ষ পরে ট্রিগার (একটি "একক" টেমপ্লেটের ক্ষেত্রে): is_single() && $template = get_single_template()
  3. এটি তখন ট্রিগার get_query_template( $type, $templates ), যেখানে $typeআছেsingle
  4. তারপরে আমাদের "{$type}_template"ফিল্টার রয়েছে

গ) সমাধান

যেহেতু আমরা কেবলমাত্র একটি টেম্পলেট দিয়ে ক্রমবর্ধমান প্রসারকে প্রসারিত করতে চাই যা প্রকৃত টেম্পলেটটির আগে লোড হয়ে যায় "single-{$object->post_type}.php", তাই আমরা স্তরক্রমকে বাধা দেব এবং টেম্পলেট অ্যারের শুরুতে একটি নতুন টেম্পলেট যুক্ত করব।

// Extend the hierarchy
function add_posttype_slug_template( $templates )
{

    $object = get_queried_object();

    // New 
    $templates[] = "single-{$object->post_type}-{$object->post_name}.php";
    // Like in core
    $templates[] = "single-{$object->post_type}.php";
    $templates[] = "single.php";

    return locate_template( $templates );    
}
// Now we add the filter to the appropriate hook
function intercept_template_hierarchy()
{
    add_filter( 'single_template', 'add_posttype_slug_template', 10, 1 );
}
add_action( 'template_redirect', 'intercept_template_hierarchy', 20 );

দ্রষ্টব্য: (আপনি যদি ডিফল্ট বস্তুর স্লাগ ব্যতীত অন্য কিছু ব্যবহার করতে চান) $slugআপনাকে আপনার পারমালিঙ্ক-কাঠামো অনুযায়ী সামঞ্জস্য করতে হবে । গ্লোবাল থেকে আপনার যা প্রয়োজন কেবল তা ব্যবহার করুন (object) $post

ট্র্যাক টিকিট

উপরোক্ত পদ্ধতিটি বর্তমানে সমর্থিত নয় (আপনি কেবলমাত্র এইভাবে নিখরচায় অবস্থিত পাথ ফিল্টার করতে পারেন), এখানে ট্র্যাকের টিকিটের একটি তালিকা রয়েছে:


আমি এটি পরীক্ষা করে দেখতে চাই, তবে দেখে মনে হচ্ছে আপনার অ্যাড_ফিল্টার লাইনে শেষে কিছু আছে।
সুপারট্রু

পছন্দ করুন :) )ফিল্টার ভিতরে অন্য একটি নিখোঁজ পাওয়া গেছে । সংশোধন করা হয়েছে। টেমপ্লেটের অভ্যন্তরে স্লাগের আগে আপনি কোনও আন্ডারলাইন দিয়ে ড্যাশ এক্সচেঞ্জ করতে চান। টেমপ্লেটগুলি দেখার সময় প্রত্যয়টি আরও ভালভাবে দাঁড় করানোর জন্য।
কায়সার

সাইট জুড়ে এই ত্রুটি ঘটায় : সতর্কতা: অ্যারে_উন্সফিট () [ফাংশন.আররে-আনশিফ্ট]: প্রথম যুক্তিটি [অ্যারে_উন্সফিটযুক্ত লাইন] এর একটি অ্যারে হওয়া উচিত
সুপারট্রু

ঠিক আছে, তবে তারপরে অন্য কিছু হ'ল মূল টেম্পলেটগুলিকে বাধা দিচ্ছে। ফাংশনটি সূক্ষ্মভাবে কাজ করে এবং $templatesএকটি অ্যারে। এই পেস্টবিনে মূল ফাংশনগুলি দেখুন (কোনও মেয়াদোত্তীর্ণের তারিখ নেই)। নিশ্চিত হয়ে নিন যে আপনি প্লাগইন এবং ডিফল্ট থিম ছাড়াই একটি ইনস্টল দিয়ে পরীক্ষা করেছেন । তারপরে একে অপরের পর একটিকে সক্রিয় করুন এবং দেখুন ত্রুটিটি এখনও ঘটছে কিনা।
কায়সার

হ্যাঁ, আমি এটি একটি ডিবাগ করেছি আমি প্রথম পাওয়া টেমপ্লেটের চূড়ান্ত নিখুঁত পাথটিকে স্ট্রিং হিসাবে ফিরে পেয়েছি। উত্তরটি পরিবর্তন করার আগে আমাকে এই সম্পর্কে কিছু মূল বিকাশকারীর সাথে কথা বলতে হবে। এছাড়াও: আমি কিছু মিশ্রিত করেছি: slugকেবলমাত্র শর্তাদি এবং শুল্কের জন্য উপলব্ধ available $post->post_nameআপনার পারমালিঙ্ক কাঠামোর সাথে কী উপযুক্ত তা প্রতিস্থাপন করা উচিত । আপনার পারমা কাঠামো এবং পুনর্লিখনের নিয়মের উপর নির্ভর করে পাথ পুনরুদ্ধার এবং প্রতিস্থাপনের সাথে সমস্ত ক্ষেত্রে স্বয়ংক্রিয়ভাবে এটি করার কোনও উপায় নেই। অন্য একটি আপডেট আশা।
কায়সার

4

টেম্পলেট হায়ারার্কি চিত্র অনুসরণ করে , আমি এই জাতীয় কোনও বিকল্প দেখতে পাচ্ছি না।

সুতরাং এখানে কিভাবে আমি এটি যেতে চাই:

সমাধান 1 (আমার মতে সেরা)

একটি টেম্পলেট ফাইল তৈরি করুন এবং এটি পর্যালোচনার সাথে যুক্ত করুন

 <?php
 /*
 Template Name: My Great Review
 */
 ?>

আপনার থিম ডিরেক্টরিতে টেমপ্লেট পিএইচপি ফাইল যুক্ত করে, এটি আপনার পোস্টের সম্পাদনা পৃষ্ঠায় একটি টেম্পলেট বিকল্প হিসাবে উপস্থিত হবে।

সমাধান 2

এটি সম্ভবত template_redirectহুক ব্যবহার করে অর্জন করা যেতে পারে ।

ফাংশন.এফপি ফাইলটিতে:

 function my_redirect()
 {
      global $post;

      if( get_post_type( $post ) == "my_cpt" && is_single() )
      {
           if( file_exists( get_template_directory() . '/single-my_cpt-' . $post->post_name . '.php' ) )
           {
                include( get_template_directory() . '/single-my_cpt-' . $post->post_name . '.php' );
                exit;
           }
      }
 }
 add_action( 'template_redirect', 'my_redirect' );

সম্পাদনা

যোগ করা file_existsচেক


আপনি exit;সেখানে কেন ?
কায়সার

@ কাইজার নিশ্চয়ই সেই সময়ে আমি যা কিছু টিউটোরিয়াল অনুসরণ করেছি তা অবশ্যই ছিল, যদি এটি প্রয়োজনীয় না হয় তবে আমি এটি সরিয়ে ফেলব।
শেন

1
@ কাইজার: exit()ডিফল্ট টেম্পলেট লোড করা রোধ করার জন্য এটি প্রয়োজনীয়।
স্ক্রিবু

সমাধান 1 কেবলমাত্র পৃষ্ঠাগুলির জন্য কাজ করবে, পোস্ট নয়।
IXN

2

শীর্ষ উত্তর (4 বছর আগে থেকে) আর কাজ করে না, তবে ওয়ার্ডপ্রেস কোডেক্সের সমাধান এখানে রয়েছে :

<?php
function add_posttype_slug_template( $single_template )
{
    $object = get_queried_object();
    $single_postType_postName_template = locate_template("single-{$object->post_type}-{$object->post_name}.php");
    if( file_exists( $single_postType_postName_template ) )
    {
        return $single_postType_postName_template;
    } else {
        return $single_template;
    }
}
add_filter( 'single_template', 'add_posttype_slug_template', 10, 1 );
?>

1

পৃষ্ঠা টেম্পলেট ব্যবহার করুন

স্কেলাবিলিটির জন্য অন্য পদ্ধতির হ'ল pageআপনার কাস্টম পোস্টের জন্য পোস্টের ধরণের পৃষ্ঠা টেমপ্লেট ড্রপ-ডাউন কার্যকারিতা ডুপ্লিকেট করা ।

পুনরায় ব্যবহারযোগ্য কোড

কোডে নকল করা ভাল অভ্যাস নয়। অতিরিক্ত সময় এটি কোনও কোডবাসে মারাত্মক ফোলাভাব সৃষ্টি করতে পারে তখন কোনও বিকাশকারীকে পরিচালনা করা খুব কঠিন করে তোলে। প্রতিটি একক স্লাগের জন্য একটি টেম্পলেট তৈরি করার পরিবর্তে আপনার সম্ভবত এক-একাধিক টেম্পলেট প্রয়োজন যা একের পর এক টেমপ্লেট-এর পরিবর্তে পুনরায় ব্যবহার করা যেতে পারে used

কোড

# Define your custom post type string
define('MY_CUSTOM_POST_TYPE', 'my-cpt');

/**
 * Register the meta box
 */
add_action('add_meta_boxes', 'page_templates_dropdown_metabox');
function page_templates_dropdown_metabox(){
    add_meta_box(
        MY_CUSTOM_POST_TYPE.'-page-template',
        __('Template', 'rainbow'),
        'render_page_template_dropdown_metabox',
        MY_CUSTOM_POST_TYPE,
        'side', #I prefer placement under the post actions meta box
        'low'
    );
}

/**
 * Render your metabox - This code is similar to what is rendered on the page post type
 * @return void
 */
function render_page_template_dropdown_metabox(){
    global $post;
    $template = get_post_meta($post->ID, '_wp_page_template', true);
    echo "
        <label class='screen-reader-text' for='page_template'>Page Template</label>
            <select name='_wp_page_template' id='page_template'>
            <option value='default'>Default Template</option>";
            page_template_dropdown($template);
    echo "</select>";
}

/**
 * Save the page template
 * @return void
 */
function save_page_template($post_id){

    # Skip the auto saves
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;
    elseif ( defined( 'DOING_AJAX' ) && DOING_AJAX )
        return;
    elseif ( defined( 'DOING_CRON' ) && DOING_CRON )
        return;

    # Only update the page template meta if we are on our specific post type
    elseif(MY_CUSTOM_POST_TYPE === $_POST['post_type'])
        update_post_meta($post_id, '_wp_page_template', esc_attr($_POST['_wp_page_template']));
}
add_action('save_post', 'save_page_template');


/**
 * Set the page template
 * @param string $template The determined template from the WordPress brain
 * @return string $template Full path to predefined or custom page template
 */
function set_page_template($template){
    global $post;
    if(MY_CUSTOM_POST_TYPE === $post->post_type){
        $custom_template = get_post_meta($post->ID, '_wp_page_template', true);
        if($custom_template)
            #since our dropdown only gives the basename, use the locate_template() function to easily find the full path
            return locate_template($custom_template);
    }
    return $template;
}
add_filter('single_template', 'set_page_template');

এটি কিছুটা দেরি করে দেওয়া উত্তর, তবে আমি ভেবেছিলাম এটি মূল্যবান হবে কারণ যেহেতু আমি বলতে পারি ওয়েবে কেউই এই পদ্ধতির নথিভুক্ত করেনি। এই কেউ সাহায্য করে আউট আশা করি।


1

আমার ক্ষেত্রে আমার অ্যালবাম এবং ট্র্যাক কাস্টম পোস্টের প্রকারগুলি অ্যালবামের সংজ্ঞা দ্বারা যুক্ত। আমি অ্যালবাম এবং ট্র্যাক পোস্টগুলির জন্য তাদের অ্যালবাম শৈলীর উপর নির্ভর করে বিভিন্ন একক টেম্পলেট ব্যবহার করতে সক্ষম হতে চেয়েছিলাম।

উপরের কায়সারের উত্তরের ভিত্তিতে আমি এই কোডটি লিখেছি। এটি ভালই কাজ করে.
বিঃদ্রঃ. আমার অ্যাডঅ্যাকশন () দরকার নেই।

// Add an additional template option to the template hierarchy
add_filter( 'single_template', 'add_albumtrack_taxslug_template', 10, 1 );
function add_albumtrack_taxslug_template( $orig_template_path )
{
    // at this point, $orig_template_path is an absolute located path to the preferred single template.

    $object = get_queried_object();

    if ( ! (
        // specify another template option only for Album and Track post types.
        in_array( $object->post_type, array( 'gregory-cpt-album','gregory-cpt-track' )) &&
        // check that the Album taxonomy has been registered.
        taxonomy_exists( 'gregory-tax-album' ) &&
        // get the Album taxonomy term for the current post.
        $album_tax = wp_get_object_terms( $object->ID, 'gregory-tax-album' )
        ))
        return $orig_template_path;

    // assemble template name
    // assumption: only one Album taxonomy term per post. we use the first object in the array.
    $template = "single-{$object->post_type}-{$album_tax[0]->slug}.php";
    $template = locate_template( $template );
    return ( !empty( $template ) ? $template : $orig_template_path );
}

আমি এখন একক-গ্রেগরি-সিপিটি-ট্র্যাক-ট্যাক্স-সেরেন্ডিপিটি.পিএপি এবং একক-গ্রেগরি-সিপিটি-অ্যালবাম-কর-সেরেন্ডিপিটি.পিএপি এবং ডাব্লুপি নামের টেম্পলেটগুলি তৈরি করতে পারি; 'ট্যাক্স-সেরেন্ডিপিটি' হ'ল প্রথম অ্যালবাম ট্যাক্সনোমি টার্মের স্লাগ।

রেফারেন্সের জন্য, 'একক_প্লেষক' ফিল্টার হুক এখানে ঘোষণা করা হয়েছে: /
wp-includes/theme.php:get_query_template()

নমুনা কোডের জন্য আপনাকে কায়সারকে ধন্যবাদ।

চিয়ার্স, গ্রেগরি


হাই গ্রেগ - ডাব্লুপিএসইতে স্বাগতম! দয়া করে কেবল প্রশ্নের উত্তর হিসাবে পোস্ট করুন - প্রশ্নগুলি অনুসরণ করবেন না। যদি আপনার এমন কোনও প্রশ্ন থাকে যা কোনও উত্তর দিয়ে উত্তর দেয় না এবং কোনও মন্তব্যের পক্ষে খুব বড় হয় তবে দয়া করে অন্য একটি প্রশ্ন খুলুন :)
স্টিফেন হ্যারিস

1
স্ট্রিং / অ্যারে প্রশ্নটি সরানো হয়েছে :-)
গ্রেগরি

1
"নমুনা কোডটির জন্য আপনাকে কায়সারকে ধন্যবাদ।" - আপনাকে স্বাগতম.
কায়সার

এটা কি তোমার জন্য কাজ করে? প্রথমত, '$ টেমপ্লেট' আপনার কোডটিতে মন্তব্য করা উচিত নয় .. এবং আমি মনে করি যে '$ অ্যালবাম_ট্যাক্স [0] -> স্লাগ' এর পরিবর্তে '$ অবজেক্ট-> পোস্ট_নাম' থাকা উচিত, তাই না?
গ্রেগমেটিজ

$ টেমপ্লেট লাইনটি স্থির করে। ধন্যবাদ. $ object-> POST_NAME- এ? কোন। এটি পোস্টের স্লাগটি ফিরিয়ে দেবে, তবে আমার পোস্টটির সাথে লিঙ্কযুক্ত অ্যালবামের স্লাগ দরকার।
গ্রেগরি

0

ব্রায়ানস কোডের জন্য আপডেট, আমি দেখতে পেলাম যে যখন ড্রপডাউন বাক্সটি ব্যবহার করা হচ্ছে না তখন "ডিফল্ট" টেম্পলেট বিকল্পটি ডাব্লুপি_পেজ_টেমপ্লেটে সংরক্ষণ করা হচ্ছিল যার ফলে এটি ডিফল্ট নামে একটি টেম্পলেট চেষ্টা করার চেষ্টা করেছিল find এই পরিবর্তনটি পোস্ট মেটা সংরক্ষণের সময় "ডিফল্ট" বিকল্পের জন্য অনুসন্ধান করে এবং পরিবর্তে পোস্ট মেটা মুছে ফেলা হয় (আপনি যদি টেমপ্লেটের বিকল্পটি ডিফল্টে পরিবর্তন করেন তবে দরকারী)

অন্যটিফ (MY_CUSTOM_POST_TYPE === $ _POST ['পোস্ট_ টাইপ']) {

যদি (এস্কে_আউটআর ($ _ পোষ্ট ['_ wp_page_template']) === "ডিফল্ট"):
    মুছুন_পোস্ট_মেটা ($ post_id, '_wp_page_template');
অন্য:
    আপডেট_পোস্ট_মেটা ($ post_id, '_wp_page_template', esc_attr ($ _ পোষ্ট ['_ wp_page_template']));
শেষ যদি;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.