WordPress имеет огромное количество функций о которых не опытные пользователи не знают, в этой записи я расскажу об одной из таких. Речь пойдет о WordPress cron и как его установить, если вам понадобится сделать задачу которая должна выполняться на заднем плане.
Для чего нужен cron?
Например в WordPress они используются для проверок обновления CMS или удаления старых версий ваших постов, которые уже очень давно не используются (и это действительно происходит пока ваш сайт работает).
Команда WordPress разработала API для cron, с помощью которого можно запускать планировщик даже не используя панель хостинга (как это бывает у многих).
В этой записи, я хочу предложить воспользоваться плагином, который упростит вам работу, чтобы особо много не копаться в коде. В дальнейшем, я так же напишу пост о том, как это сделать со стороны кода.
А сейчас давайте рассмотрим плагин.
WP Crontrol
Вы можете скачать архив выше и установить его на сайте напрямую или в админ центр зайти в «Плагины» → «Добавить новый», в поиске ввести его название и активировать.
Планировка задач
Создание функции для cron
Допустим у вас уже есть функция, которая выполняет какую-либо задачу. В моем случае — это будет функция, которая проверяет онлайн пользователей на сайте каждые 5 минут и если они не онлайн, то меняет у них статус.
Эту функцию нужно добавить в functions.php в самых конец вашей темы.
function fgou_cron_update_all() { // wp_mail( 'ваша@почта.ru', 'WP Cron Test', 'WP Cron работает на УРА!' ); global $wpdb; $select_res = $wpdb->get_results('SELECT * FROM '. FG_OU_TABLE_NAME .' WHERE `status`=1'); foreach ($select_res as $key => $ou) { $online_ago = $ou->last_action_date + (60 * 5); // + 10 minutes /** * If current time is biggern then the time user was last online + 15 minutes to that time * @var boolean */ $is_user_away = time() >= $online_ago; /** * Check if user is away */ if( $is_user_away ) { /** * Update information about each user that is not online anymore */ $wpdb->update(FG_OU_TABLE_NAME, ['status' => 0], ['id' => $ou->id], ['%d'], ['%d']); } } } add_action( 'fgou_cron_update', 'fgou_cron_update_all' );
Описание функции
Делаю переменную $wpdb
глобальной, чтобы у меня был доступ к WP_Query
классу для доступа к базе данных. Далее я получаю всех пользователей из таблицы у которых status
равен 1 — это которые до сих пор отмечены на онлайн.
Я беру каждого пользователя, а точнее последнее время его визиты в милисекундах (оно так храниться в базе) и добавляю к этому времени еще 5 минут (60 * 5), до этого по логике было уже добавлено 5 минут. В итоге получается + 10 минут. Я создаю булевую переменную $is_user_away
и как условие сравниваю текущее время с временем последней активности пользователя + 5 добавленных минут и если оно больше или равно текущему времени — значит пользователя уже нет на сайте.
И тем самым все пользователи, которые уже нет на сайте меняют статус с 1 на 0 ( 1 — онлайн и 0 — оффлайн).
В самом конце я добавляю add_action()
с названием fgou_cron_update
(оно должно быть уникальным). Вторым аргументов для action будет функция, которая будет вызываться при вызове fgou_cron_update
в add_action()
.
ВНИМАНИЕ! Код выше — это лишь пример, у вас он не будет работать, так как много недостающих функций и логики программы (я его вытащил из одного из моих действующих плагинов).
Что нужно сделать вам: оставьте ТОЛЬКО вторую строчку из этого кода (это отправка письма на почту, с помощью WordPress функции — wp_mail()) и замените почту (ваша@почта.ru
) на свою личную и далее следуйте инструкции ниже («Добавляем крон задачу в плагин»). Остальное внутри этой функции можно закомментировать или удалить.
Добавляем cron задачу в плагин
- Зайдите в «Инструменты» → «Cron Events».
- В поле «Action Name», напишите название
add_action()
, которое описывалось выше. Из примера выше — это будетfgou_cron_update
(вы можете написать любой другой, только не забудьте изменить название вadd_action()
). - Поле «Arguments (optional)» — это аргументы функции. Допустим, у вас функция принимает ID чего то, тогда в функция была бы у вас в таком формате
function fgou_cron_update_all($user_id) { ... }
в таком случае предполагается, что вам нужно указать id пользователя. После каждого аргумента нужно писать запятую. ВНИМАНИЕ! Вам это поле вводить не нужно. - Поле «Next Run» — это дата запуска задачи. Поставьте текущее время.
- Поле «Recurrence» — это интервал с которым будет выполняться cron задача. По умолчанию там стоят, «каждый час», «каждый день» и тд. Если вас нужно поставить меньший интервал тогда читайте «Добавление нового интервала» (ниже).
Добавление нового интервала
Зайдите в «Настройки» → «Cron Schedules» чтобы добавить другие периоды проверки (например, 5 или 10 минут).
- В поле «Internal name» введите название, например — «fiveminutes», что будет означать «5 минут». В этом поле нельзя использовать пробелы и лучше всего писать в нижем регистре. Это поле может пригодиться в коде, но для этой записи оно использоваться не будет.
- В поле «Interval (seconds)» время в секундах. Если вам нужно 5 минут, то это будет — 5 * 60 = 300 секунд. Но вы должны написать только — 300.
- В поле «Display name» напишите название интервала. Например — «5 минут».
И в самом конце нажмите на «Add Cron Schedule», чтобы добавить новый интервал.
Тестируем
Для того, чтобы проверить работу cron задачу нужно зайти на почту, которую вы указали в wp_mail()
и проверить письмо с темой «WP Cron Test» и сообщением «WP Cron работает на УРА!». Это означает, что все работает правильно.
Если у вас проблемы, опишите её подробно к этому посту и я помогу ее решить.