कस्टम पोस्ट प्रकार के लिए flush_rewrite_rules का सबसे अच्छा तरीका, म्यू-प्लग इन प्लगइन?


9

मैं एक प्लगइन लिख रहा हूं जो एक कस्टम पोस्ट प्रकार (अन्य चीजों के बीच) को त्वरित करता है। यह एक मल्टीसाइट प्लगइन है और निर्देशिका म्यू-प्लगइन्स में रहता है ।

इस स्थिति में flush_rewrite_rules () को संभालने के लिए सबसे अच्छा अभ्यास क्या है ? 'सामान्य' प्लगइन के लिए आप इसे सक्रियण हुक में करेंगे - जो कि उन हुक के उपलब्ध नहीं होने के बाद से प्लग-इन के लिए संभव नहीं होगा।

चूंकि यह कस्टम पोस्ट प्रकार को पंजीकृत करने के बाद "एक बार" घटना माना जाता है, क्या यह मेरी कक्षा में ऐसा कुछ करने के लिए समझ में आएगा जो सीपीटी को पंजीकृत करता है:

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

इसलिए, सीपीटी पंजीकरण हर 'इनिट' कार्रवाई पर होता है - लेकिन अगर मेरे पास यह अधिकार है, तो फिर से लिखना नियम केवल एक बार होता है। कभी भी

क्या मैं सही रास्ते पर हूं?

(संपादित करें): मैंने अभी इसकी कोशिश की; मेरे सीपीटी में 404 त्रुटि नहीं पाई गई है, इसलिए पुनर्लेखन नियम काम नहीं कर रहे हैं :-(

(# 2 संपादित करें): मैंने इस प्रश्न में दिखाए गए अनुसार वैश्विक चर को एक्सेस करने के लिए समाधान की कोशिश की: मल्टीसाइट पर मज़बूती से फिर से लिखना कैसे? - मैं यह दिखाने के लिए ऊपर अपना कोड उदाहरण अपडेट करूंगा। दुर्भाग्य से मुझे सीपीटी लोड करने की कोशिश करते समय अभी भी 404 त्रुटि हो रही है। मैं देखता हूं कि पुनर्लेखन नियम डेटाबेस में संग्रहीत किए जा रहे हैं, ऐसा लगता है जैसे वे उपयोग नहीं किए जा रहे हैं। मैं हार गया हूं।



वास्तव में ऐसा करने का कोई उचित तरीका नहीं है। यह टिप्पणी लिखने के समय मूल रूप से सबसे अच्छा है।
पीटीयर गोपन ने

@PieterGoosen - धन्यवाद, मैंने वह पहले देखा था, और मैंने दूसरे समाधान पर विचार करने के लिए अपने प्रश्न को अद्यतन किया। अभी भी काम नहीं कर रहा है। मुझे आश्चर्य है कि अगर मैंने दूसरे उत्तर को देखने से पहले flush_rewrite_rules () निष्पादित करके कुछ तोड़ दिया? हो सकता है कि मुझे सही प्रक्रिया का सही परीक्षण करने के लिए अपनी टेस्ट साइट को डिलीट करना पड़े और उसे फिर से स्थापित करना पड़े?
CC

यह संभव हो सकता है। एक मल्टीसाइट में गलत तरीके से फ्लश को फिर से लिखना नियमों को निष्पादित करना आपके नेटवर्क में सभी पुनर्लेखन नियमों को तोड़ सकता है। अगर मैं तुम कहाँ, मैं बस नए सिरे से शुरू होगा। बस आशा है कि यह एक स्थानीय स्थापित अंत नहीं है एक जीवित साइट ;-)
पीटर गोएंस

ठीक है ... मैं कोशिश करूँगा कि। और नहीं, यह एक परीक्षण स्थल है और मुझे लगता है कि मैं डीबी मिटा सकता हूं और अब तक मेरी नींद में नेटवर्क कॉन्फिगर को फिर से सेट कर सकता हूं! :-)
CC

