Верх страницы
Обложка к записи Как запускать крон-задачи WordPress через WP-CLI
Время для прочтения: 0 мин. 8 сек.

Как запускать крон-задачи WordPress через WP-CLI

Запуск реального серверно крона наиболее предпочтительно в инфраструктуре WordPress, чем использование его внутреннего представления тип «maybe-will-trigger» (крон не запустится пока на сайте нет посетителей).

Но как быть, если у вас включен режим мультисайта? Тогда вам необходимо ручками под каждый из сайтов создать задачу для крона. Что, согласитесь, совсем неудобно и утомительно.

Стоит сказать спасибо утилите WP-CLI, с помощью которой мы можем упростить этот процесс, используя приведенный ниже bash-скрипт. Кстати, в режиме обычного сайта он также сохраняет свою работоспособность.

Если вы новичёк в WordPress и всякого рода кронах, то советую предварительно прочитать замечательную статью Тома Макфарлинса Properly Setting Up WordPress Cron Jobs для общего понимания происходяешл здесь.

Вот, собственно, сам скрипт, реализующий описаный трюк:

#!/bin/bash
# Copyright © 2015 Bjørn Johansen
# This work is free. You can redistribute it and/or modify it under the
# terms of the Do What The Fuck You Want To Public License, Version 2,
# as published by Sam Hocevar. See http://www.wtfpl.net/ for more details.

# Укажем путь до установленно WordPress
WP_PATH="/path/to/wp"

# Проверим, что WP-CLI доступен
if ! hash wp 2>/dev/null; then
	echo "WP-CLI is not available"
	exit
fi

# Проверим, что в казанной папке
# реально установлен WordPress
if ! $(wp core is-installed --path="$WP_PATH" --quiet); then
	echo "WordPress is not installed here: ${WP_PATH}"
	exit
fi

# Получим списко сайтов
if $(wp core is-installed --path="$WP_PATH" --quiet --network);
then
	SITE_URLS=`wp site list --fields=url --archived=0 --deleted=0 --format=csv --path="$WP_PATH" | sed 1d`
else
	SITE_URLS=(`wp option get siteurl --path="$WP_PATH"`)
fi

# Пройдемся в цикле по списку
for SITE_URL in $SITE_URLS
do
	# Запустим все подходящие задачи
	for EVENT_HOOK in $(wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_PATH" | grep now$ | awk -F ',' '{print $1}')
	do
		wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_PATH" --quiet
	done
done

Как использовать

Для начала убедитесь, что WP-CLI установлен и работоспособен. Это выходит за рамки данной статьи. Сам процесс детально описан на официальном сайте проекта WP-CLI.

Скачайте скрипт, сохраните его в дамашней директории под именем run-wp-cron.sh, отредактируйте переменную WP_PATH, содержащую путь к установленному WordPress и сделайте скрипт исполняемым:

chmod 0700 run-wp-cron.sh

Попробуйте запустить скрипт:

./run-wp-cron.sh

Настрока серверного крона

От текущего (не рутового!) пользователя отредактируйте crontab:

crontab -e

Добавьте эту линию в конец файла, заменив путь к скрипту на свой:

* * * * * /home/youruserdir/run-wp-cron.sh

Теперь наш скрипт будет выполняться каждую минуту.

При желании, вы можете задать свой интервал.

Отключение встроенного крона

Я не так давно описывал данный кейс, но если вкратце — то просто добавьте в ваш wp-config.php следующую строку:

define( 'DISABLE_WP_CRON', true );

На этом всё, приятного кодинга.

Ссылки

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, Opencart, DLE, Laravel, Moonshine, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

2 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Petrozavodsky
7 лет назад

А какую проблему это решает ? Не нужно настраивать крон для каждого сайта ?

Предыдущая запись

Давайте дружить
в Телеграме

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы