Permalinks के साथ नेस्टेड कस्टम पोस्ट प्रकार


9

मैं एक बहु-स्तरीय कस्टम पोस्ट प्रकार की संरचना की स्थापना करने की कोशिश कर रहा हूं जो कि पेर्मलिंक की तरह दिखती है authors/books/chapters, लेखकों, पुस्तकों, और अध्यायों के साथ सभी अपने स्वयं के कस्टम पोस्ट प्रकार के रूप में स्थापित होते हैं। उदाहरण के लिए, इस साइट पर एक विशिष्ट URL जैसा दिखाई दे सकता हैexample.com/authors/stephen-king/the-shining/chapter-3/

प्रत्येक अध्याय केवल एक पुस्तक का हो सकता है, और प्रत्येक पुस्तक केवल एक लेखक की हो सकती है। मैंने लेखकों और पुस्तकों के लिए सीपीटी के बजाय टैक्सोनोमी का उपयोग करने पर विचार किया है, लेकिन मुझे प्रत्येक आइटम के साथ मेटाडेटा को जोड़ने की आवश्यकता है और मैं इसके लिए पोस्ट इंटरफ़ेस पसंद करता हूं।

मैं सीपीटी एक स्तर में एक प्रविष्टि के एक बच्चे के रूप में बस प्रत्येक कस्टम पोस्ट की स्थापना के द्वारा वहाँ सबसे अधिक तरीका है। उदाहरण के लिए, मैं "अध्याय 3" बनाता हूं और एक कस्टम मेटा-बॉक्स का उपयोग करके माता-पिता के रूप में "द शाइनिंग" प्रदान करता हूं। "द शाइनिंग" में माता-पिता के रूप में "स्टीफन किंग" होता है। मुझे इन रिश्तों को बनाने में कोई परेशानी नहीं हुई है।

मैं CPT स्लग में रीमैट टैग का उपयोग कर रहा हूं और पर्मलिंक काम करना चाहता हूं, लेकिन वे काफी सही नहीं हैं। री-राइट एनालाइज़र का उपयोग करते हुए, मैं देख सकता हूं कि पुनर्लेखन नियम वास्तव में उत्पन्न होते हैं, लेकिन वे सही क्रम में नहीं लगते हैं और इसलिए अन्य नियमों को पहले संसाधित किया जाता है।

यहाँ मेरे पुनर्लेखन विश्लेषक का स्क्रीनशॉट है।

यहां बताया गया है कि मैंने अपना CPT कैसे पंजीकृत किया है:

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 पोते-पोतियां हो सकती हैं, जो पृष्ठों के व्यवस्थापक के लिए प्रबंधन करना बहुत कठिन होगा। इसके अलावा, हमें पोस्ट प्रकार के अनुसार क्वेरी करने में सक्षम होना चाहिए।
डाल्टन

मैं एक समाधान पर काम कर रहा हूं, लेकिन मेरे पास एक त्वरित प्रश्न है: क्या प्रत्येक पर्मलिंक के सामने 'लेखक' होना महत्वपूर्ण है? क्योंकि वह स्टिकर लगता है। मुझे लगता है कि यह वर्डप्रेस को थोड़ा बहुत भ्रमित कर रहा है, खासकर जब से WP लेखक पृष्ठों के लिए एक पर्मलिंक स्लग का भी उपयोग किया जाता है। यदि 'लेखक' की आवश्यकता है, तो मुझे लगता है कि पूरी बात अभी भी सक्षम है ... यह अभी और अधिक जटिल होगा।
राहेल वार्डन

उफ़, मुझे महसूस नहीं हुआ कि लेखक अंतर्निर्मित WP लेखक स्लग के साथ संघर्ष करने वाला था। नहीं, यह आवश्यक नहीं है, यह कुछ भी हो सकता है। मुझे लगा कि मुझे वहां कुछ चाहिए क्योंकि यह सीपीटी है, लेकिन यह आसानी से "लेखक" या कुछ और हो सकता है।
डाल्टन

