Как запускать крон-задачи 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 );

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

Ссылки

Источник: https://www.kobzarev.com/wordpress/wp-cli-cron/

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

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: