如何避免SAVE_POST回调中的无限循环

时间:2012-05-07 作者:elgehelge

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

使用时,我得到和无限循环wp_update_post 在调用的函数中save_post. 我知道这是一个常见的问题,但我不知道如何避免它。

我想保存帖子的顺序(属于帖子类型“section”)。因此,我制作了一个自定义元框,其中包含一些可排序的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 );
    }
}
但问题是它启动了一个无限循环。我如何避免这种情况?也许我可以用完全不同的方式来做?

感谢您的帮助!

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

您可以从save_post 钩子,更新帖子,然后将呼叫重新添加回钩子。这个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\');
}

SO网友:Charles Jaimet

我还没有足够的声誉发表评论,所以我要补充一个答案,尽管斯蒂芬的答案很好,也很正确。当您想设置操作的优先级时,它只是不处理实例。

如果在添加操作时设置优先级,但在删除操作时不指定优先级,则仍会得到一个无限循环。

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

结束

相关推荐