कहाँ, कब, और कैसे एक प्लगइन के दायरे के भीतर उचित रूप से फ्लश पुनर्लेखन नियम?


10

मैं एक अजीब मुद्दे के साथ फिर से लिखने के नियमों को ठीक से फ्लश नहीं कर रहा हूँ।

मैं का उपयोग कर की कोशिश की है flush_rewrite_rules();और flush_rewrite_rules(true);

मैंने भी भूमंडलीकरण $wp_rewriteका उपयोग करने की कोशिश की है $wp_rewrite->flush_rules();और$wp_rewrite->flush_rules(true);

जिनमें से कोई भी पुनर्लेखन नियमों को सही तरीके से नहीं दर्शाता है। उन कॉलों को वास्तव में कॉल किए जाने पर पुनर्लेखन नियमों को फ्लश किया जाता है। मुझे इसके बारे में कैसे पता है? डिबगिंग के लिए समाधान का उपयोग नियम फ्लशिंग को फिर से लिखना

वर्तमान में, मेरे पास पुनः सक्रियण नियम हैं जो प्लगइन सक्रियण और प्लगइन निष्क्रियकरण पर आधारित हैं। वहाँ कोई समस्या नहीं है।

मेरे पास प्लगइन को कॉन्फ़िगर करने के लिए उपयोगकर्ताओं के लिए एक प्लगइन प्रशासन सेटिंग्स पृष्ठ है। सेटिंग्स में से कुछ पर्मलिंक संरचना को समायोजित करते हैं, इसलिए फिर से लिखना नियमों को प्लगइन प्रशासन सेटिंग्स पेज "सेटिंग" पर फ़्लश करना आवश्यक है। (मानक का उपयोग करता है update_option();) सेटिंग्स को बचाने के लिए।

मैं यह नोट करना चाहूंगा कि निर्दिष्ट सेटिंग्स के आधार पर, कस्टम पोस्ट प्रकार उपयोगकर्ता निर्दिष्ट सेटिंग्स से मेल खाने के लिए बनाए जाते हैं। तो सेटिंग्स को सहेजने के तुरंत बाद फिर से लिखना होगा। यह वह जगह है जहाँ चीजें उचित रूप से काम नहीं कर रही हैं।

द्वारा दिए गए पुनर्लेखन नियमों को डिबग करने के लिए उपरोक्त लिंक समाधान @toschoप्रदर्शित कर रहा है कि यह पुनर्लेखन नियमों के टन को बहा रहा है। हालाँकि, जब कस्टम पोस्ट प्रकार एकवचन आइटम, या यहां तक ​​कि कस्टम पोस्ट टाइप संग्रह उस मामले के लिए, प्रत्येक 404 त्रुटियों के रूप में लौटते हैं।

कस्टम पोस्ट प्रकार सही और उचित रूप से पंजीकृत है। मैं निश्चित रूप से जानता हूं कि यह मुद्दा नहीं है।

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

कस्टम पोस्ट प्रकार तब हमेशा लोड होते हैं, और initसामान्य की तरह लोड होते हैं।

किसी कारण से, पुनर्लेखन नियम ठीक से फ्लश नहीं हो रहे हैं, क्योंकि जैसा मैंने पहले कहा था, कस्टम पोस्ट प्रकार के एकवचन या संग्रह अनुभाग पर जाकर 404 त्रुटियां वापस आती हैं।

अब अजीब हिस्सा है, अगर मैं सब करता हूं तो बस प्रशासन पर्मलिंक सेटिंग्स पृष्ठ पर जाएं, और फिर कस्टम पोस्ट प्रकार के एकवचन या संग्रह अनुभागों को देखने के लिए सामने के छोर पर वापस जाएं, वे जादुई रूप से अपेक्षित रूप से काम करते हैं।

क्या है कि प्रशासन permalinks सेटिंग्स पेज करता है कि मैं ऐसा नहीं कर रहा हूँ जो फिर से लिखना नियमों को उचित रूप से फ्लश करने की अनुमति देता है और मेरा नहीं?

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

