WP cron:何时安排一次性活动

时间:2017-03-05 作者:Paul \'Sparrow Hawk\' Biron

我有一个自定义的帖子类型(“my\\u cpt”)和save_post_my_cpt 我可能需要对其他帖子进行大量修改(取决于帖子的状态,例如post\\u状态、post\\u元数据和自定义分类中的术语)。这些其他修改可能需要在多站点的其他博客中进行。因此,调用的函数save_post_my_cpt 可能需要一分钟左右才能完成执行。。。这对于管理员用户进行内容更改来说不是很“友好”。

我正在进行设置,以便通过WP Cron进行其他修改。所以我有:

add_action (\'save_post_my_cpt\', \'save_cpt\') ;

function
save_cpt ($post_id)
{
    if (defined (\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) {
        return ;
        }

    // do stuff related to saving post meta, etc
    // e.g., update_post_meta ($post_id, \'_some_meta_name\', $_REQUEST[\'some_meta_name\'], true) ;

    // schedule an event to do the modifications of other posts
    // see below for question related to the time this cron job will be scheduled
    $time = time () ;
    wp_schedule_single_event ($time, \'my_cron_hook\', array ($post_id)) ;

    return ;
}

add_action (\'my_cron_hook\', \'cron_func\') ;

function
cron_func ($post_id)
{
    $post = get_post ($post_id) ;

    // get_blogs_that_might_need_to_be_modified() returns an array of blog_id\'s that
    // MIGHT have other posts related to $post that need to be modified

    // get_posts_in_that_blog_that_need_to_be_modified() returns an array of posts
    // related to $post that need to be modified

    // modify_post() returns a modified version of a related post based on the
    // current state of $post

    // the details of these functions aren\'t relevant to this question
    foreach (get_blogs_that_might_need_to_be_modified ($post) as $blog_id) {
        switch_to_blog ($blog_id) ;

        foreach (get_posts_in_that_blog_that_need_to_be_modified ($post) as $other_post) {
            $other_post = modify_post ($post) ;
            wp_update_post ($other_post) ;
            }

        restore_current_blog () ;
        }
}
希望到目前为止,每个人都支持我。我的问题与我应该安排这一次cron作业的时间有关。

如果我将cron作业安排为“立即”运行(如上面的代码所示),那么在cron_func() 调用时,与保存我的CPT相关的所有DB更新都将完成(因为在cron_func() 需要读取的修改状态$post_id)?

在我当地的开发环境中(我是唯一一个访问该网站的人),安排活动“立即”运行似乎很好。

我想知道当网站在一个高活动的生产环境中运行时(即,许多管理员用户同时在后端编辑内容,而相当多的最终用户在前端工作),我这样做是否会有任何问题

我正在考虑两种选择:

将一些偏移量添加到time() 何时安排活动

  1. 例如,计划在1分钟后运行,如果我需要这样做,猜测我应该等待多长时间,收集我需要的所有信息save_cpt() 然后把它传给$args 参数至wp_schedule_single_event()<我不想走这条路,因为收集信息本身可能需要一段时间,这会减慢管理员用户的速度。通过cron向作业传递大量信息是否有“费用”(即内存等)
我还应该考虑其他因素吗?例如,在以下情况下可能发生的情况:

管理员用户A编辑帖子X,在该cron作业完成之前安排cron作业,管理员用户B对帖子X进行另一次编辑

1 个回复
最合适的回答,由SO网友:sakibmoon 整理而成

如果我将cron作业安排为“立即”运行(如上面的代码所示),那么我可以确信,在调用cron\\u func()时,与保存CPT相关的所有DB更新都将完成(因为在cron\\u func()中调用的func需要读取$post\\u id的修改状态)

save_post 钩子在柱子被实际保存后被激发。所以cron_func 将获取帖子的修改状态。你不需要任何替代品。

我还应该考虑其他因素吗?例如,在以下情况下可能发生的情况:

管理员用户A编辑post X,在该cron作业完成之前安排cron作业,管理员用户B对post X进行另一次编辑如果cron作业需要一些时间,很可能会遇到这样的问题。为了解决这个问题,您可以在创建cron任务时发出一个标志(可以是post-meta),并在cron任务完成时清除该标志。您可能希望禁用对文章的编辑,只要该标志存在于文章中。

相关推荐

Wordpress wp-cron not working

Cron未按预期工作。如果我安排帖子或事件管理器事件,如果在发布时间之后访问站点,则不会发布。如果我去http://somedomain.tld/wp-cron.php?doing_wp_cron 它为空,而调试设置为打开。它应该是空的还是应该显示一些错误(如果有)?错误日志为空。WP Crontrol插件显示cron作业。有没有提示下一步要检查什么?