कस्टम टैक्सोनॉमी और पेज स्लग संघर्ष को फिर से लिखते हैं 404


9

मैं अपनी कस्टम टैक्सोनॉमी बनाने के लिए कस्टम पोस्ट टाइप UI प्लगइन का उपयोग कर रहा हूं। मेरे पास एक पोर्टफोलियो है जो परियोजनाओं और कस्टम पोस्ट प्रकारों से बना है, जिसमें 2 कस्टम टेक्नोलॉज़ीज ऑफ टेक्नोलॉजी और क्लाइंट हैं। ग्राहकों के वर्गीकरण को एक कस्टम रिगिट स्लग है portfolio/clients/, जबकि टेक्नॉलॉजी टैक्सोनॉमी के पास एक कस्टम रीराइट स्लग हैportfolio/

रिवाइट्स:
portfolio/html <- पेज HTML का उपयोग करके
portfolio/clients/client-aसभी प्रोजेक्ट प्रदर्शित करता है - पेज क्लाइंट ए के लिए सभी प्रोजेक्ट प्रदर्शित करता है

अब जब मैं उन ग्राहकों के लिए एक लैंडिंग पृष्ठ बनाने की कोशिश करता हूं जिनके पास एक url स्लग है जो /portfolio/clientsमुझे 404 पृष्ठ मिलता है। मुझे पूरा यकीन है कि यह टैक्नोलाजी के यूआरएल रीराइट्स के परस्पर विरोधी होने के कारण है। मैं अनुमान लगा रहा हूं क्योंकि यह प्रौद्योगिकी वर्गीकरण में इसके लिए खोज करता है, यह मौजूद नहीं है फिर यह 404 पृष्ठ को बाहर निकालता है। तो मुझे काम करने के लिए url rewrite स्लग कैसे मिलता है ताकि जब मैं हिट करूँ /portfolio/clients, तो यह 404 पेज को वापस नहीं भेजता है और यह सही पेज टेम्पलेट का उपयोग करता है?

जवाबों:


16

आपको "आंशिक क्रिया पुनर्लेखन नियम" की आवश्यकता प्रतीत होती है। Verbose rewrite rules का अर्थ है कि सभी पृष्ठ शीर्ष पर रखे गए हैं क्योंकि वर्डप्रेस किसी पृष्ठ और पोस्ट के बीच अंतर का पता नहीं लगा सकता है। यहाँ यह सोचता है कि यह कर सकता है, क्योंकि इस एक को छोड़कर, फॉर्म के सभी URL portfolio/([^/]+)/आपकी portfolioटैक्सोनॉमी के हैं portfolio/clients/। आपको उस एक को फिर से लिखना नियमों के शीर्ष पर रखना होगा, इसलिए यह अधिक सामान्य पोर्टफोलियो टैक्सोनॉमी से पहले मेल खाता है। आप शायद सभी रीराइट नियमों को क्रिया के रूप में लागू करने के लिए बाध्य कर सकते हैं, लेकिन यदि आपके पास बहुत सारे पृष्ठ हैं, तो यह प्रदर्शन को प्रभावित करेगा।

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

एक पृष्ठ केवल एक पुनर्लेखन नियम उत्पन्न नहीं करता है, यह एक समूह उत्पन्न करता है:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

आपको इन्हें स्वयं बनाने की आवश्यकता नहीं है, आप इनकी शक्ति का पुनः उपयोग कर सकते हैं WP_Rewrite। इसकी page_rewrite_rules()विधि देखें: यदि हम क्रिया मोड में हैं, तो यह सभी पृष्ठों (के माध्यम से page_uri_index()) और उनके अनुलग्नकों की एक सूची प्राप्त करता है , %pagename%पुनर्लेखन टैग को अधिलेखित करता है , और इस पृष्ठ के लिए फिर से लिखना नियम बनाता है। हम यह भी कर सकते हैं:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

यह हमें पृष्ठों के लिए नियम देगा, लेकिन अभी तक पृष्ठ में उपयोग किए गए अनुलग्नकों के लिए नहीं। यदि आप भी उन्हें चाहते हैं, तो आप प्रत्येक अनुलग्नक के लिए चरण को दोहराते हैं, लेकिन add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')( page_rewrite_rules()अधिक विवरण के लिए देखें)।

अच्छा है, हमें नियम मिल गए हैं, लेकिन अब आपको उन्हें किसी तरह से पूरी तरह से फिर से लिखना संरचना में जोड़ना होगा। आप ऐसा कर सकते हैं add_rewrite_rule(), लेकिन आपको इसे $page_rewrite_rulesसरणी में उत्पन्न हर नियम के लिए कहना होगा । इस कारण से, कई लोगों में हुक फिल्टर , जब से तुम सिर्फ वहाँ सरणी संशोधित कर सकते हैं।rewrite_rules_array

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

इस फ़िल्टर को शामिल करने के बाद, आपको पुन: लिखने के नियमों को फ़्लश करना चाहिए (एक बार, प्रत्येक पृष्ठ लोड नहीं, क्योंकि यह काफी भारी है)। आप इसे कॉल करके flush_rewrite_rules()या "Permalinks" सेटिंग पेज पर जाकर कर सकते हैं ।


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