Wordpress में कस्टम प्लगइन मार्ग


12

ठीक है तो मेरा प्रश्न काफी सरल है। मुझे अपने प्लगइन के लिए कुछ कस्टम रूटिंग नियमों को लागू करने की आवश्यकता है। वे मार्ग केवल एक तर्क (इसलिए कुछ भी जटिल नहीं) लेंगे और ऐसा लगेगा: http://www.example.org/myroute/myargument

और आदर्श रूप से, यह एक कस्टम वर्ग कहलाएगा, और एक कस्टम टेम्पलेट प्रदर्शित करेगा (जो सीधे वर्ग तक पहुंच सकता है)।

इसके लिए सबसे अच्छा तरीका क्या है? चियर्स

जवाबों:


15

आपको तीन महत्वपूर्ण काम करने होंगे:

  1. पास किए गए मानों में URI के कुछ हिस्सों को चालू करने के लिए एक कस्टम पुनर्लेखन नियम बनाएँ index.php
  2. जोड़ना myroute और myargumentवर्डप्रेस के प्रश्न चर श्वेत सूची, ताकि वर्डप्रेस सिर्फ उन्हें अनदेखा नहीं करता है, जब वे एक क्वेरी स्ट्रिंग में प्रदर्शित करने के।
  3. फिर से लिखना नियमों को फ्लश करें।

सबसे पहले, मैं यह सिफारिश करने जा रहा हूं कि इसके बजाय http://www.example.org/myroute/myargument, आप यूआरआई को इन विशेष 'मार्गों' में से एक माना जाना चाहिए। इस उदाहरण के लिए, मैंने उपसर्ग चुना है api, ताकि यह होगा http://www.example.org/api/myroute/myargument। मैंने चुनाapi क्योंकि जब मैंने कुछ RESTful किया, जैसे कि आप जो काम कर रहे हैं, वह एक एपीआई के लिए था।

कोड

add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules() {
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
    $newrules = array();
    $newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
    array_push( $vars, 'myroute', 'myargument' );
    return $vars;
}

त्वरित ब्रेकडाउन

यह सब काफी सीधे आगे है। रीजैक्स पैटर्न को वर्डप्रेस में सभी रीराइट नियमों की एक सूची में जोड़ा गया है, और आपका कस्टम पैटर्न सूची में सबसे ऊपर है। जब पैटर्न का मिलान किया जाता है, तो वर्डप्रेस फिर से लिखना नियमों की सूची के माध्यम से देखना बंद कर देगा, और रेगेक्स के कैप्चर किए गए मानों को संदर्भ में ( $matches[1]और $matches[2]) क्वेरी स्ट्रिंग में पास का उपयोग करेगा।index.php

क्वेरी चर myrouteऔर myargumentश्वेतसूची में जोड़ने से वर्डप्रेस केवल उन्हें त्यागने के बजाय उन पर ध्यान देता है।

अपने कस्टम मार्ग 'नामस्थान' का वैकल्पिक तरीका

यदि आप /api/उपसर्ग के रूप में उपयोग करने से बचना चाहते हैं , तो आप इसके बजाय एक क्वेरी स्ट्रिंग चर / क्षेत्र का उपयोग कर सकते हैं। ऐसा कुछ करने के लिए, आप regex को कुछ इस तरह से बदल देंगे (.*?)/(.+?)\\?api=1और फिर कॉल किए गए apiअतिरिक्त पैरामीटर के रूप में जोड़ देंगेarray_push()my_insert_query_vars()

यह कस्टम मार्ग को बदल देगा ताकि यह किसी भी समय ट्रिगर हो सके api=1क्वेरी स्ट्रिंग का पहला तत्व है, जैसे यह इसके लिए ट्रिगर होगाhttp://example.com/anytext/anytext?api=1

'नेमस्पेसिंग' शब्द के इस्तेमाल को नजरअंदाज करें - बस इसका इस्तेमाल संक्षिप्तता के लिए करें।

यदि आप किसी उपसर्ग या प्रत्यय के साथ 'नेमस्पेस' नहीं रखते हैं, तो आप URI पैटर्न से टकराकर समाप्त हो जाएंगे। ऐसा इसलिए है क्योंकि वर्डप्रेस के पास आपके कस्टम पैटर्न को किसी पोस्ट या पेज से अलग करने का कोई तरीका नहीं होगा। वर्डप्रेस को यह कैसे पता चलेगाmyroute यह एक वर्गीकरण, शब्द या मूल पृष्ठ नहीं है?

