পারমলিংক সহ নেস্টেড কাস্টম পোস্ট প্রকারগুলি


9

আমি authors/books/chaptersলেখক, বই এবং অধ্যায়গুলি সহ সমস্ত নিজস্ব কাস্টম পোস্টের ধরণের হিসাবে সেট আপ করা মত পারমলিনাক্স সহ একটি বহু-স্তরের কাস্টম পোস্ট ধরণের কাঠামো স্থাপন করার চেষ্টা করছি । উদাহরণস্বরূপ, এই সাইটের একটি সাধারণ ইউআরএল দেখতে পেতexample.com/authors/stephen-king/the-shining/chapter-3/

প্রতিটি অধ্যায় কেবল একটি বইয়ের অন্তর্ভুক্ত হতে পারে এবং প্রতিটি বই কেবল একজন লেখকের অন্তর্ভুক্ত থাকতে পারে। আমি লেখক এবং বইয়ের জন্য সিপিটিগুলির পরিবর্তে কর বিভাগগুলি ব্যবহার করার বিষয়টি বিবেচনা করেছি, তবে প্রতিটি আইটেমের সাথে আমার মেটাডেটা যুক্ত করতে হবে এবং আমি এটির জন্য পোস্ট ইন্টারফেসটি পছন্দ করি prefer

আমি বেশিরভাগ রাস্তাতেই সিপিটি এক স্তরের উপরে প্রবেশের শিশু হিসাবে প্রতিটি কাস্টম পোস্ট কেবল সেট আপ করেই থাকি। উদাহরণস্বরূপ, আমি "অধ্যায় 3" তৈরি করি এবং কাস্টম মেটা-বাক্স ব্যবহার করে পিতামাতার হিসাবে "দ্য শাইনিং" বরাদ্দ করি। পরিবর্তে "দ্য শাইনিং" এর পিতামাতা হিসাবে "স্টিফেন কিং" রয়েছে। এই সম্পর্কগুলি তৈরি করতে আমার কোনও সমস্যা হয়নি।

আমি সিপিটি স্লাগগুলিতে পুনর্লিখন ট্যাগগুলি ব্যবহার করছি এবং পারমালিঙ্কস কাজ করতে চায় তবে তারা ঠিক মতো নয়। পুনর্লিখন বিশ্লেষক ব্যবহার করে, আমি দেখতে পাচ্ছি যে পুনর্লিখনের নিয়মগুলি আসলে উত্পন্ন হয়েছে, তবে সেগুলি সঠিক ক্রমে বলে মনে হয় না এবং তাই অন্যান্য বিধিগুলি প্রথমে প্রক্রিয়া করা হয়।

আমার পুনর্লিখন বিশ্লেষকের একটি স্ক্রিনশট এখানে।

আমি এখানে আমার সিপিটি নিবন্ধিত করেছি:

function cpt_init() {

  $labels = array(
    'name' => 'Authors'
   );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author',
        'with_front' => FALSE,
    ),
    'with_front' => false,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('authors',$args);

  $labels = array(
    'name' => 'Books'
  );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author/%authors%',
        'with_front' => FALSE,
    ),
    'with_front' => false,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('books',$args);


  $labels = array(
    'name' => 'Chapters'
   );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
    'rewrite' => array(
        'slug' => 'author/%authors%/%books%',
        'with_front' => FALSE,
    ),
    'with_front' => FALSE,
    'capability_type' => 'post',
    'has_archive' => false, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor' )
  ); 

  register_post_type('chapters',$args);

}

add_action( 'init', 'cpt_init' );

তাহলে কি আমার পুনর্লিখনের নিয়মের অগ্রাধিকার পরিবর্তন করার কোনও উপায় আছে যাতে লেখক, বই এবং অধ্যায়গুলি সব মিলিয়ে যায়?

আমি আরও জানি যে আমাকে একটি post_type_linkফিল্টার যুক্ত করতে চলেছে , তবে পার্মলিংকগুলি প্রথম স্থানে পাওয়ার জন্য এটি গৌণ বলে মনে হচ্ছে। যদি কেউ জানেন যে আমি কোথায় ফিল্টারটি কাজ করে তার একটি বিস্তৃত ওভারভিউ খুঁজে পেতে পারি, এটি প্রশংসা হবে।


আপনি কি কেবল পৃষ্ঠা ব্যবহারের কথা বিবেচনা করেছেন? আপনি স্বয়ংক্রিয়ভাবে ডান পারমালিঙ্ক কাঠামো পাবেন।
মাইকেল হ্যাম্পটন

