Add_rewrite_rule को समझना


11

मैं add_rewrite_ruleएक परमल को url से निकालने और अनुरोध के माध्यम से पारित करने के लिए काम करने की कोशिश कर रहा हूं । इस बारे में कई पोस्ट देखे, लेकिन यह काम कर पाने के लिए प्रतीत नहीं हो सकता।

यदि एक url एक निश्चित स्ट्रिंग के साथ शुरू होता है, तो मैं इसे url से निकालना चाहूंगा और इसे क्वेरी params के रूप में पास करूंगा।

उदाहरण अनुरोध url:

http://domain.com/foo/my_page

यह करने के लिए बदल जाएगा

http://domain.com/my_page?param=foo

यदि 'फू' मौजूद नहीं है, तो इसे सामान्य अनुरोध के रूप में जाना चाहिए। यह तर्क मेरी साइट (मूल रूप से foo / *) पर किसी भी पेज url या कस्टम पोस्ट टाइप url पर लागू होना चाहिए। यह सोचकर कि यह पास के रूप में कार्य करेगा, अगर url के पास 'foo' स्ट्रिप है और तब यह सामान्य बात है तो Wordpress के साथ गुजरें।

मेरे पास पहले से ही एक अनुमत क्वेरी_वेयर के रूप में 'परम' है।

कुल मिलाकर, इसे निम्नलिखित के लिए काम करने की आवश्यकता होगी:

  • / foo / my_page (पेज)
  • / foo / my_folder / my_page (उप-पृष्ठ)
  • / foo / example_type (कस्टम पोस्ट आर्काइव)
  • / foo / example_type / example_post (कस्टम पोस्ट सिंगल)

कोई URL, अर्थ पोस्ट, श्रेणियां, टैग इत्यादि, न केवल pageपोस्ट प्रकार, या केवल किसी पृष्ठ पर? पदानुक्रम में माता-पिता / बाल पृष्ठों के बारे में क्या?
मिलो

@ मिलो मैंने आपके लिए इसे स्पष्ट किया है। मैं केवल पृष्ठों और कस्टम पोस्ट प्रकारों (संग्रह और एकल पृष्ठों) का उपयोग कर रहा हूं।
लुई डब्ल्यू

जवाबों:


8

एक बुनियादी नियम जो आपके उदाहरण के लिए काम करेगा:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

इसके बाद जो कुछ भी आता है वह लेता है foo/और pagenameक्वेरी के लिए सेट करता है , और फिर paramस्थिर मूल्य प्राप्त करता है foo। यदि आपको अलग-अलग URL पैटर्न की आवश्यकता है, तो आपको प्रत्येक अद्वितीय पैटर्न के लिए अतिरिक्त नियमों की आवश्यकता होगी। पुनर्लेखन नियमों के भीतर सेट किए जा सकने वाले विभिन्न क्वेरी संस्करण के लिए WP_Queryडॉक्स देखें । नए जोड़ने के बाद नियमों को फिर से लिखना न भूलें। यह Permalinks Settings पेज पर जाकर किया जा सकता है।

अब अपने उदाहरण URL पर जाएं:

http://domain.com/foo/my_page

सही पेज लोड करेगा, लेकिन यह बिलकुल ऐसा नहीं होगा कि आप यहां आएँ:

http://domain.com/my_page?param=foo

क्योंकि आंतरिक पुनर्लेखन का उपयोग करते समय, क्वेरी ऑब्जेक्ट के paramभीतर सेट किया जाता है $wp_query, न कि $_GETसुपरग्लोबल। यदि आपको उस कोड के साथ काम करने की आवश्यकता है जो एक मूल्य की तलाश में है $_GET, तो आपको उस मान को सेट करने के लिए एक अतिरिक्त कदम की आवश्यकता होगी:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

विचार करने के लिए एक अन्य विधि एंडपॉइंट का उपयोग कर रही है, इसलिए /foo/उपसर्ग के बजाय URL के अंत में होगा। इसका लाभ यह है कि एपीआई add_rewrite_endpointआपके लिए आवश्यक सभी नियमों को जोड़कर सरल बनाता है, जिसमें पेजिंग को सक्षम करना भी शामिल है।


स्पष्टीकरण के माध्यम से धन्यवाद। पास लगता है, पृष्ठों के लिए काम करता है लेकिन मुझे कस्टम पोस्ट संग्रह और एकल यूआरएल के लिए 404 त्रुटि दे रहा है।
लुई डब्ल्यू

अच्छी तरह से हाँ, जैसा कि मैंने कहा, आपको अतिरिक्त नियम जोड़ने की आवश्यकता है जो उनमें से प्रत्येक पैटर्न से मेल खाते हैं। मुझे नहीं पता कि वे URL आपके सेटअप पर क्या दिखते हैं।
मिलो

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

इसके अलावा, यह उप-पृष्ठों के लिए काम नहीं करता है।
लुई डब्ल्यू

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

6

ठीक है, मैंने सभी 3 प्रकार के अनुरोधों के लिए काम करने के उदाहरण दिए हैं। यह प्रयोग करने और उन्हें काम करने के लिए चारों ओर गड़बड़ करने में एक टन लगा। मुझे लगता है कि मिलो अपने सवालों के जवाब देने में लोगों को परेशान करने में अच्छा है।

अनगिनत बदलावों के बाद और मुझे पता चला कि पेरालिंक को ताज़ा करने के लिए add_rewrite_url के बाहर के url का पता लगाना बहुत आसान था और एक बार वे काम करने के बाद फिर से लिखना परिभाषित करते हैं। उदाहरण दिया जा रहा है index.php?param=foo&post_type=example_type

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

यहां 3 नियम दिए गए हैं जो मेरी सभी जरूरतों को पूरा करते हैं। पृष्ठ / उप-पृष्ठ नियम को एक ही में जोड़ा गया था।

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

इसके अतिरिक्त मैंने जो किया है वह कई कस्टम पोस्ट प्रकार नियमों को जोड़ने के लिए एक लूप सेट किया गया है। याद रखें, आपको कस्टम पोस्ट प्रकार add_rewrite_rule नियमों को परिभाषित करना होगा जब आप अपने पृष्ठ / उप-पृष्ठ वाइल्डकार्ड नियमों को परिभाषित करते हैं।

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

पुनर्लेखन विश्लेषक जो मिलो पारित काफी सहायक होता है जब करने की कोशिश कर बेहतर Wordpress पृष्ठों / पदों के लिए कैसे प्रश्नों को समझने था।


शो के लिए देर हो चुकी है, लेकिन क्या मैं आपको दूसरे उदाहरण के लिए पिंग कर सकता हूं? माइंड यू, मुझे पूरी तरह से add_rewrite_rule के $ टैग पैरामीटर की समझ नहीं है। इसका कोई मतलब नहीं है। न ही मैं उदाहरण समझता हूं कि pagename = $ माचिस [1] ’का उपयोग कर। हुह ??? मेरे पास domain.com/detail?id=2&it=3 जैसा URL है। मैं चाहता हूं कि पृष्ठ domain.com/detail/2-3/ हो। तुम इच्छुक हो?
डेबी कुर्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.