जवाबों:


2

flush_rewrite_rulesसमारोह एक विषय या एक प्लगइन की तरह कुछ संदर्भों हुक पर आधारित विश्वसनीय है लेकिन मुझे यकीन है कि अगर यह एक के लिए काम करता नहीं हूँmu-plugin

मेरा कथन इस तथ्य पर आधारित है कि वर्डप्रेस इस तरह से आरंभ किया गया है:

  • wp-settings.phpफ़ाइल को कॉल करें
  • do_action( 'muplugins_loaded' );हुक को कॉल करें , यहां आपका प्लगइन इनिशियलाइज़ किया गया है
  • $GLOBALS['wp_rewrite'] = new WP_Rewrite();यहां कॉल करें विधि flush_rulesआरंभ की है और अभी से उपलब्ध है
  • do_action( 'setup_theme' );कहा जाता है और मैं शर्त लगाता हूं कि मेरे सारे पैसे इस हुक पर flush_rewrite_rulesकाम करेंगे

समाधान?

व्यक्तिगत रूप से, मुझे विश्वसनीय रूप से rewrite_rules विकल्प को हटाने की आवश्यकता है।

delete_option('rewrite_rules');

या

update_option('rewrite_rules', '' );

जब भी वर्डप्रेस की कमी rewrite_rulesहोगी, यह उन्हें वापस बनाएगा, यह भी वही है जो flush_rulesविधि करता है।

वर्डप्रेस निष्पादन प्रवाह में ऐसे बिंदु हैं जहां इस तरह के कार्य उपलब्ध नहीं हैं। वर्डप्रेस के मूल में भी मुझे यह कथन मिला

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

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

पुनश्च: मैं इस तरह का एक आत्म-प्रशंसक प्रशंसक नहीं हूं, लेकिन मैंने इस बारे में एक लेख बहुत पहले लिखा है और मुझे लगता है कि यह अभी भी इसके लिए खड़ा है


1

एमयू-प्लगिन को हमेशा सक्रिय माना जाता है, इसलिए हुक register_activation_hookऔर register_deactivation_hookहुक को कभी नहीं बुलाया जाता है।

इसके बजाय एक प्लगइन संस्करण जोड़ें, जिसे जब भी फिर से लिखना नियमों को प्रभावित करने वाले किसी भी परिवर्तन को अद्यतन किया जाना चाहिए:

namespace My\Namespace;

define( 'MY_CPTS_REWRITES', '2020-05-19.1' );

function maybe_flush_rewrite_rules() {
    if ( update_option('MY_CPTS_REWRITES', MY_CPTS_REWRITES) ) {
        flush_rewrite_rules(false);
    }
}

add_action( 'init', __NAMESPACE__ . '\\maybe_flush_rewrite_rules', 11 );

हुक प्राथमिकता यह निर्धारित करने के लिए 11 के लिए सेट की गई है कि पोस्ट प्रकार पंजीकृत होने के बाद इसे चलाया जाए, (डिफ़ॉल्ट प्राथमिकता 10 का उपयोग किया जाता है)।

ध्यान दें कि परीक्षण के लिए update_option()हम एक ऐसी दौड़ स्थिति से बचते हैं जो उच्च ट्रैफ़िक साइटों पर मौजूद होती है, जहाँ get_option()कॉल और कॉल के बीच update_option()मूल्य को दूसरे अनुरोध पर बदल दिया जाता है, जिससे अनन्त फ्लश हो जाता है। update_option()विकल्प के पुराने मूल्य के लिए एक चेक शामिल है और यदि विकल्प बदला जाता है तो केवल सही रिटर्न।

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


0

यदि आपके म्यू-प्लगइन के पास विकल्प हैं तो मैं उन्हें अपडेट करने के बाद फ्लश लगा दूंगा:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.