วิธีหลีกเลี่ยงการวนซ้ำไม่สิ้นสุดใน save_post callback


12

ฉันใช้เว็บไซต์นี้จำนวนมากเพื่อแก้ไขปัญหาของฉัน แต่ครั้งนี้ฉันไม่ประสบความสำเร็จในการค้นหาและตอบปัญหาของฉัน

ฉันได้รับและวงวนไม่สิ้นสุดเมื่อใช้wp_update_postภายในฟังก์ชันที่เรียกsave_postใช้ ฉันรู้ว่านี่เป็นปัญหาทั่วไป แต่ฉันไม่สามารถหาวิธีที่จะหลีกเลี่ยงได้

ฉันต้องการบันทึกคำสั่งของโพสต์ของฉัน (ซึ่งเป็นประเภท 'โพสต์' ประเภทโพสต์) ดังนั้นฉันจึงสร้างเมตาบ็อกที่กำหนดเองซึ่งมีองค์ประกอบ html- เรียงลำดับได้บางส่วน ในแต่ละองค์ประกอบจะมีแท็กอินพุตที่ซ่อนพร้อมชื่อ = 'sectionorder []' ดังนั้นเมื่อฉันคลิกที่ปุ่ม 'ปรับปรุง' WordPress มาตรฐานอาร์เรย์ที่มี ID ทั้งหมดของโพสต์ (ตามลำดับ) จะถูกส่งผ่าน POST ดังนั้นนี่คือรหัสที่ฉันเรียกอาร์เรย์และต้องการบันทึกคำสั่ง:

    // Update section sort order
$sectionorder = $_POST['sectionorder'];
if (isset($sectionorder)) { // Avoid error if there is no sections added yet
    foreach( $sectionorder as $no => $sectionID ) {
        $post_update = array();
        $post_update['ID'] = $sectionID;
        $post_update['menu_order'] = $no;
        wp_update_post( $post_update );
    }
}

แต่ปัญหาคือมันเริ่มวนซ้ำไม่สิ้นสุด ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร บางทีฉันสามารถทำมันในวิธีที่แตกต่างอย่างสิ้นเชิง?

ชื่นชมความช่วยเหลือของคุณ!

คำตอบ:


26

คุณสามารถลบการโทรกลับจากsave_posthook อัปเดตโพสต์แล้วเพิ่มการโทรกลับไปที่ hook อีกครั้ง Codex ให้ตัวอย่าง

add_action('save_post', 'wpse51363_save_post');

function wpse51363_save_post($post_id) {

    //Check it's not an auto save routine
     if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
          return;

    //Perform permission checks! For example:
    if ( !current_user_can('edit_post', $post_id) ) 
          return;

    //Check your nonce!

    //If calling wp_update_post, unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'wpse51363_save_post');

    // call wp_update_post update, which calls save_post again. E.g:
    wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));

    // re-hook this function
    add_action('save_post', 'wpse51363_save_post');
}

ว้าว. ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว ทำงานเหมือนจับใจ! ไม่ทราบสาเหตุที่ฉันไม่เห็นรหัสตัวอย่างนั้นเอง ..
elgehelge

@ สตีเฟ่นฉันใช้update_post_metaในฟังก์ชั่นติดยาเสพติดที่save_postฉันควรจะปลดและปรุงหลังจากนั้นupdate_post_metaหรือไม่
Anagio

ไม่มีupdate_post_metaจะไม่ได้ (โดยทั่วไป) ทำให้เกิดsave_postการเรียก
Stephen Harris

หลังจากเสียเวลาหนึ่งชั่วโมงไปพบสิ่งนี้และสิ่งนี้ก็ช่วยประหยัดเวลาได้มากขึ้นด้วยขอบคุณ
Manchumahara

13

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

หากคุณตั้งค่าลำดับความสำคัญเมื่อเพิ่มการกระทำ แต่ไม่ได้ระบุระดับความสำคัญเมื่อคุณลบออกคุณจะยังคงได้รับการวนซ้ำไม่สิ้นสุด

add_action('save_post', 'wpse51363_save_post', 25 );

// วิธีที่ผิดในการจัดการสิ่งนี้ - นำไปสู่การวนซ้ำไม่สิ้นสุด

remove_action('save_post', 'wpse51363_save_post');
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post');

// วิธีที่ถูกต้องในการจัดการสิ่งนี้ - ดำเนินการเพียงครั้งเดียว

remove_action('save_post', 'wpse51363_save_post', 25 );
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post', 25 );

1
ว้าวขอบคุณ! remove_action/add_actionฉันกำลังจะถั่วพยายามที่จะคิดออกว่าทำไมผมก็ยังคงได้รับห่วงอนันต์แม้เมื่อมีการเพิ่ม
Banjer

1
WordPress Codex :: ปลั๊กอิน API / การอ้างอิงการกระทำ / บันทึกโพสต์ :: หลีกเลี่ยงการวนซ้ำไม่สิ้นสุดพวกเขาแสดงให้เห็นถึงนี้ ถ้าคุณดูWordPress Codex :: การอ้างอิงฟังก์ชัน / ลบการกระทำ :: การใช้งาน "ลำดับความสำคัญของฟังก์ชั่น หากไม่ได้ระบุจะใช้ลำดับความสำคัญเริ่มต้น (10) A / K / A - คุณต้องระบุลำดับความสำคัญเช่นเดียวกับเมื่อมีการเพิ่มการกระทำเพื่อที่จะลบการกระทำจริง
Michael Ecklund

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