मुझे लगता है कि भ्रम वास्तव में CPTs को आधार स्लग के रूप में 'लेखक' साझा करने के साथ है। एक बार जब आप 'लेखक' को CPT के लेखकों के लिए स्लग के रूप में सेट करते हैं, और फिर आप CPT के अध्यायों के लिए 'लेखक /% लेखक%' को CPT के अध्यायों के लिए 'लेखक /% लेखक% /% पुस्तक%' सेट करते हैं। ', तो वर्डप्रेस सोचता है कि' किताबें 'के लिए पदों और' अध्यायों 'के लिए पदों का शाब्दिक रूप से' लेखकों 'के लिए पदानुक्रमित बच्चे पोस्ट हैं। क्या इसका कोई मतलब है? मेरे परीक्षण में आप 'लेखक' को सीपीटी 'लेखकों' के आधार के रूप में रख सकते हैं और यह ठीक काम करता है। इसलिए मेरे पिछले प्रश्न को प्रतिस्थापित करें: क्या आपको 'लेखक' की आवश्यकता है या स्लग% लेखक% के साथ शुरू हो सकता है?
राहेल वार्डन

जवाबों:


11

यदि आप 'लेखकों' को पर्मलिंक में आधार स्लग के रूप में रखना चाहते हैं, उदाहरण के लिए 'लेखक' सीपीटी के लिए उदाहरण. com/authors/stephen-king/, उदाहरण. com/authors/stephen-king/ the- shining/ 'किताबें' CPT और उदाहरण .com/authors /stephen- king/ the-shining/chapter-3/ 'अध्याय' CPT के लिए, वर्डप्रेस बहुत सोचेंगे कि सब कुछ एक 'लेखक' का पद है या 'लेखकों का एक श्रेणीबद्ध बच्चा' है। 'पोस्ट और, चूंकि ऐसा नहीं है, वर्डप्रेस अंततः बहुत भ्रमित हो जाता है।

इसके साथ ही कहा गया है, एक वर्कअराउंड है जो काफी बुनियादी है लेकिन जब तक आपकी पर्मलिंक संरचना हमेशा एक ही क्रम का पालन करती है, अर्थात 'ऑथर' शब्द का हमेशा लेखक स्लग द्वारा अनुसरण किया जाता है, जिसे हमेशा एक पुस्तक स्लग द्वारा अनुसरण किया जाता है, जिसका हमेशा पालन किया जाता है एक अध्याय स्लग द्वारा, फिर आपको जाना अच्छा होना चाहिए।

इस समाधान में, 'अध्यायों' और 'पुस्तकों' के लिए कस्टम पोस्ट प्रकार परिभाषा में पुनर्लेखन स्लग को परिभाषित करने की आवश्यकता नहीं है, लेकिन 'लेखकों' को फिर से लिखने के रूप में स्लग को केवल 'लेखकों' के रूप में सेट करें, निम्न कोड को अपने कार्यों में रखें। फ़ाइल और अपने नियमों को फिर से लिखना "फ्लश"।

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;
}

CPT-onomies plugin के बारे में और जानें


यह पूरी तरह से काम करता है, धन्यवाद! मुझे ऐसा लग रहा है कि मैंने अभी बहुत कुछ सीखा है। CPT-onomies प्लगइन वास्तव में बहुत अच्छा है। wordpress.org/extend/plugins/cpt-onomies
Dalton

मुझे लगता है कि आप कुछ बाधाओं के पार आ सकते हैं क्योंकि आपकी "लाइब्रेरी" बढ़ती है लेकिन मेरे पास पहले से ही कुछ कोड हैं इसलिए यदि आप ऐसा करते हैं, तो मुझे बताएं।
राहेल वार्डन

@RachelCarden आप क्या करते हैं जब दो किताबों का शीर्षक एक ही हो लेकिन अलग-अलग लेखक हों? फिर से लिखे गए URL में टक्कर होगी! इसे आप कैसे हल करते हैं?
सेगफॉल्ट

