ที่ไหนเมื่อใดและจะล้างกฎการเขียนซ้ำอย่างถูกต้องภายในขอบเขตของปลั๊กอินอย่างไร


10

ฉันมีปัญหาแปลก ๆ นิดหน่อยกับกฎการเขียนซ้ำไม่ได้ล้างอย่างถูกต้อง

ผมได้ลองใช้และflush_rewrite_rules();flush_rewrite_rules(true);

ฉันยังได้ลอง$wp_rewriteใช้โลกาภิวัตน์$wp_rewrite->flush_rules();และ$wp_rewrite->flush_rules(true);

ไม่ปรากฏว่ากำลังล้างกฎการเขียนซ้ำอย่างถูกต้อง การเรียกเหล่านั้นเป็นการล้างกฎการเขียนซ้ำเมื่อถูกเรียก ฉันจะรู้สิ่งนี้ได้อย่างไร การใช้โซลูชันสำหรับการดีบักการเขียนกฎการลบทิ้ง

ขณะนี้ฉันได้เขียนกฎใหม่อีกครั้งเมื่อเปิดใช้งานปลั๊กอินและปิดใช้งานปลั๊กอิน ไม่มีปัญหา

ฉันมีหน้าการตั้งค่าการจัดการปลั๊กอินสำหรับผู้ใช้เพื่อกำหนดค่าปลั๊กอิน การตั้งค่าบางอย่างปรับโครงสร้าง permalink ดังนั้นกฎการเขียนใหม่จะต้องล้างในหน้าการตั้งค่าการบริหารปลั๊กอิน "บันทึกการตั้งค่า" (ใช้มาตรฐานupdate_option();) เพื่อบันทึกการตั้งค่า

ฉันต้องการที่จะทราบว่าประเภทโพสต์ที่กำหนดเองถูกสร้างขึ้นเพื่อให้ตรงกับการตั้งค่าที่ผู้ใช้ระบุทั้งนี้ขึ้นอยู่กับการตั้งค่าที่ระบุ ดังนั้นกฎการเขียนใหม่จะต้องถูกลบทิ้งทันทีหลังจากบันทึกการตั้งค่า นี่คือสิ่งที่ทำงานไม่เหมาะสม

โซลูชันลิงก์ด้านบนสำหรับการดีบักกฎการเขียน@toschoซ้ำที่แสดงโดยแสดงว่ากำลังล้างกฎการเขียนซ้ำจำนวนมาก อย่างไรก็ตามเมื่อไปที่ไอเท็มเอกพจน์ชนิดโพสต์ที่กำหนดเองหรือแม้กระทั่งการเก็บถาวรชนิดโพสต์ที่กำหนดเองสำหรับเรื่องนั้นแต่ละข้อผิดพลาดกลับเป็น 404

ประเภทโพสต์ที่กำหนดเองมีการลงทะเบียนอย่างถูกต้องและเหมาะสม ฉันรู้แน่นอนว่าไม่ใช่ปัญหา

ติดตามการตั้งค่าหน้าการจัดการปลั๊กอินทันที มีการสร้างประเภทโพสต์ที่กำหนดเองโครงสร้าง Permalink และกฎการเขียนซ้ำทั้งหมดจะพยายามล้างออก

ประเภทโพสต์ที่กำหนดเองนั้นจะถูกโหลดเสมอและโหลดinitเหมือนปกติ

ด้วยเหตุผลบางอย่างกฎการเขียนซ้ำไม่ได้ล้างข้อมูลอย่างถูกต้องเพราะอย่างที่ฉันพูดก่อนหน้าการไปที่ส่วนเอกพจน์หรือไฟล์เก็บถาวรของประเภทโพสต์ที่กำหนดเองจะแสดงข้อผิดพลาด 404

ตอนนี้ส่วนที่แปลกประหลาดถ้าทั้งหมดที่ฉันทำคือเพียงไปที่หน้าการตั้งค่าการจัดการ permalinks แล้วกลับไปที่ส่วนหน้าเพื่อดูส่วนเอกพจน์หรือเก็บถาวรของประเภทโพสต์ที่กำหนดเองพวกเขาทำงานได้อย่างน่าอัศจรรย์

หน้าการตั้งค่าการจัดการ permalinks ทำอะไรที่ฉันไม่ได้ทำเพื่อให้กฎการเขียนซ้ำล้างอย่างเหมาะสมและของฉันไม่ได้

ฉันหมายถึงในฐานะวิธีการชั่วคราวฉันเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าการตั้งค่าการจัดการ Permalinks หลังจากบันทึกหน้าการตั้งค่าการดูแลระบบปลั๊กอิน แต่นี่ไม่ใช่วิธีแก้ปัญหาในอุดมคติ ฉันต้องการกฎการเขียนซ้ำเพียงแค่ล้างอย่างถูกต้องภายในรหัสปลั๊กอินของฉัน