আমি অবশ্যই এটি বিবেচনা করেছি। পৃষ্ঠাগুলি সমস্যা হ'ল আমাদের একক লেখকের জন্য 100 নাতি নাতি আইটেম থাকতে পারে যা পৃষ্ঠাগুলির প্রশাসকের পক্ষে পরিচালনা করা খুব কঠিন। এছাড়াও, আমাদের পোস্টের ধরণের মাধ্যমে কোয়েরি করতে সক্ষম হওয়া প্রয়োজন।
ডাল্টন

আমি একটি সমাধান নিয়ে কাজ করছি তবে আমার একটি দ্রুত প্রশ্ন আছে: প্রতিটি পারমিলিংকের সামনে 'লেখক' থাকা কী? কারণ এটি স্টিকার বলে মনে হচ্ছে। আমি মনে করি এটি ওয়ার্ডপ্রেসকে কিছুটা বিভ্রান্ত করছে, বিশেষত যেহেতু এটি ডাব্লুপি লেখক পৃষ্ঠাগুলির জন্যও ব্যবহৃত একটি পারমিলিং স্লাগ। যদি 'লেখক' থাকা প্রয়োজন হয়, তবে আমার মনে হয় পুরো জিনিসটি এখনও সক্ষম ... এটি আরও জটিল হবে।
র‌্যাচেল কারডেন

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

আমি বুঝতে পারি যে বিভ্রান্তিটি আসলে সিপিটিগুলি 'লেখককে' বেস স্লাগ হিসাবে ভাগ করে নিচ্ছে। একবার আপনি সিপিটি 'লেখকদের' স্লাগ হিসাবে 'লেখক' সেট করলেন এবং তারপরে আপনি সিপিটি 'বই' এবং 'লেখক /% লেখক% /% বই%' সিপিটির জন্য 'অধ্যায়গুলির জন্য' লেখক /% লেখক% 'সেট করলেন set ', তারপরে ওয়ার্ডপ্রেস মনে করে যে' বই 'এর জন্য পোস্ট এবং' অধ্যায়গুলির জন্য পোস্টগুলি 'লেখকদের' জন্য আক্ষরিক অর্থেক্রমিক শিশুদের পোস্ট। যে জানার জন্য? আমার পরীক্ষায় আপনি 'লেখককে সিপিটি' লেখকদের 'বেস হিসাবে রাখতে পারেন এবং এটি ঠিক কাজ করে। সুতরাং আমার আগের প্রশ্নটি এর সাথে প্রতিস্থাপন করুন: আপনার কি 'লেখক' দরকার বা স্লাগটি% লেখক% দিয়ে শুরু করতে পারেন?
রাহেল কারডেন

উত্তর:


11

আপনি পার্মালিনক্স মধ্যে বেস স্লাগ্, অর্থাত্ হিসাবে 'লেখকদের রাখতে চান example.com/authors/stephen-king/ ,' লেখকদের CPT জন্য example.com/authors/stephen-king/the-shining/ জন্য 'বই' সিপিটি এবং উদাহরণ অ্যাটায়ারস / স্টিফেন -কিংিং / চ্যাটারিং / চ্যাপ্টার ৩/১ 'অধ্যায়' সিপিটি-র জন্য ওয়ার্ডপ্রেস ভাববে যে সবকিছুই 'লেখক' পোস্ট বা একটি লেখকের একটি শ্রেণিবদ্ধ শিশু 'পোস্ট এবং যেহেতু এটি নয়, ওয়ার্ডপ্রেস শেষ পর্যন্ত খুব বিভ্রান্ত হয়ে পড়ে।

এই কথাটি বলে, একটি কার্যকারণ রয়েছে যা বেশ মৌলিক তবে যতক্ষণ না আপনার পারমালিঙ্ক কাঠামো সবসময় একই ক্রম অনুসরণ করে, অর্থাত্ 'লেখক' শব্দটি সর্বদা একটি লেখক স্লাগ অনুসরণ করে যা সর্বদা একটি বই স্লাগ অনুসরণ করে যা সর্বদা অনুসরণ করা হয় একটি অধ্যায় স্লাগ দ্বারা, তারপর আপনি যেতে ভাল করা উচিত।