उम्मीद है की यह मदद करेगा।


1
आसान नोट: my_insert_rewrite_rulesपरिभाषा के पालन में परिभाषित नियम ! सबसे लंबे समय तक नियम से शुरू करें, फिर सबसे सरल तरीके से काम करें, अन्यथा / एपीआई / म्युटी ओवरराइड / अपी / म्यरौटी / मायारग्यूमेंट को ओवरराइड करेगा।
ईएमसी

1
@npc कस्टम रीराइट नियम बनाते समय जागरूक होने के लिए एक महत्वपूर्ण बिंदु, वे इस तरह से भी टकरा सकते हैं। हालांकि ऊपर दिए गए उदाहरण में, कोई समस्या नहीं है क्योंकि / एपीआई / myroute बस एक वैध मार्ग नहीं होगा।
एड्डीमोया

जब भी example.org/api/myroute/myargument पेज का अनुरोध किया गया था , तो कोई उनके टेम्पलेट निर्देशिका से कस्टम टेम्पलेट कैसे लोड कर सकता था?
मैट कीज

1
यहाँ वर्डप्रेस द्वारा वास्तविक और पूर्ण समाधान है: codex.wordpress.org/Rewrite_API/add_rewrite_rule
इमरान

6

ऊपर eddiemoya ने क्या किया इस पर थोड़ा विस्तार करने के लिए:

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

कस्टम टेम्पलेट कहीं भी स्थित हो सकता है, मेरे मामले में यह प्लगइन निर्देशिका में संग्रहीत है।

मैं यह भी जाँचना चाहता था कि क्या फिर से लिखने के नियमों को प्लगइन सक्रियण के दौरान फ्लश करने की आवश्यकता है, इसलिए मैंने उसे एक register_activation_hook पर डाल दिया

मैंने जो किया उसका पूरा उदाहरण नीचे देखें:

मिल्डो की सलाह के आधार पर अद्यतन सरल

class Your_Class
{

    public function init()
    {
        add_filter( 'template_include', array( $this, 'include_template' ) );
        add_filter( 'init', array( $this, 'rewrite_rules' ) );
    }

    public function include_template( $template )
    {
        //try and get the query var we registered in our query_vars() function
        $account_page = get_query_var( 'account_page' );

        //if the query var has data, we must be on the right page, load our custom template
        if ( $account_page ) {
            return PATH_TO_PLUGIN_TEMPLATES_DIR . 'register.php';
        }

        return $template;
    }

    public function flush_rules()
    {
        $this->rewrite_rules();

        flush_rewrite_rules();
    }

    public function rewrite_rules()
    {
        add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
        add_rewrite_tag( '%account_page%', '([^&]+)' );
    }

}

add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );

// One time activation functions
register_activation_hook( PATH_TO_PLUGIN_FILE, array( new Your_Class, 'flush_rules' ) );

1
आप केवल उपयोग कर सकते हैं add_rewrite_endpoint, जो आपके लिए नियम उत्पन्न करेगा और एक बार में क्वेरी संस्करण जोड़ देगा। यह भी कि यदि आप अपने स्वयं के पुनर्लेखन नियम जोड़ रहे हैं, तो मैं add_rewrite_ruleफ़िल्टर करने के बजाय फ़ंक्शन का सुझाव देता हूं rewrite_rules_array
मिलो

धन्यवाद मिलो, मैंने पुनः लिखने की सरणी को फ़िल्टर करने के बजाय add_rewrite_rule का उपयोग करने के लिए कोड अपडेट किया। मैंने add_rewrite_endpoint को देखा, लेकिन मुझे लगता है कि add_rewrite_tag मेरी जरूरतों के लिए एक बेहतर फिट हो सकता है। ऐसा लगता है कि add_rewrite_endpoint ज्यादातर उपयोगी है यदि आप मौजूदा WP पुनर्लेखन में अतिरिक्त तर्क जोड़ना चाहते हैं। अगर मैं यहां गलत हूं तो मुझे सुधारो।
मैट कीज

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