มีบางจุดใน WordPress ที่ล้างกฎการเขียนใหม่เพียงแค่ไม่ล้างกฎทั้งหมดอีกต่อไปหรือไม่

admin_menu - หน้าการตั้งค่าปลั๊กอินถูกเพิ่มในการจัดการ WordPress

add_options_page() - หน้าการตั้งค่าปลั๊กอินถูกเพิ่มในเมนูการตั้งค่า

add_options_page()หน้าการตั้งค่าการแสดงผลในการเรียกกลับสำหรับ นี่คือตำแหน่งที่$_POSTจะถูกประมวลผลเพื่ออัปเดตการตั้งค่าปลั๊กอินและล้างกฎการเขียนซ้ำ

เนื่องจากนี่เป็นคำถามที่มีมานานแล้วฉันยินดีที่จะให้บล็อคโค้ด (หากช่วยได้) ในลิงก์ภายนอกที่ช่วยในการสร้างคำตอบที่ถูกต้อง


1
ดูเหมือนว่าคุณอาจมีสิ่งผิดปกติเกิดขึ้นยากที่จะพูดโดยไม่เห็นรหัส หน้าผู้ดูแลระบบ permalinks เพียงโทรออกflush_rewrite_rulesซึ่งเพิ่งลบrewrite_rulesตัวเลือกและสร้างใหม่คุณสามารถเปิดไฟล์wp-admin/options-permalinks.phpและดูว่าเกิดอะไรขึ้น เนื่องจากการดำเนินการนี้เพียงลบตัวเลือกทั้งหมดจึงไม่สามารถล้างกฎบางส่วนได้
Milo

@Milo ฉันคิดว่าคุณพูดถูก ฉันมีคลาสที่โหลดinitซึ่งลงทะเบียนประเภทโพสต์ ฉันคิดว่าการตั้งค่าหน้าเว็บถูกบันทึกไว้และหน้าจะโหลดซ้ำ ... จากนั้นจึงลองinitขออีกครั้งเพื่อลงทะเบียนประเภทโพสต์ที่จำเป็น ดังนั้นฉันคิดว่าโพสต์ประเภทจะถูกโหลดแล้วและสิ่งที่ฉันต้องทำคืออัปเดตตัวเลือกจากนั้นล้างกฎการเขียนซ้ำจากหน้าการตั้งค่าปลั๊กอินของฉัน ฉันจะโพสต์คำตอบว่าฉันหาวิธีแก้ปัญหาได้อย่างไร
Michael Ecklund

เพียงแค่คำเตือน flush_rewrite_rules () ในปลั๊กอินของฉันกลายเป็นส่วนหนึ่งของปัญหาสำหรับฉัน ฉันลบเบ็ด PHP และลงเอยด้วยการอัปเดตลิงก์ด้วยตนเองและข้อผิดพลาด CPT 404 ของฉันหายไป
myol

คำตอบ:


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

ดูบทความ codex

ขออภัยล่วงหน้าฉันไม่ได้ตอบคำถามของคุณทั้งหมดดังนั้นนี่เป็นการตอบสนองของตัวตัดคุกกี้


1
ขอบคุณสำหรับคำแนะนำของคุณ แต่ฉันรู้เรื่องนี้แล้ว ปัญหาไม่ได้เกี่ยวกับการเปิดใช้งานปลั๊กอิน / การยกเลิกปลั๊กอิน มันเกี่ยวข้องกับผู้ใช้ที่เปลี่ยนการตั้งค่าเป็นปลั๊กอินที่ใช้งานอยู่ซึ่งปรับกฎการเขียนซ้ำดังนั้นจึงต้องล้างข้อมูล
Michael Ecklund

1
ฉันคิดว่าอาจเป็นกรณีนี้ แต่ฉันเหนื่อยมากเมื่อฉันอ่านคำถามของคุณ วิธีแก้ปัญหาของ ialocin ดูมีแนวโน้มหวังว่าคุณจะได้ผล
helgatheviking

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
helgatheviking

แน่นอนว่าคุณเป็นคนชั่วคราวเกี่ยวกับเรื่องชั่วคราวฉันคิดว่าฉันเลือก*_option()เพราะหน้าการตั้งค่า @helgatheviking
นิโคไล

