Время для прочтения: 1 мин. 18 сек.

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

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

Ссылки

Пошерить
Плюсануть
Отправить
Вотсапнуть

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

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

1. Нажимая на кнопку "Отправить", я даю согласие на обработку персональных данных.

2. Для вставки кода используйте специальные теги [code lang="php"]ваш код[/code]

2 комментария

сначала новые
по рейтингу сначала новые по хронологии

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

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

Не нужно дергать сайт по урлу, загружая весь WordPress. Вся работа через WP-CLI, не надо копипастить кучу идентичных кронов. Это навскидку.