मल्टीआईसाइट पर नियमों को मज़बूती से फिर से लिखने के लिए कैसे?


20

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

और फिर एक ठीक दिन कोई इसे मल्टीसाइट पर चलाने की कोशिश करता है।

इसके बजाय एक साधारण परिदृश्य की तरह:

  1. वर्डप्रेस साइट बनाई गई है
  2. प्लगइन स्थापित और सक्रिय है

अब आपके पास बुरे सपने हैं जैसे:

  1. प्लगइन स्थापित है और नेटवर्क सक्रिय है
  2. मल्टीसाइट में नई वर्डप्रेस साइट (या सौ) बनाई गई है

सिद्धांत रूप में यह सिर्फ काम करना चाहिए, है ना? व्यवहार में यह शानदार तरीके से गलत हो जाता है:

  • $wp_rewrite राज्य गलत साइट से हो सकता है
  • switch_to_blog() फिर से लिखना राज्य को ट्रैक नहीं करता है
  • "बाद में" भाग पूरी तरह से अलग ब्लॉग में हो सकता है
  • उन सभी अन्य प्लगइन्स, जिन्हें आप के साथ अच्छा खेलना चाहिए, विभिन्न साइटों पर लगातार सक्षम नहीं हो सकते हैं

उदाहरण के लिए आप इस मुद्दे को देख सकते हैं कि यह कैसे करने की कोशिश कर रहा है कि हर बार नई साइट बनने पर मुख्य साइट पर पर्मलिंक्स को उड़ा दिया जाए

तो कैसे के बारे में जाना प्लगइन होगा मज़बूती से पुनर्लेखन नियम निस्तब्धता एकाधिक में :

  1. साइट के लिए नई साइट कब बनाई जाती है?
  2. जब साइट के लिए निष्क्रिय से मौजूदा साइट को सक्रिय किया जाता है?
  3. जब प्लगइन नेटवर्क सक्रिय है, हर साइट के लिए?
  4. जब प्लगइन नेटवर्क निष्क्रिय है, हर साइट के लिए?
  5. संभवतः अन्य परिदृश्यों में, वैश्विक संदर्भ को फिर से लिखना शामिल है?

जवाबों:


11

नोट: यह एक अधूरा जवाब है जिसे वृद्धिशील रूप से विस्तारित किया जाएगा


मल्टीसाइट में नियमों को फिर से लिखने के लिए केवल विश्वसनीय तरीका है, प्राथमिक और या किसी अन्य ब्लॉग संदर्भ के क्रमिक संरचना को नष्ट किए बिना (आप पर और इससे स्विचन कैसे और क्या होता है) इस तरह दिए गए संदर्भ में नियमों को फिर से लिखना है। :

global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();

ऊपर यह सुनिश्चित करता है कि दिए गए संदर्भ के लिए सही पर्मलिंक संरचना फिर से बनाई गई है और फिर से लिखना नियमों को बनाने और डेटाबेस में परिवर्तन शुरू करने से पहले सेट किया गया है।

यह एकल साइट पर लागू नहीं होता है जहां संदर्भ मायने नहीं रखता है, क्योंकि केवल एक ही संदर्भ है।

flush_rewrite_rules()मेरी राय में इस आधार पर त्रुटिपूर्ण है कि यह सही संदर्भ मानता है, लेकिन हमारे उपयोग को ध्यान में नहीं रखता है switch_to_blogजिसके लिए संदर्भ को पूरी तरह से बदल देता है और खतरनाक क्षेत्रों में हमें छोड़ देता है यदि हम नियमों को फ्लश करने की कोशिश करते हैं, तो संभवतः।

यह flush_rewrite_rules()कैसा दिखता है के आंतरिक भाग हैं:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->flush_rules( $hard );
}

मैं एक कारण के बारे में नहीं सोच सकता कि ऐसा क्यों नहीं होना चाहिए:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->init(); //hello....
    $wp_rewrite->flush_rules( $hard );
}

... खासकर जब आप विचार करते हैं कि निर्माता WP_Rewriteक्या करता है? यह ऐसा करता है ...

