问题描述

我一直在使用这个网站来解决我的问题,但这次我没有成功找到并回答我的问题。

当在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。