Запуск реального серверно крона наиболее предпочтительно в инфраструктуре 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 );
На этом всё, приятного кодинга.