WP cron: когда следует запланировать 1-кратное мероприятие
У меня есть пользовательский тип записи ('my_cpt'), и после save_post_my_cpt
мне, возможно, потребуется внести большое количество изменений в другие записи (в зависимости от состояния записи, например, post_status, значения post_meta и термины из пользовательской таксономии). Эти другие изменения, возможно, потребуется внести в другие блоги на нескольких сайтах. Следовательно, выполнение функции, вызываемой в 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 () ;
}
}
Надеюсь, все будут со мной до этого момента. Мой вопрос связан со временем, на которое я должен запланировать это задание 1 раз.
Если я запланирую выполнение задания cron "немедленно" (как в приведенном выше коде), могу ли я быть уверен, что к моменту вызова cron_func()
ВСЕ обновления БД, связанные с сохранением моего CPT, будут завершены (с момента функции, вызываемые в cron_func()
, должны будут считывать измененное состояние $post_id
)?
Планирование события для запуска "немедленно", похоже, отлично работает в моей локальной среде разработки (где я единственный, кто посещает сайт).
Мне интересно, возникнут ли у меня какие-либо проблемы с этим способом, когда сайт работает в рабочей среде с интенсивной активностью (т.Е. С несколькими пользователями-администраторами, одновременно редактирующими контент на серверной части, в то время как достаточное количество конечных пользователей попадание в передний конец)
Я рассматриваю две альтернативы:
- добавить некоторое смещение к
time()
при планировании события?- например, запланируйте его запуск на 1 минуту позже
- если мне нужно это сделать, любые предположения о том, как долго мне следует ждать
- соберите всю необходимую мне информацию в
save_cpt()
и передайте ее в$args
вwp_schedule_single_event()
- Я бы предпочел не идти этим путем, так как сбор этой информации сам по себе может занять некоторое время, что замедлит проблемы для пользователя-администратора
- есть ли "расходы" (т.Е. Память/и т.д.) При передаче большого объема информации на задание через cron?
Есть ли какие-либо другие соображения, которые я должен учитывать? Например, что, скорее всего, произойдет, когда:
- администратор пользователь A редактирует сообщение X, в котором запланировано задание cron
- прежде чем это задание cron завершится, администратор пользователь B внесет еще одно изменение в публикацию X
1 answers
Если я запланирую выполнение задания cron "немедленно" (как в приведенном выше коде), могу ли я быть уверен, что к моменту вызова cron_func() это ВСЕ обновления БД, связанные с сохранением моего CPT, будут завершены (поскольку функции, вызываемые в cron_func(), должны будут прочитать измененное состояние $post_id)
Да. save_post
крючок срабатывает после того, как сообщение было фактически сохранено. Таким образом, cron_func
получит измененное состояние сообщения. Вам не нужна никакая альтернатива для этот.
Есть ли какие-либо другие соображения, которые я должен учитывать? Например, что, скорее всего, произойдет, когда:
- администратор пользователь A редактирует сообщение X, которое планирует выполнение задания cron до завершения этого задания cron,
- администратор пользователь B вносит еще одно изменение в публикацию X
Если выполнение задания cron займет некоторое время, очень возможно столкнуться с такой проблемой. Чтобы решить эту проблему, вы можете поднять флаг (это может быть мета-сообщение) при создании задачу cron и снимите флажок, когда задача cron завершится. Возможно, вам захочется отключить редактирование записи, пока для записи установлен флажок.