สิ่งนี้มีประโยชน์มาก ฉันมีสถานการณ์ที่คล้ายกันกับไมเคิล ฉันลงเอยด้วยการรวมคำแนะนำของ helga เกี่ยวกับการใช้งานชั่วคราวและฉันตั้งไว้ในฟังก์ชันการตรวจสอบความถูกต้องสำหรับการตั้งค่า ฉันจำเป็นต้องตั้งค่า transient เป็น false หลังจากล้างข้อมูลมิฉะนั้นจะยังคงล้างข้อมูลในการโหลดหน้าผู้ดูแลระบบทุกครั้งจนกว่า transient จะหมดอายุ ดังนั้นฟังก์ชั่นการใช้งานตัวเลือกหรือชั่วคราวก็เหมือนกัน ฉันเดาว่าชั่วคราวอาจจะดีแค่เก็บตารางตัวเลือกให้สะอาดขึ้นเล็กน้อย แต่ประเด็นเล็กน้อย
MatthewLee

ความแตกต่างอยู่เล็กน้อยโดยเฉพาะอย่างยิ่งถ้าทรานส์เอนเนอร์สเป็นแบบถาวรไม่หมดอายุ แต่แน่นอนว่าทรานเฟอร์เรชั่นนั้นมีความสามารถอื่น ๆ มีคุณประโยชน์ที่ดีที่มี @MatthewLee
Nicolai

3

ฉันมีไฟล์คลาสชนิดโพสต์ซึ่งรับผิดชอบในการอ่านการตั้งค่าตัวเลือกของปลั๊กอินและสร้างประเภทโพสต์ที่กำหนดเองที่จำเป็นตามการตั้งค่าที่ผู้ใช้ระบุ

initระดับนี้ไฟล์ประเภทโพสต์ถูกโหลดบนตะขอ

ฉันคิดทั้งหมดที่ฉันต้องทำคืออัปเดตการตั้งค่าปลั๊กอินจากนั้นล้างกฎการเขียนซ้ำ เนื่องจากคลาสชนิดโพสต์ถูกโหลดแล้วตามการตั้งค่าปลั๊กอิน แต่ด้วยหน้าการดูแลระบบพวกเขาจะโหลดหลังจากinitเบ็ด

ชนิดโพสต์ไม่เคยลงทะเบียนจริงเพราะการตั้งค่ายังไม่ได้ตั้งค่า คลาสการลงทะเบียนประเภทโพสต์สิ้นสุดลงก่อนกำหนดโดยไม่มีการลงทะเบียนประเภทโพสต์

ทางออกคือ:

  1. อัปเดตการตั้งค่าปลั๊กอิน
  2. โหลดไฟล์คลาสชนิดการโพสต์เพียงครั้งเดียวที่นี่เพื่อให้กฎการเขียนใหม่ถูกสร้างขึ้น
  3. ล้างกฎการเขียนซ้ำ

(ก่อนหน้านี้ ... ขั้นที่ 2 หายไป - ดังกล่าวข้างต้น ... )

นับจากนี้ไปประเภทของโพสต์จะถูกโหลดลงในinithook และจะมีการตั้งค่าที่ระบุไว้แล้วอนุญาตให้สร้างประเภทของโพสต์และจับคู่กับกฎการเขียนซ้ำที่เหมาะสม

ด้วยเหตุผลใดก็ตามฉันต้องเพิ่มการเรียก JavaScript เพื่อเปลี่ยนเส้นทางไปยังหน้าปัจจุบันหลังจากดำเนินการสามขั้นตอนด้านบน

ฉันต้องเพิ่มการเรียกไปยัง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

ฉันมีปัญหาเดียวกันทั้งหมด ในปลั๊กอินของฉันฉันมีประเภทโพสต์ที่สร้างขึ้นแบบไดนามิก พวกเขาจึงไม่สามารถลงทะเบียนผ่านทาง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 สร้างขึ้นในระหว่างregister_post_type()นั้น
  • การตรวจสอบว่าจำเป็นต้องมีการล้างข้อมูลหรือไม่ในระหว่างการโหลดหน้าแต่ละครั้ง

ข้อดี:

  • ห่อหุ้มอย่างเต็มที่ในชั้นเรียนที่เป็นตัวแทนประเภทโพสต์
  • ล้างกฎการเขียนซ้ำหากจำเป็นจริงๆเท่านั้น

ใช้สิ่งนี้เฉพาะเมื่อคุณไม่สามารถลงทะเบียนประเภทโพสต์ของคุณในฟังก์ชั่นคงที่ที่สามารถโทรระหว่างทั้งสองinitและactivation_hook!

การพึ่งพากฎการเขียนซ้ำที่สร้างขึ้นในregister_post_type()ลักษณะที่สามารถบรรเทาได้ด้วยการแทนที่การทดสอบif(strpos($key, $args['rewrite']['slug'] ) === 0)ด้วยสิ่งที่ซับซ้อนยิ่งขึ้นเช่นการแสดงออกปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.