कस्टम टैक्सोनॉमी और कस्टम पोस्ट प्रकार जैसे बेस-नेम / पैरेंट-टैक्स / चाइल्ड-टैक्स / कस्टम-पोस्ट-टाइप-नाम के साथ एक पर्मलिंक संरचना कैसे बनाएं


53

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

मैं जो चाहता हूं, उसे स्पष्ट करने के लिए:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

आप इस जुर्माने का निर्माण पदों और श्रेणियों के साथ कर सकते हैं, आप इसे कस्टम टैक्सोनॉमी और कस्टम पोस्ट प्रकारों के साथ कैसे करते हैं? मुझे पता है कि आपको 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),पदानुक्रमित स्लग प्राप्त करने के लिए उपयोग करने की आवश्यकता है , जो संग्रह पृष्ठों पर ठीक काम करता है, लेकिन कस्टम पोस्ट प्रकार के पद 404 तक आते हैं। यदि मैं 'hierarchical' => trueभाग को हटाता हूं, तो पद काम करते हैं, लेकिन मैं पदानुक्रमित यूआरएल (केवल / आधार) खो देता हूं / पोती-बिल्ली / पद-नाम / कार्य)।

तो, कोई समाधान? बहुत बहुत धन्यवाद, यह अब मुझे लगभग 3 सप्ताह से पागल कर रहा है।

जवाबों:


68

अन्य उत्तरों के टुकड़ों का एक संयोजन करने के बाद मैंने इसे काम कर लिया! तो यहाँ उन लोगों के लिए एक समाधान है जो इससे भी जूझ रहे हैं:

इस पोस्ट और इस एक कुछ मेरी मदद की, तो उन लोगों के लिए धन्यवाद।

ध्यान दें, यह सभी कोड, आपके प्रारंभिक कस्टम पोस्ट प्रकार और टैक्सोनॉमी पंजीकरण कोड आपकी functions.phpफ़ाइल में जाता है ।

अपने कस्टम पोस्ट प्रकारों और टैक्सोनॉमीज़ को परिभाषित करते समय सबसे पहले अपने स्लग प्राप्त करें: कस्टम पोस्ट प्रकार के लिए यह होना चाहिए basename/%taxonomy_name%और आपकी टैक्सोनॉमी के लिए स्लग बस होना चाहिए basename'hierarchical' => trueअपने url में नेस्टेड शब्द प्राप्त करने के लिए टैक्सोनॉमी रीराइट एरे को भी जोड़ना न भूलें । यह भी सुनिश्चित करें कि दोनों मामलों में query_varसेट है true

आपको एक नया पुनर्लेखन नियम जोड़ने की आवश्यकता है ताकि वर्डप्रेस को पता चले कि आपकी यूआरएल संरचना की व्याख्या कैसे की जाए। मेरे मामले में uri का कस्टम पोस्ट प्रकार भाग हमेशा 5 वां uri खंड होगा, इसलिए मैंने अपने मैच नियम को उसी के अनुसार परिभाषित किया। ध्यान दें कि यदि आपको अधिक या कम uri खंडों का उपयोग करना है, तो आपको इसे बदलना पड़ सकता है। यदि आपके पास नेस्टेड शर्तों के स्तर अलग-अलग हैं, तो आपको यह जांचने के लिए एक फ़ंक्शन लिखना होगा कि क्या अंतिम uri खंड एक कस्टम पोस्ट प्रकार है या यह जानने के लिए कौन सा नियम है (मुझसे पूछें कि क्या आपको मदद चाहिए? उस)।

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]'; 

    return array_merge($newRules, $rules);
}

फिर आपको इस कोड को जोड़ने की जरूरत है कि वर्कप्रेस को %taxonomy_name%अपने कस्टम पोस्ट टाइप हैंडल करने के लिए स्लग स्ट्रक्चर को कैसे लिखें:

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'custom_post_type_name')
        return $link;

    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

मैंने वर्डप्रेस के आधार पर एक कस्टम फंक्शन बनाया get_category_parents:

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
    $chain = '';   
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)    
        $name = $parent -> slug;        
