問題描述
我一直在使用這個網站來解決我的問題,但這次我沒有成功找到並回答我的問題。
當在 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。