問題描述

我一直在使用這個網站來解決我的問題,但這次我沒有成功找到並回答我的問題。

當在 save_post 上調用的函數中使用 wp_update_post 時,我得到無限循環。我知道這是一個常見的問題,但我不知道如何避免這種情況。

我想保存我的帖子的順序 (這是 post-type ‘section’) 。所以我做了一個包含一些可排序的 html-elements 的自定義元框。在每個元素中都有一個名為= ‘sectionorder[]’ 的隱藏的輸入標籤。所以當我點擊標準的 WordPress ‘Update’ buttom,一個數組包含所有的帖子 (按順序) 的 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 );
    }
}

但是問題是它開始了一個無限循環。我該如何避免?也許我可以以完全不同的方式做到這一點?

適合你的幫助!

最佳解決方案

您可以從 save_post 鈎子中刪除回調,更新帖子,然後 re-add 將該電話重新掛起。 Codex gives an example

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

次佳解決方案

我還沒有得到評論的聲譽,所以我補充一個答案,即使斯蒂芬是非常好的和正確的。當您要設置操作的優先級時,它不會處理實例。

如果您在添加操作時設置優先級,但在刪除操作時不指定優先級,則仍將獲得無限循環。

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

//處理該方法的 RIGHT 方式 – 只執行一次

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。