public function __construct() {
    $this->init();
}

हालांकि इस लाइन को आगे बढ़ाने के लिए चिंता के अपने पहले बिंदु पर छूना,

तो बहु-संलयन में रीलीज़ फ़्लशिंग राईट नियमों के बारे में कैसे जाना जाएगा :

  • साइट के लिए नई साइट कब बनाई जाती है?

आइए देखें कि इस प्रक्रिया के दौरान वर्डप्रेस कोर क्या कहेंगे:

  • प्रथम wpmu_create_blog()
  • जो तब कॉल install_blog()जो बदले में कॉल करता हैpopulate_options()
  • फिर populate_options()विकल्प तालिका में डिफ़ॉल्ट पर्मलिंक संरचना सेट करता है
  • के बाद install_blog()भाग गया है, wp_install_defaults()तो कहा जाता है
  • फिर wp_install_defaults()नए बनाए गए साइट के लिए फिर से लिखना शुरू करने से पहले वर्तमान ब्लॉग पर वापस स्विच करने के नियमों को फ्लश करता है restore_current_blog()

महत्वपूर्ण बात यह है कि wp_install_defaults()जैसा मैंने ऊपर बताया है, वैसा ही नियम फ्लश करता है:

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

... क्योंकि यह सुनिश्चित करने का एकमात्र तरीका सही permalink_structureऔर नियम वर्तमान संदर्भ के लिए बनाए गए हैं।

इसके अलावा गितुब मुद्दे के भीतर स्पष्ट समस्या में , उपयोगकर्ता ने निम्नलिखित व्यवहार का अनुभव करने का कारण:

जब कोई नई साइट बनाई जाती है तो वह शीर्ष स्तर की साइट पर केवल पोस्ट स्तर के पर्मलिंक को तोड़ती है - अधिकांश पर्मलिंक विन्यासों में - सभी नहीं:

ये 2 प्रारूप सही ढंग से काम करते हैं।

डिफ़ॉल्ट - उम्मीद के मुताबिक काम करता है

दिन और नाम - उम्मीद के मुताबिक काम करता है

... ऐसा इसलिए है क्योंकि अगर /%year%/%monthnum%/%day%/%postname%/किसी नई साइट के निर्माण में प्राथमिक ब्लॉग में डे एंड नेम पर्मलिंक स्ट्रक्चर होता है , तो उसमें भी /%year%/%monthnum%/%day%/%postname%/डिफॉल्ट रूप से डे एंड नेम पर्मलिंक स्ट्रक्चर होता है, यही वजह है कि कोई खास समस्या तब पेश नहीं होती है जब योस्ट एसईओ प्लग इन को राइट करता है shutdownहुक पर नियम ।


के बारे में सही लगता है। एक नई साइट स्थापित करने के साथ कष्टप्रद बात यह है कि आप प्रक्रिया के दौरान हुक नहीं कर सकते हैं, केवल इसके बाद ही यह पूरा हो चुका है। जिसकी वजह से नियम दो बार फ्लश हो जाएंगे।
एंटोन टिम्मरमैन

बाउंटी का समय समाप्त हो जाता है, इसलिए यहां तलवार पर गिरने के संकेत मिलते हैं। :) हालांकि अभी भी बहुत कुछ पता लगाना है। :(
रारस्ट

क्या मैन्युअल रूप से सेट करना संभव नहीं है $wp_rewriteताकि आप प्रत्येक नेटवर्क साइट के माध्यम से लूप और रीसेट कर सकें? मेरे पास एक बड़ी नेटवर्क साइट है जो कस्टम प्लगइन्स पर कुछ पर्मलिंक मुद्दों से पीड़ित है। प्लगइन बनाना जो क्रोन जोड़ता है, ओवरकिल लगता है क्योंकि यह हमेशा उन्हें रीसेट करना होगा। कस्टम URL के साथ उन्हें लूप करना आदर्श होगा, लेकिन मुझे नहीं पता कि यह सभी साइटों के लिए कैसे करना है।
एडम पैटरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.