क्या वर्डप्रेस में एक निश्चित बिंदु है जहां पुनर्लेखन नियमों को फ्लश करना अभी सभी नियमों को फ्लश नहीं करता है?

admin_menu - प्लगइन सेटिंग्स पेज वर्डप्रेस प्रशासन में जोड़ा जाता है।

add_options_page() - प्लगइन सेटिंग्स पेज सेटिंग्स मेनू के तहत जोड़ा जाता है।

सेटिंग पेज के लिए कॉलबैक में प्रस्तुत किया गया है add_options_page()। यह भी है जहां $_POSTप्लगइन सेटिंग्स को अपडेट करने और फिर से लिखने के नियमों को फ्लश करने के लिए संसाधित किया जाता है।

चूंकि यह पहले से ही एक लंबा सवाल है, मैं एक ऑफसाइट लिंक में कोड ब्लॉक (यदि यह मदद करता है) प्रदान करने के लिए तैयार होगा जो एक वैध उत्तर का उत्पादन करने में सहायता करता है।


1
ऐसा लगता है कि शायद आपको चीजों का क्रम गलत लगा है, कुछ कोड देखे बिना कहना मुश्किल है। पर्मलिंक्स एडमिन पेज सिर्फ कॉल करता है flush_rewrite_rules, जो सिर्फ rewrite_rulesविकल्प को हटा देता है और इसे पुन: बनाता है, आप फाइल को खोल सकते हैं wp-admin/options-permalinks.phpऔर देख सकते हैं कि यह कहां होता है। चूंकि यह ऑपरेशन पूरे विकल्प को हटा देता है, इसलिए आंशिक रूप से नियमों को फ्लश करना संभव नहीं है।
मिलो

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

मेरे प्लगइन में बस एक चेतावनी flush_rewrite_rules () मेरे लिए समस्या का हिस्सा बन गया। मैंने php हुक को हटा दिया और मैन्युअल रूप से केवल पर्मलिंक्स को अपडेट करना समाप्त कर दिया और मेरी CPT 404 त्रुटियां गायब हो गईं।
माइल

जवाबों:


5

फिर से लिखना नियमों को फ्लश करने के लिए सबसे अच्छी जगह प्लगइन सक्रियण / निष्क्रियकरण है।

function myplugin_activate() {
    // register taxonomies/post types here
    flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'myplugin_activate' );

