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


12

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

wp_update_post在调用on的函数内部使用时,出现无限循环save_post。我知道这是一个普遍的问题,但是我不知道该如何避免。

我想保存帖子的顺序(属于帖子类型“部分”)。因此,我制作了一个自定义元框,其中包含一些可排序的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 );
    }
}

但是问题在于它开始了无限循环。如何避免这种情况?也许我可以用完全不同的方式来做?

寻求您的帮助!

Answers:


26

您可以从save_post挂钩中删除回调,更新帖子,然后将呼叫重新添加到挂钩中。该法典给出了一个例子

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

哇。感谢您的快速答复。奇迹般有效!不知道为什么我没有看到上面的示例代码自己..
elgehelge

@Stephen,我update_post_meta在一个函数中使用了挂钩功能,save_post我是否也应该解锁并重新挂钩update_post_meta
Anagio

不,update_post_meta不会(通常)导致save_post被触发。
史蒂芬·哈里斯

在浪费了一个小时后,发现了这一点,这也节省了更多时间,谢谢。
Manchumahara

13

我还没有发表评论的声誉,所以即使斯蒂芬的出色和正确,我也要添加一个答案。当您要设置操作的优先级时,它只是不处理实例。

如果在添加操作时设置了优先级,但在删除操作时未指定优先级,则仍然会出现无限循环。

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

1
哇谢谢!我很努力地试图弄清为什么即使加时仍然遇到无限循环remove_action/add_action
Banjer 2014年

1
WordPress Codex ::插件API /操作参考/保存帖子::避免无限循环他们演示了这一点。如果您查看WordPress Codex ::功能参考/删除操作::用法 “功能的优先级(如最初挂钩功能时所定义)。” 如果未指定,它将使用默认优先级(10)。A / K / A-您必须在添加操作时指定SAME优先级,以便实际删除该操作。
Michael Ecklund '16

这是我一直在寻找的答案。谢谢:)
manuman94
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.