1
@Segfault आपको लेखक के सभी स्लग को पुनः प्राप्त करना होगा, ताकि आप उन्हें फिर से लिखने के नियम (ओं) में हार्ड कोड दे सकें: foreach ($ author_slugs as $ author_slug) {add_rewrite_rule ('^ लेखक /' '$ author_slug' /] ([] ^ /] *) / ([^ /] *)? ',' index.php; लेखक = '। $ author_slug।' और अध्याय = $ मैच [2] ',' टॉप '); add_rewrite_rule ('^ लेखक /'। $ author_slug। '/( dooney/acing*)/?''''index.php?authors='। $ author_slug। 'और पुस्तकें = $ मिलान [1],' शीर्ष ')। ; }
राहेल वार्डन

यदि आप CPT-onomy का उपयोग कर रहे हैं, तो get_terms () का उपयोग कर सकते हैं , या get_posts () पोस्ट नाम / स्लग को पुनः प्राप्त करने के लिए उपयोग कर सकते हैं ।
राहेल वार्डन

4

मेरे पास इस तरह के परिदृश्य के साथ व्यक्तिगत अनुभव नहीं है, लेकिन रैंडी होयट ने वर्डकैंप सैन फ्रेंक में पिछले सप्ताह के अंत में "अधीनस्थ पोस्ट प्रकार" के बारे में एक प्रस्तुति दी थी, जो आपको लगता है कि आप किस बारे में बात कर रहे हैं।

यहां बात करने के लिए उनका पृष्ठ है जिसमें उनकी प्रस्तुति स्लाइड और एक प्लगइन के लिंक शामिल हैं जो उन्होंने अधीनस्थ पद प्रकारों के साथ काम करने के लिए बनाया था: http://randyhoyt.com/wordpress/subordinate-post-types/


धन्यवाद, यह एक अच्छे संसाधन जैसा दिखता है। यह स्पष्ट नहीं है कि यह नाती-पोतों के संबंधों का समर्थन करता है, हालांकि (यह मेरे परीक्षण में नहीं लगता है) और यह वास्तव में पर्मलिंक्स के साथ मदद नहीं करता है। मैंने पहले ही अपने बच्चे / माता-पिता के संबंधों को स्थापित करने का एक तरीका खोज लिया है (हालांकि यह करने का यह एक बहुत अच्छा तरीका है), लेकिन पर्मलिंक्स वास्तव में अब मैं जिस मुद्दे पर फंस गया हूं वह मुद्दा है।
डाल्टन

1

नियमों को WP_Rewrite के extra_rules_top में जोड़ दिया जाएगा ताकि अतिरिक्त पारमास्ट्रक्ट जुड़ जाए। इसलिए, आप पोस्ट प्रकारों को पंजीकृत करने वाले ऑर्डर को स्विच करना फिर से लिखना नियमों को बनाए रखना होगा ताकि अध्याय फिर से लिखना पहले से मेल खाता हो जाए। हालाँकि, जब से आप अन्य post_types से query_var का उपयोग कर रहे हैं, तो wp_query उन मेलों में से किसी एक को मेल कर सकता है, जैसा कि आप चाहते हैं कि अध्याय से मेल खाने से पहले queried पोस्ट नाम।

मैं मूल लेखक और मूल-पुस्तक के लिए प्लेसहोल्डर का प्रतिनिधित्व करने के लिए नए पुनर्लेखन टैग बनाऊंगा, अर्थात:

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

ऐसा करते समय, आपको 'parent_book' को सार्वजनिक करने के लिए 'query_vars' को फ़िल्टर करना होगा। फिर आपको pre_get_posts पर एक फ़िल्टर जोड़ने की आवश्यकता होगी, जो parent_book query_var के रूप में सेट नाम को post_id में बदल देगा और इसे 'post_parent' के रूप में सेट करेगा।


क्या आप बताए गए फ़िल्टर के लिए कोड उदाहरण प्रदान कर सकते हैं? इसके अलावा, पोते सीपीटी के लिए फिर से लिखना टैग कैसा लगेगा?
डाल्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.