วิธีที่ดีที่สุดในการ flush_rewrite_rules สำหรับประเภทโพสต์ที่กำหนดเองในปลั๊กอิน mu-plugins?


9

ฉันกำลังเขียนปลั๊กอินที่สร้างประเภทโพสต์ที่กำหนดเอง (เหนือสิ่งอื่นใด) มันเป็นปลั๊กอิน MultiSite การและอาศัยอยู่ในไดเรกทอรีMU-ปลั๊กอิน

แนวปฏิบัติที่ดีที่สุดสำหรับการจัดการflush_rewrite_rules ()ในสถานการณ์นี้คืออะไร สำหรับปลั๊กอิน 'ปกติ' ที่คุณต้องทำในฮุคการเปิดใช้งานซึ่งเป็นไปไม่ได้สำหรับปลั๊กอินที่ต้องใช้เนื่องจากตะขอเหล่านั้นไม่พร้อมใช้งาน

เนื่องจากสิ่งนี้น่าจะเป็นเหตุการณ์ "ครั้งเดียว" หลังจากลงทะเบียนประเภทโพสต์ที่กำหนดเองมันจะทำให้การทำอะไรเช่นนี้ในชั้นเรียนของฉันที่ลงทะเบียน CPT:

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' ) );

ดังนั้นการลงทะเบียน CPT จะเกิดขึ้นกับทุกการกระทำ 'init' แต่ถ้าฉันมีสิทธิ์นี้กฎการเขียนใหม่จะเกิดขึ้นเพียงครั้งเดียวเท่านั้น เคย

ฉันกำลังติดตามใช่ไหม?

(แก้ไข): ฉันลองแล้ว CPT ของฉันกำลังให้ข้อผิดพลาด 404 ที่ไม่พบดังนั้นกฎการเขียนซ้ำไม่ทำงาน :-(

(แก้ไข # 2): ฉันลองวิธีแก้ปัญหาในการเข้าถึงตัวแปรโกลบอลดังที่แสดงในคำถามนี้: จะล้างกฎการเขียนซ้ำบนไซต์หลายไซต์ได้อย่างไร - ฉันจะอัปเดตตัวอย่างรหัสของฉันด้านบนเพื่อแสดงสิ่งนี้ น่าเสียดายที่ฉันยังคงได้รับข้อผิดพลาด 404 เมื่อพยายามโหลด CPT ฉันเห็นว่ากฎการเขียนซ้ำถูกจัดเก็บในฐานข้อมูลดูเหมือนว่าไม่ได้ใช้งาน ฉันหลงทาง.


1
เป็นไปได้ที่ซ้ำกันของวิธีล้างกฎการเขียน
Pieter Goosen

ไม่มีวิธีที่เหมาะสมในการทำเช่นนี้จริงๆ นี่เป็นพื้นฐานที่ดีที่สุดในขณะที่เขียนความคิดเห็นนี้
Pieter Goosen

@PieterGoosen - ขอบคุณฉันเห็นก่อนหน้านี้แล้วและฉันได้อัปเดตคำถามของฉันเพื่อพิจารณาโซลูชันอื่น ยังไม่ทำงาน ฉันสงสัยว่าฉันทำบางสิ่งบางอย่างโดยดำเนินการ flush_rewrite_rules () ก่อนเห็นคำตอบอื่นหรือไม่ บางทีฉันอาจต้องลบเว็บไซต์ทดสอบและสร้างใหม่อีกครั้งเพื่อทดสอบขั้นตอนที่ถูกต้องหรือไม่
CC

นั่นอาจเป็นไปได้ การดำเนินการกฎการเขียนใหม่แบบฟลัชอย่างไม่ถูกต้องในหลายไซต์สามารถทำลายกฎการเขียนซ้ำทั้งหมดในเครือข่ายของคุณ ถ้าฉันอยู่ที่คุณฉันจะเริ่มต้นใหม่ หวังว่านี่จะเป็นการติดตั้งในพื้นที่ไม่ใช่ไซต์สด ;-)
Pieter Goosen

ใช่ ... ฉันจะลองดู และไม่มันเป็นเว็บไซต์ทดสอบและฉันคิดว่าฉันสามารถลบ DB และตั้งค่าเครือข่ายใหม่ในโหมดสลีปได้แล้วตอนนี้! :-)
CC

คำตอบ:


2

flush_rewrite_rulesฟังก์ชั่นมีความน่าเชื่อถือในบริบทบางอย่างเช่นธีมหรือปลั๊กอินขึ้นอยู่กับตะขอ แต่ผมไม่แน่ใจว่ามันทำงานให้กับmu-plugin

คำสั่งของฉันขึ้นอยู่กับความจริงที่ว่า WordPress เริ่มต้นด้วยวิธีนี้:

  • เรียกwp-settings.phpไฟล์
  • เรียกใช้do_action( 'muplugins_loaded' );hook นี่คือปลั๊กอินของคุณถูกเริ่มต้น
  • โทรหา$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', '' );

เมื่อใดก็ตามที่ WordPress ขาดrewrite_rulesมันจะสร้างมันขึ้นมาใหม่นี่เป็นflush_rulesวิธีการที่ทำ

มีจุดต่าง ๆ ในโฟลว์การประมวลผล WordPress ที่ฟังก์ชั่นแบบนี้ไม่สามารถใช้ได้ แม้ในแกนกลางของ WordPress ฉันพบคำสั่งนี้

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

ปัญหาเดียวก็คือประสิทธิภาพอย่าทำสิ่งนี้กับทุกคำขอเพราะเป็นกระบวนการที่ยากในการสร้างขึ้นมาใหม่ อย่างที่ฉันเห็นคุณต้องการล้างพวกเขาเฉพาะที่สายแรกและนี่คือสิ่งที่ดี

PS: ฉันไม่ได้เป็นแฟนโปรโมชั่นของตัวเอง แต่ฉันยังเขียนบทความเกี่ยวกับเรื่องนี้มานานแล้วและฉันคิดว่ามันยังคงยืนหยัดเพื่อสิ่งนี้


0

หาก mu-plugin ของคุณมีตัวเลือกฉันจะใส่ flush หลังจากอัปเดต:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.