function myplugin_deactivate() {
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

कोडेक्स लेख देखें

अग्रिम में माफी, मैंने इसे आपके प्रश्न के माध्यम से सभी तरह से नहीं बनाया है, इसलिए यह कुकी कटर प्रतिक्रिया का एक सा है।


1
आपके सुझाव के लिए धन्यवाद, लेकिन मुझे इसकी जानकारी है। मुद्दा प्लगइन सक्रियण / प्लगइन निष्क्रिय करने के बारे में नहीं है। यह उपयोगकर्ताओं को पहले से ही सक्रिय प्लगइन के लिए सेटिंग्स बदलने के साथ करना है, जो फिर से लिखना नियमों को समायोजित करते हैं, इस प्रकार एक फ्लश की आवश्यकता होती है।
माइकल एकल्लुंड

1
मुझे लगा कि मामला हो सकता है, लेकिन जब मैं आपका प्रश्न पढ़ रहा था तो मैं बहुत थक गया था। ialocin का समाधान आशाजनक लगता है, आशा है कि आपने इसे काम किया है।
हेलगेटेवीकिंग

4

अपना कोड देखे बिना, यह बताना मुश्किल है कि क्या गलत है। लेकिन कुछ सेटिंग्स को सहेजने के बाद admin_initअपने रिराइट नियमों को फ्लश करने के लिए नीचे दिखाया गया है।

कोड:

add_action('admin_init', 'wpse_123401_plugin_settings_flush_rewrite');
function wpse_123401_plugin_settings_flush_rewrite() {
    if ( get_option('plugin_settings_have_changed') == true ) {
        flush_rewrite_rules();
        update_option('plugin_settings_have_changed', false);
    }
}


आपको अपने सेटिंग पृष्ठ पर कुछ विकल्प सेट करना होगा या कुछ को ठीक करना होगा जहां सेटिंग सहेजने की प्रक्रिया में है। विकल्प के बिना इसे करना बुरा है, क्योंकि आप हर बार नियमों को फ्लश नहीं करना चाहते हैं।


नोट: अप्राप्त


2
या आप शायद एक क्षणिक का उपयोग कर सकते हैं? लेकिन निश्चित रूप से +1 प्रत्येक admin_init पर नियमों को फ्लश नहीं करने के लिए।
हेलगेटेवीकिंग

आप निश्चित रूप से क्षणिक के बारे में सही हैं, मुझे लगता है कि मैंने *_option()सेटिंग्स पृष्ठ के कारण चयन किया है । @ हेलाथेवाइकिंग
निकोलई

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

अंतर वास्तव में मामूली है, खासकर यदि मरीज स्थायी है, गैर-निष्कासित है, लेकिन निश्चित रूप से ग्राहकों की अन्य क्षमताएं हैं, लाभ जो कि अच्छा है। @ मट्टू लाई
निकोलई

3

मेरे पास एक पोस्ट प्रकार वर्ग फ़ाइल थी जो प्लगइन के विकल्प सेटिंग्स को पढ़ने और उपयोगकर्ता द्वारा निर्दिष्ट सेटिंग्स के आधार पर आवश्यक कस्टम पोस्ट प्रकार बनाने के लिए जिम्मेदार थी।

यह पोस्ट प्रकार वर्ग फ़ाइल हुक पर लोड की गई थी init

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

पोस्ट प्रकार वास्तव में कभी पंजीकृत नहीं थे, क्योंकि सेटिंग्स वास्तव में अभी तक सेट नहीं की गई थीं। किसी भी प्रकार के पंजीकरण के साथ समय से पहले समाप्त होने वाले पोस्ट प्रकार पंजीकरण वर्ग समाप्त हो गए।

समाधान था:

  1. प्लगइन सेटिंग्स को अपडेट करें।
  2. पोस्ट प्रकार वर्ग फ़ाइल को केवल एक बार यहां लोड करें ताकि नए पुनर्लेखन नियम बनाए जाएं।
  3. फिर से लिखना नियमों को फ्लश करें।

(पहले ... step2 गायब था - जैसा कि ऊपर बताया गया है ...)

अब से, पोस्ट प्रकार initहुक पर लोड किए जाएंगे , और पहले से निर्दिष्ट सेटिंग्स होंगे, पोस्ट प्रकारों को बनाने और उपयुक्त पुन: लिखने के नियमों के साथ जोड़ा जाएगा।

कभी भी किस कारण से, मुझे उपरोक्त तीन चरणों को पूरा करने के बाद, वर्तमान पृष्ठ पर पुनर्निर्देशित करने के लिए जावास्क्रिप्ट कॉल को जोड़ना पड़ा।

मुझे flush_rewrite_rules();प्लगइन के प्रशासन सेटिंग पृष्ठ पर कॉल भी जोड़ना था ।

तो यह सुनिश्चित करने के लिए कि सब कुछ बह गया है ...

चरण 1) प्लगइन के प्रशासन सेटिंग्स पृष्ठ पर नेविगेट करें। - प्रारंभिक फ्लश।

चरण 2) प्लगइन सेटिंग्स अपडेट करें। - दूसरा फ्लश।

चरण 3) पृष्ठ प्लगइन की सेटिंग पृष्ठ पर पुनर्निर्देशित करता है। इसके कारण ... तीसरा और अंतिम फ्लश (प्रारंभिक फ्लश के रूप में - प्लग की सेटिंग पेज पर जाने पर स्वचालित रूप से पूर्ण हो जाता है)

मैं यह नहीं कह रहा हूं कि यह एक व्यावहारिक समाधान है, लेकिन यह मेरे लिए काम करता है। बहुत अजीब मुद्दा है और सबसे अधिक संभावना मेरे कोडिंग बुनियादी ढांचे के साथ है।


