问题描述
我一直在使用这个网站来解决我的问题,但这次我没有成功找到并回答我的问题。
当在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。