এই সমাধানে, 'অধ্যায়' এবং 'বইয়ের' জন্য কাস্টম পোস্ট ধরণের সংজ্ঞাটিতে পুনর্লিখনের স্লাগটি সংজ্ঞায়িত করার দরকার নেই, তবে 'লেখক' পুনরায় লেখার স্লাগটিকে কেবল 'লেখক' হিসাবে সেট করুন, নিম্নলিখিত ফাংশনগুলিকে আপনার ফাংশন.ফেপিতে রাখুন ph আপনার পুনর্লিখনের নিয়মগুলি ফাইল এবং "ফ্লাশ" করুন।

add_action( 'init', 'my_website_add_rewrite_tag' );
function my_website_add_rewrite_tag() {
    // defines the rewrite structure for 'chapters', needs to go first because the structure is longer
    // says that if the URL matches this rule, then it should display the 'chapters' post whose post name matches the last slug set
    add_rewrite_rule( '^authors/([^/]*)/([^/]*)/([^/]*)/?','index.php?chapters=$matches[3]','top' );
    // defines the rewrite structure for 'books'
    // says that if the URL matches this rule, then it should display the 'books' post whose post name matches the last slug set
    add_rewrite_rule( '^authors/([^/]*)/([^/]*)/?','index.php?books=$matches[2]','top' );   
}

// this filter runs whenever WordPress requests a post permalink, i.e. get_permalink(), etc.
// we will return our custom permalink for 'books' and 'chapters'. 'authors' is already good to go since we defined its rewrite slug in the CPT definition.
add_filter( 'post_type_link', 'my_website_filter_post_type_link', 1, 4 );
function my_website_filter_post_type_link( $post_link, $post, $leavename, $sample ) {
    switch( $post->post_type ) {

        case 'books':

            // I spoke with Dalton and he is using the CPT-onomies plugin to relate his custom post types so for this example, we are retrieving CPT-onomy information. this code can obviously be tweaked with whatever it takes to retrieve the desired information.
            // we need to find the author the book belongs to. using array_shift() makes sure only one author is allowed
            if ( $author = array_shift( wp_get_object_terms( $post->ID, 'authors' ) ) ) {
                if ( isset( $author->slug ) ) {
                    // create the new permalink
                    $post_link = home_url( user_trailingslashit( 'authors/' . $author->slug . '/' . $post->post_name ) );
                }
            }

            break;

        case 'chapters':

            // I spoke with Dalton and he is using the CPT-onomies plugin to relate his custom post types so for this example, we are retrieving CPT-onomy information. this code can obviously be tweaked with whatever it takes to retrieve the desired information.
            // we need to find the book it belongs to. using array_shift() makes sure only one book is allowed
            if ( $book = array_shift( wp_get_object_terms( $post->ID, 'books' ) ) ) {

                // now to find the author the book belongs to. using array_shift() makes sure only one author is allowed
                $author = array_shift( wp_get_object_terms( $book->term_id, 'authors' ) );

                if ( isset( $book->slug ) && $author && isset( $author->slug ) ) {
                    // create the new permalink
                    $post_link = home_url( user_trailingslashit( 'authors/' . $author->slug . '/' . $book->slug . '/' . $post->post_name ) );
                }

            }

            break;

    }
    return $post_link;
}

সিপিটি-ওনমিজ প্লাগইন সম্পর্কে আরও জানুন


এটি নিখুঁতভাবে কাজ করে, আপনাকে ধন্যবাদ! আমার মনে হচ্ছে আমি কেবল এত কিছু শিখেছি। সিপিটি-ওনমিজ প্লাগইনটি খুব দুর্দান্ত। wordpress.org/extend/plugins/cpt-onomies
ডাল্টন

আমার অনুভূতি আছে যে আপনার "লাইব্রেরি" বাড়ার সাথে সাথে আপনি কিছু প্রতিবন্ধকতাগুলি অতিক্রম করতে পারেন তবে ইতিমধ্যে আমার কিছু কোড মনে আছে তাই যদি আপনি করেন তবে কেবল আমাকে জানান।
রাহেল কারডেন

@ র্যাচেলকার্ডন যখন দুটি বইয়ের শিরোনাম একই তবে ভিন্ন লেখক রয়েছে তখন আপনি কী করবেন? পুনর্লিখিত URL- এ সংঘর্ষ হবে! কীভাবে সমাধান করবেন?
সেগফল্ট

