我有一个自定义的帖子类型(“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分钟后运行,如果我需要这样做,猜测我应该等待多长时间,收集我需要的所有信息
save_cpt()
然后把它传给$args
参数至wp_schedule_single_event()
<我不想走这条路,因为收集信息本身可能需要一段时间,这会减慢管理员用户的速度。通过cron向作业传递大量信息是否有“费用”(即内存等)
我还应该考虑其他因素吗?例如,在以下情况下可能发生的情况:
管理员用户A编辑帖子X,在该cron作业完成之前安排cron作业,管理员用户B对帖子X进行另一次编辑
最合适的回答,由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任务完成时清除该标志。您可能希望禁用对文章的编辑,只要该标志存在于文章中。