विभिन्न प्रकार के कस्टम पोस्ट प्रकारों के बीच अभिभावक-बाल संबंध कैसे सेट करें


14

मैंने अभी एक पोस्ट टाइप "एपिसोड" और एक पोस्ट टाइप "कार्टून-सीरीज़" के बीच एक पोस्ट / पैरेंट संबंध स्थापित किया है।

मैंने माता-पिता को किसी अन्य पोस्ट प्रकार से असाइन करने के लिए मेटा बॉक्स में जोड़ने के लिए इस बिट कोड का उपयोग किया है:

add_action('admin_menu', function() {
    remove_meta_box('pageparentdiv', 'episodes', 'normal');
});
add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
    } // end hierarchical check.
}

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

domain/episodes/series-name/episode-name

श्रृंखला के लिए url है:

domain/cartoon-series/series-name

मैं इस प्रकरण के लिए url पसंद करूंगा:

domain/cartoon-series/series-name/episode-name

मैं क्या खो रहा हूँ? क्या पूरे पोस्ट प्रकार को किसी अन्य पोस्ट प्रकार का बच्चा बनाना संभव है? तो, फिर मैं एपिसोड की सूची के लिए url भी प्राप्त कर सकता हूं:

domain/cartoon-series/series-name/episodes

धन्यवाद! मैट


अनुरोध के अनुसार, यहां दो कस्टम पोस्ट प्रकारों के लिए कोड दिया गया है:

$labels = array(
    "name" => "Cartoon Series",
    "singular_name" => "Cartoon Series",
    "menu_name" => "Cartoon Series",
    "all_items" => "All Cartoon Series",
    "add_new" => "Add New",
    "add_new_item" => "Add New Cartoon Series",
    "edit" => "Edit",
    "edit_item" => "Edit Cartoon Series",
    "new_item" => "New Cartoon Series",
    "view" => "View",
    "view_item" => "View Cartoon Series",
    "search_items" => "Search Cartoon Series",
    "not_found" => "No Cartoon Series Found",
    "not_found_in_trash" => "No Cartoon Series Found in Trash",
    "parent" => "Parent Cartoon Series",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "cartoon-series", $args );

$labels = array(
    "name" => "Episodes",
    "singular_name" => "Episode",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "episodes", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "episodes", $args );

मैं सीपीटी यूआई प्लगइन का उपयोग कर रहा हूं, इसलिए मैं उस कोड को सीधे संपादित नहीं कर सकता। यह सिर्फ निर्यात कोड CPT UI प्रदान करता है।

मेरे पास कोई दूसरा कोड नहीं है जो दो सीपीटी को जोड़ता है। शायद यही मुझे याद आ रहा है। मुझे बस वह कोड ऑनलाइन मिला जो लिंक करने के लिए पृष्ठ पर मेटाबेस को रखता है। क्या यह काम करने के लिए पर्याप्त नहीं है? ऐसा लगता है कि यह post_parent सेट करता है।

धन्यवाद! मैट


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

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

मुझे लगता है कि एक पदानुक्रमित पद प्रकार आपकी स्थिति के लिए पूरी तरह से फिट बैठता है।
साइबरमेट मारा

2
मैं वास्तव में इस के साथ जटिल होने की कोशिश नहीं कर रहा हूँ। यदि अधिक सुरुचिपूर्ण समाधान उपलब्ध है, तो मैं सभी कान हूं। मैं सामान्य रूप से WP में नया हूं और अब तक बहुत अच्छा कर चुका हूं, लेकिन इसने मुझे स्टम्प किया है। आमतौर पर, मैं बस कार्टून श्रृंखला को एक श्रेणी बनाता हूं और इसे एपिसोड में असाइन करता हूं। समस्या यह है, मेरे पास कार्टून श्रृंखला के तहत जाने के लिए एपिसोड के अलावा अन्य नेस्टेड डेटा भी हैं। इसलिए, ऐसा लगता है कि कार्टून श्रृंखला को सीपीटी के रूप में अच्छी तरह से होना चाहिए। यह जटिल है! : -D क्या आप मुझे केवल एक पदानुक्रमित पद प्रकार का उपयोग करके समझा सकते हैं?
मैटाटन