1
@ সেগফল্ট আপনাকে সমস্ত লেখক স্লাগগুলি পুনরুদ্ধার করতে হবে যাতে আপনি এগুলি পুনরায় লেখার নিয়মে (হার্ডড): ফরচ ($ লেখক_স্লাগস হিসাবে $ লেখক_স্লাগ) {অ্যাড_উইরাইট_রুলে ('^ লেখক /'। $ লেখক_স্লাগ। '/ ([ ^ /] *) / ([[^ /] *) /? ',' সূচি.পিএইচপি? লেখক = '। $ লেখক_স্লাগ।' & অধ্যায় = $ ম্যাচ [2] ',' শীর্ষ ')); add_rewrite_rule ('^ লেখক /'। $ লেখক_স্লাগ। '/((^//3/)/?','index.php?authors='। $ লেখক_স্লাগ। '& বই = $ ম্যাচ [1]', 'শীর্ষ') ; }
র‌্যাচেল কারডেন

@ সেগফল্ট আপনি যদি সিপিটি-অনোমী ব্যবহার করেন, বা পোস্টের নাম / স্লাগগুলি পুনরুদ্ধার করতে get_posts () ব্যবহার করতে পারেন তবে আপনি get_terms () ব্যবহার করতে পারেন ।
রাহেল কারডেন

4

এ জাতীয় দৃশ্যের সাথে আমার ব্যক্তিগত অভিজ্ঞতা নেই তবে র্যান্ডি হোয়েট ওয়ার্ডক্যাম্প সান ফ্রান এ "সাউর্ডিনেট পোস্ট টাইপস" সম্পর্কে একটি উপস্থাপনা করেছিলেন যা আপনি কী বলছেন তা মনে হচ্ছে।

আলোচনার জন্য এখানে তার পৃষ্ঠা যা তার উপস্থাপনা স্লাইডগুলি এবং অধস্তন পোস্টের ধরণের সাথে কাজ করার জন্য তিনি নির্মিত প্লাগিনের লিঙ্কগুলি অন্তর্ভুক্ত করেছে: http://randyhoyt.com/wordpress/subordinate-post-tyype/


ধন্যবাদ, এটি একটি ভাল সংস্থান হিসাবে দেখায়। এটি নাতি-নাতনিদের সমর্থন করে কিনা তা পরিষ্কার নয়, যদিও (এটি আমার টেস্টে মনে হয় না) এবং এটি আসলে পারমিলিক্সের সাথে সহায়তা করে না। আমি ইতিমধ্যে আমার সন্তানের / পিতামাতার সম্পর্ক স্থাপনের একটি উপায় বের করেছি (যদিও এটি করা এটি একটি দুর্দান্ত উপায়), তবে পারমলিক্সটি এখন আমি যে বিষয়টি আটকে রয়েছি তা সত্যিই সেই সমস্যা।
ডাল্টন

1

নিয়মগুলি অতিরিক্ত পারমাস্ট্রাক্টস যুক্ত হওয়ার সাথে ক্রমে ডাব্লুপি_রাইটরাইটের অতিরিক্ত_রুলস_টপে যুক্ত হবে। সুতরাং, আপনি পোস্টের নিবন্ধগুলিতে যে অর্ডারটি সরিয়ে দেন সেটি পুনরায় লেখার নিয়মের ক্রমটি স্যুইচ করবে এবং অধ্যায়টি পুনরায় লেখার সাথে প্রথম মিলবে। তবে আপনি যেহেতু ক্যোরি_ওয়্যারটি অন্য পোস্ট_প্রকারগুলি থেকে ব্যবহার করছেন wp_query আপনার পছন্দের অধ্যায়ের সাথে মেলানোর আগে কোয়েরি পোস্ট নামের হিসাবে একটির সাথে মিলিয়ে যেতে পারে।

আমি পিতা বা মাতা লেখক এবং পিতা-মাতার বইয়ের স্থানধারীদের প্রতিনিধিত্ব করার জন্য নতুন নতুন লেখার ট্যাগ তৈরি করব, যেমন:

add_rewrite_tag('%parent-book%', '([^/]+)', 'parent_book=');

এটি করার সময়, আপনাকে 'প্যারেন্ট_বুক' জনসাধারণের জন্য 'ক্যোয়ারী_ভারস' ফিল্টার করতে হবে। তারপরে আপনাকে প্রি_জেট_পোস্টগুলিতে একটি ফিল্টার যুক্ত করতে হবে যা প্যারেন্ট_বুক ক্যোয়ারী_ভার হিসাবে সেটটিকে পোস্ট_আইডে রূপান্তর করবে এবং এটিকে 'পোস্ট_পিতা' হিসাবে সেট করবে।


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