else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name . $separator;    
    return $chain;    
}

फिर आपको अपने पर्मलिंक को फ्लश करने की जरूरत है (बस अपने पर्मलिंक सेटिंग्स पेज को लोड करें)।

अब सब कुछ 'काम' उम्मीद से करना चाहिए! जाओ वर्गीकरण की शर्तों का एक गुच्छा बनाएं और उन्हें सही ढंग से घोंसले में रखें, फिर कुछ कस्टम पोस्ट प्रकार के पोस्ट बनाएं और उन्हें सही तरीके से वर्गीकृत करें। आप स्लग के साथ एक पेज भी बना सकते हैं basename, और सब कुछ मेरे प्रश्न में निर्दिष्ट तरीके से काम करना चाहिए। आप यह देखने के लिए कि वे कैसे दिखते हैं और साइडबार में अपनी नेस्टेड श्रेणियों को दिखाने के लिए कुछ प्रकार के टैक्सोनॉमी विजेट प्लगइन जोड़ सकते हैं, को नियंत्रित करने के लिए कुछ कस्टम टैक्सोनॉमी आर्काइव पेज बनाना चाहते हैं ।

आशा है कि आपकी मदद करता है!


निश्चित- प्रश्न देखें। जेफ, आपकी व्याख्या के लिए धन्यवाद! लेकिन क्या आपके लिए कस्टम पोस्टपाइप / टैक्सोनॉमी बिल्ड पोस्ट करना संभव हो सकता है? तो मैं देख सकता हूं कि मैं क्या गलत कर रहा हूं ? वास्तव में धन्यवाद होगा!
बोस

हे जेफ, आपके उत्तर के लिए धन्यवाद! मैं लगभग वहाँ हूँ, 4 घंटे इस से लड़ने के बाद। मेरी एकमात्र समस्या यह है कि मुझे पोस्ट नाम से पहले एक डबल स्लैश मिलता है (इस प्रकार: पोर्टफोलियो / डिसिनो-ग्रेफिको -2 / लोगो // alquimia-sonora /) क्या आप मेरी मदद कर सकते हैं?
कोमोरलेस

1
@ कोड, आपके कोड को देखे बिना निश्चित नहीं है, लेकिन एक ऐसी जगह की तलाश करें जहां आप अपने पोस्ट नाम से पहले मैन्युअल रूप से एक स्लैश को परिभाषित करते हैं, जैसे शायद cpt स्लग पंजीकरण या फ़िल्टर_पोस्ट_टाइप फ़ंक्शन में? यदि आप नीचे ट्रैक नहीं कर रहे हैं जहां आप अतिरिक्त स्लैश जोड़ रहे हैं, तो आप get_taxonomy_parents फ़ंक्शन के फ़िल्टर मान को फ़िल्टर_post_type_link में अंतिम मान से निकाल सकते हैं, क्योंकि यह आपको ट्रैश स्लैश के साथ छोड़ देगा, जो सबसे पहले है दोगुना। सौभाग्य।
जेफ

1
"यदि आपके पास नेस्टेड शर्तों का स्तर अलग-अलग है, तो आपको यह जांचने के लिए एक फ़ंक्शन लिखना होगा कि क्या अंतिम uri सेगमेंट एक कस्टम पोस्ट प्रकार है या यह जानने के लिए कौन सा नियम है (मुझे पूछें कि क्या आपको मदद चाहिए? उस पर) ... "ठीक है, क्या आप मेरी मदद कर सकते हैं, कृपया? :)
शव यात्रा

2
^ यह वही है जो मुझे चाहिए था। किसी को पता है कि यह कैसे करना है? मेरा प्रश्न यहाँ देखें: wordpress.stackexchange.com/questions/102246/…
reikyoushin

2

इस प्लगइन पर एक नज़र डालें । यह श्रेणियों के लिए पदानुक्रमित URL प्रदान करता है, लेकिन आप आसानी से किसी भी वर्गीकरण को अनुकूलित कर सकते हैं।

नियम निर्माण एक पुनरावर्ती कार्य का अनुसरण करता है


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