जवाबों:


9

अंत में मुझे काम करने का हल मिल गया है। कार्टून-श्रृंखला को पंजीकृत किया जा सकता है जैसा कि आपने किया था, लेकिन कस्टम पोस्ट प्रकारों को पदानुक्रमित नहीं किया जा सकता है (मुझे लगता है कि वर्डप्रेस को उम्मीद है कि माता-पिता की सामग्री बच्चे की सामग्री के समान है यदि संबंध डेटाबेस तालिका post_parentमें उपयोग किया जाता wp_postsहै)।

एपिसोड पंजीकृत करते समय, पुनर्लेखन नियम को आपके इच्छित स्लग पर सेट किया जाना चाहिए, जो कि है cartoon-series/%series_name%। फिर हम %series_name%मूल cartoon-seriesपोस्ट प्रकार के वास्तविक नाम के साथ बदलने के लिए लिंक लिंक को फ़िल्टर कर सकते हैं और वर्डप्रेस से कहने के लिए एक पुन: लिखने का नियम बना सकते हैं जब कार्टून-श्रृंखला पोस्ट प्रकार का अनुरोध किया जाता है और जब एक एपिसोड होता है।

add_action('init', function(){
    $labels = array(
        "name" => "Cartoon Series",
        "singular_name" => "Cartoon Series",
        "menu_name" => "Cartoon Series",
        "all_items" => "All Cartoon Series",
        "add_new" => "Add New",
        "add_new_item" => "Add New Cartoon Series",
        "edit" => "Edit",
        "edit_item" => "Edit Cartoon Series",
        "new_item" => "New Cartoon Series",
        "view" => "View",
        "view_item" => "View Cartoon Series",
        "search_items" => "Search Cartoon Series",
        "not_found" => "No Cartoon Series Found",
        "not_found_in_trash" => "No Cartoon Series Found in Trash",
        "parent" => "Parent Cartoon Series",
    );

    $args = array(
        "labels" => $labels,
         "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => true,
        "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "cartoon-series", $args );

    $labels = array(
        "name" => "Episodes",
        "singular_name" => "Episode",
    );

    $args = array(
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "cartoon-series/%series_name%", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "episodes", $args );

});

add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
}

add_action( 'init', function() {

    add_rewrite_rule( '^cartoon-series/(.*)/([^/]+)/?$','index.php?episodes=$matches[2]','top' );

});

add_filter( 'post_type_link', function( $link, $post ) {
    if ( 'episodes' == get_post_type( $post ) ) {
        //Lets go to get the parent cartoon-series name
        if( $post->post_parent ) {
            $parent = get_post( $post->post_parent );
            if( !empty($parent->post_name) ) {
                return str_replace( '%series_name%', $parent->post_name, $link );
            }
        } else {
            //This seems to not work. It is intented to build pretty permalinks
            //when episodes has not parent, but it seems that it would need
            //additional rewrite rules
            //return str_replace( '/%series_name%', '', $link );
        }

    }
    return $link;
}, 10, 2 );

नोट : उपरोक्त कोड को सहेजने से पहले और इसे आज़माने से पहले नियमों को फिर से लिखना याद रखें। के लिए जाओwp-admin/options-permalink.php और पुनर्लेखन नियमों को फिर से दर्ज करने के लिए सहेजें पर क्लिक करें।