1

@ tazo-todua यह मेरे लिए भी काम किया जब मैं मल्टीसाइट का उपयोग कर रहा था।

add_action( 'wpmu_new_blog', 'set_my_permalink_structure', 11, 2 );

function set_my_permalink_structure( $blog_id ) {

    switch_to_blog( $blog_id );

    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%postname%/' );
    $wp_rewrite->flush_rules();
    $wp_rewrite->init();

    restore_current_blog();
}

0

मेरा मिला समाधान WAS:

global $wp_rewrite; $wp_rewrite->flush_rules(); $wp_rewrite->init();

0

मुझे बिल्कुल वही समस्या हो रही थी। मेरे प्लगइन में, मेरे पास पोस्ट प्रकार हैं जो गतिशील रूप से बनाए गए हैं। वे इसलिए के register_post_type()दौरान एक स्थिर विधि के माध्यम से पंजीकृत नहीं हो सकते activation_hookहैं और इसलिए अभी तक सक्रिय नहीं हैं जब flush_rewrite_rules()इस हुक के दौरान चलाया जाता है (जो आम तौर पर फिर से लिखना नियमों को फ्लश करने का अनुशंसित तरीका है)।

अंत में मैं जिस स्वच्छ समाधान के साथ आ सकता था, वह था पोस्ट प्रकारों के पंजीकरण के बाद फिर से लिखना नियमों को फ्लश करना, लेकिन निश्चित रूप से केवल अगर ऐसा फ्लशिंग वास्तव में आवश्यक था (क्योंकि ऑपरेशन धीमा है)। मेरे मामले में मेरे पास वास्तव में कई कस्टम पोस्ट प्रकार हैं जो एक एकल आधार वर्ग से प्राप्त होते हैं और इसलिए यह कोड लागू करने के लिए वांछनीय था जो वहां फ्लशिंग करता है।

क्या फ्लशिंग आवश्यक है, इसका उत्पादन देखकर तय किया जा सकता है get_option( 'rewrite_rules' ):

class MyPostTypeClass {

public final function register_as_custom_post_type() {
    ...   //do all the setup of your post type here     
    $args = array(
                  ... //populate the other arguments as you see fit
                  'rewrite' => array('slug' => 'slug-of-your-post-type')
                 );
    register_post_type('post-type-name-of-your-post-type', $args );

    $rewrite_rules_must_be_fluhed = true;
    foreach( get_option( 'rewrite_rules' ) as $key => $rule)
        if(strpos($key, $args['rewrite']['slug'] ) === 0)
        {
            $rewrite_rules_must_be_fluhed = false;
            break;
        }
    if($rewrite_rules_must_be_fluhed)
        flush_rewrite_rules(true);
}
}

कमियां:

  • कुछ हद तक निर्भर करता है जिस पर सटीक रूप से फिर से लिखना WP WP के दौरान उत्पन्न करता है register_post_type()
  • जाँचना कि क्या प्रत्येक पृष्ठ लोड के दौरान फ्लशिंग आवश्यक है, कुछ ओवरहेड भी बनाता है।

लाभ:

  • पोस्ट प्रकार का प्रतिनिधित्व करने वाले वर्ग में पूरी तरह से समझाया गया।
  • यदि वास्तव में आवश्यक हो तो केवल पुनर्लेखन नियमों को प्रवाहित करता है।

केवल इस का उपयोग करें यदि आप अपने पोस्ट प्रकार को एक स्थिर फ़ंक्शन में पंजीकृत नहीं कर सकते हैं जो दोनों initऔर के दौरान कॉल कर सकते हैं activation_hook!

इस register_post_type()तरह से देखने के दौरान उत्पन्न हुए पुनर्लेखन नियम इस बात पर निर्भर करते हैं कि परीक्षण if(strpos($key, $args['rewrite']['slug'] ) === 0)को कुछ और विस्तृत, यानी, एक नियमित अभिव्यक्ति के साथ बदल दिया जा सकता है ।

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