नोट 2 : यह संभवतया है कि अधिक लिखित नियमों को जोड़ना होगा, उदाहरण के लिए पेजेंट पदों के लिए काम करना। इसके अलावा, संपूर्ण समाधान के लिए कुछ और काम करने की आवश्यकता हो सकती है, उदाहरण के लिए, जब एक cartoon-seriesडिलीट भी सभी चाइल्ड एपिसोड हटाते हैं? पोस्ट अभिभावक द्वारा एपिसोड फ़िल्टर करने के लिए व्यवस्थापक संपादन स्क्रीन में एक फ़िल्टर जोड़ें? मूल श्रृंखला नाम दिखाने के लिए व्यवस्थापक संपादन स्क्रीन में एपिसोड शीर्षक को संशोधित करें?


इस मामले की तलाश के लिए धन्यवाद! ऐसा लगता है कि आपके द्वारा पोस्ट किया गया कोड url से कार्टून श्रृंखला का नाम छोड़ रहा है। एपिसोड के नाम के साथ% series_name% के स्थान पर% Series_name% एपिसोड के माता-पिता का नाम होना चाहिए। एपिसोड का नाम उसके बाद होगा। किसी कारण से, मेरे लिए माता-पिता का चयन करने के लिए कार्टून श्रृंखला बॉक्स पॉपुलेट नहीं किया जा रहा है। इसलिए मुझे लगा कि एपिसोड को पदानुक्रमित बनाने की जरूरत है। यह पता लगाने की कोशिश क्यों की जा रही है।
मट्टेटन

हां, कार्टून श्रृंखला मेटा बॉक्स को आबाद करने के लिए एपिसोड को पदानुक्रमिक होना चाहिए।
मैटटन 20

एपिसोडिक पदानुक्रमित के साथ इसलिए मैं माता-पिता को सेट कर सकता हूं, यूआरएल बस खराब हो गया। जैसा कि आपने सुझाव दिया था स्लग के साथ, मुझे दो बार url में श्रृंखला का नाम मिला। इसलिए, domain/episodes/series-name/episode-nameपहले की तरह, मुझे मिलाdomain/episodes/series-name/series-name/episode-name
मट्टेटन

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

आह, मेरी क्षमायाचना, मैंने जल्दी से स्कैन किया था और सोचा था कि भाग एक ही था। आप सही हैं, पृष्ठ अब लोड करता है और url सही दिखता है।
मट्टेटन

1

इस मामले में हार्ड-कोडिंग की कोई आवश्यकता नहीं है ... आप बस इस प्लगइन का उपयोग कर सकते हैं:

https://wordpress.org/plugins/add-hierarchy-parent-to-post/

आप इससे कोड भी हड़प सकते हैं। हालाँकि, यह एक पूर्ण समाधान नहीं हो सकता है।


-1

आपको इसके लिए अपना स्वयं का URL पार्सिंग कोड लिखना होगा क्योंकि वर्डप्रेस को उस पोस्ट के प्रकार को जानने की आवश्यकता होती है, जो url संरचना के आधार पर DB से प्राप्त करने का प्रयास करता है और आपकी url संरचना इसके लिए कोई संकेत नहीं देती है।

यह कुछ ऐसा नहीं है जो वर्डप्रेस के रीराइट नियमों एपीआई के साथ करना बहुत आसान है, लेकिन ऐसा कुछ भी नहीं है जो आपको फिर से लिखे गए तंत्र को दरकिनार कर दे और अपने आप से यूआरएल को पार्स न करे। कुछ इस तरह से 1. रन वर्डप्रेस नियमों को फिर से चलाएं। यदि कोई सामग्री प्रदर्शित की गई थी तो उसे प्रदर्शित करें और बाहर निकलें। url का पहला भाग प्राप्त करें, जांचें कि क्या कोई पोस्ट मिलान है जो अपेक्षित पोस्ट प्रकार के साथ स्लग है। URL के बाकी हिस्सों पर लूप सत्यापित करते हैं कि पोस्ट मौजूद हैं और हैं सही प्रकार में। 4. यदि सब कुछ मैच के अंतिम पोस्ट को प्रदर्शित करता है, तो 404 पृष्ठ प्रदर्शित करें

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