WP Cron – що це, як видалити doing_wp_cron

Що таке WP Cron

WP Cron - це вбудований в ядро ​​WordPress планувальник, що дозволяє виконувати різні завдання строго за заздалегідь заданим розкладом, наприклад:

Перевага WP Cron у тому, що він абсолютно не залежить від налаштувань сервера і працюватиме на будь-якій платформі. Про недоліки буде нижче, коли дійдемо до оптимізації налаштувань, а поки що кілька прикладів, як створити і додати свою подію в планувальник.

Як додати подію у планувальник WP Cron

Нижченаведений код можна вставити у functions.php або створити MU плагін

Повний список чарівних констант часу в WordPress:

  • MINUTE_IN_SECONDS - число секунд за хвилину;
  • HOUR_IN_SECONDS - число секунд за годину;
  • DAY_IN_SECONDS - число секунд на дні;
  • WEEK_IN_SECONDS - число секунд на тижні;
  • MONTH_IN_SECONDS - число секунд на місяці;
  • YEAR_IN_SECONDS - кількість секунд на рік.

То був абстрактний приклад. Ви можете легко адаптувати схему під себе. А для налагодження, щоб зрозуміти, чи працює код, я рекомендую використовувати плагінWP Crontrol (про нього далі).

WP Crontrol - плагін налагодження розкладу запланованих подій WordPress

WP Crontrol – це дуже корисний плагін, який дозволяє:

  • Переглядати всі події WP Cron разом з аргументами, періодичністю повторень, функціями, які вони викликають (callback), а також запланованими діями;
  • Редагувати, видаляти, а також запускати будь-яку подію крона (дуже сильно рятує при налагодженні подій);
  • Додавати нові події до розкладу;
  • Додавати, редагувати та видаляти власні розклади у WP Cron.

видалити

Список подій у WPCrontrol

cron

Додавання нової події до WP Crontrol

Дуже рекомендую використовувати все наочно і зручно.

Завантажити WP Crontrol з офіційного репозиторію Wordress.org

Отже, повертаючись до попередньої теми, якщо додали код із вищезгаданого прикладу, то у списку подійEvents http://example.com/wp-admin/tools.php?page=crontrol_admin_manage_page має з'явитися нова подія>sheensay_new_event

doing_wp_cron

Якщо подіяsheensay_new_event не з'явилася, спробуйте завантажити будь-яку сторінку сайту з фронтенду, наприклад головну. Тоді спрацює хукwp, і подія додасться до планувальника.

Недоліки WP Cron

Вся суть механізму роботи вбудованого планувальника полягає в тому, що при кожному відвідуванні сайту WordPress будь-яким користувачем йде звернення до файлу wp-cron.php . Той, у свою чергу, при кожному зверненні перевіряє розклад, і якщо час виконання якоїсь події у черзі настав чи вже минув, то запускає його. Звідси, зрозуміло, які можуть бути недоліки цього підходу:

  • Якщо сайт має великий трафік, то звернення до WP Cron будуть занадто частими, надмірними, що на сайтах з великим навантаженням трафіку може викликати деякі проблеми з продуктивністю сервера;
  • Якщо сайт мало відвідувачів, то WP Cron може сильно запізнюватися в роботі.

Звідси висновок — якщо є можливість, спробуйте настроїти серверний cron замість вбудованого, а вбудований WP Cron вимкнути (інструкція буде далі).

Як правильно вимкнути WP Cron

у wp-config.php знаходимо рядок define( 'WP_DEBUG', false ); і під нею прописуємо:

Як замінити WP Cron на серверний планувальник cron

Спочатку відключаємоWP Cron, в wp-config.phpпрописуємо десь на початку файлу, як було в прикладі вище:

Потім запускаємо команду в консоль SSH

Тут ми щохвилини командою cd /var/www/example.com/public_html переключаємося в каталог з файлами сайту (в корінь сайту), а wp cron event run --due-now --allow-root робимо запитphp wp-cron.php за допомогою WP CLI. Це варіант має свої тонкощі: php тут запускається з консолі, і тому стане в нагоді, скажімо, якщо на сервері закриті порти 80 або 443, іwget абоcurl безсилі.

WP CLI працює в режимі PHP-CLI, а значить, що на виконання php немає тимчасових лімітів. Це означає:

  • Усі завдання гарантовано виконаються;
  • Якщо якесь із завдань, через помилки синтаксису чи інших, не може завершити свою роботу, це може викликати проблеми.

Тому, тут вирішуйте самостійно, зваживши плюси та мінуси, чи вибирати WP CLI чи ні.

Або використовуємо php

Тут ми щохвилини командою cd /var/www/example.com/public_html переключаємося в каталог з файлами сайту (в корінь сайту), а php wp-cron.php робимо запитphp до wp-cron.php Це варіант з php стане в нагоді, скажімо, якщо на сервері закриті порти 80 або 443, іwget абоcurl безсилі. Або використовуємо wget

Це правило щохвилини за допомогоюwget звертається до файлу крона http://example.com/wp-cron.php?doing_wp_cron WordPress, тим самим змушуючи регулярно запускатися заплановані в WP Cron події.

  • З плюсів wget стоїть практично на будь-якій машині за замовчуванням.
  • З мінусів - його розробка ведеться довго, і тому він не підтримує нормально https та інші опції, доступніcurl. До того ж, проблеми можуть виникнути, якщо запити на сайт блокується запортів.
Або використовуємо curl

Це правило щохвилини надсилатиме запити за допомогоюcurl до http://example.com/wp-cron.php?doing_wp_cron .

  • Плюси curl - це просунутий варіант wget, багато опцій з можливістю змінювати протоколи, user-agent, примусовий TLS, можливість стискати відповідь та багато іншого.
  • Мінуси — не завжди йде за замовчуванням з сервера, і потрібно встановлювати окремо. Однак, у Ubuntu та Debian робиться це легко:
  • Ще мінус – буває, що сервер не приймає запити (наприклад, захист від парсерів)

Одну з вищезгаданих команд додаєте наприкінці файлу (example.com замінюєте на свій домен).

  1. Прописуємо одну із вищевказаних команд;
  2. Виходимо Ctrl + X;
  3. На виході спитають, чи зберігати зміни. Зберігаємо Y;
  4. Ім'я файлу для запису - залишаєте без зміни - Enter;
  5. Якщо побачите підпис crontab: installing new crontab , зміни були збережені

  1. Включити режим редагування - Insert;
  2. Вносимо правила до кінця файлу (приклади розглядали вище);
  3. Після внесення змін відключаємо режим редагування - Esc;
  4. Зберігаємо зміни - Shift + : (двокрапка), в полі, що з'явилося, вводимо wq і зберігаємо Enter ;
  5. Якщо побачите відповідь crontab: installing new crontab , зміни були збережені і набули чинності.

Якщо хочете перевірити, чи застосовано зміни до розкладу крона, скористайтесь командою crontab -l

Налаштування серверного cron для WordPress MultiSite MU

Якщо у вас складання WordPress Multisite, то підходи вище не підійдуть.

Найкращий варіант - це в консолі SSH відкрити Crontab командою crontab -e і вписати:

Що це все означаєсервернийcron робитиме таке:

* * * * * Робимо запит кожну хвилину. cd /var/www/example.com/data/www/example.com; Переходимо до вищезгаданої директорії /var/www/example.com/data/www/example.com — тут потрібно вказати абсолютний шлях до кореня сайту WordPress. /usr/local/bin/wp site list —field=url —allow-root Отримуємо список сайтів мережі WordPress Multisite. Передаємо результат команди wp site list команді xargs - утиліті, яка приймає рядки введення та передає їх наступній команді. xargs -n1 -I \% /usr/local/bin/wp —url=\% cron event run —due-now —allow-root Команда буде послідовно для кожного сайту зі списку виконувати команду: wp --url=\% cron event run --due-now --allow-root . Замість \% буде підставлятись URL сайту мережі WP MU.

Якщо з метою дебагу потрібно відстежити роботу цієї команди, можна включити лог, додавши наприкінці рядка >> /root/wp-cron_log.txt 2>&1 , тоді результат роботи команди буде писатися у файл /root/wp-cron_log.txt (можна вказати інший шлях і файл):

Залишилося відключити WP Cron у файлі wp-config.php на корені сайту:

Вкрай рекомендую варіант вище, він надійніше нижченаведеного.

Ще один варіант, якщо не підійшов варіант вище, це створити файл mu-cron.php і покласти його в корінь сайту поряд з wp-load.php. Код файлу mu-cron.php нижче:

Тепер налаштовуємо серверний Cron. Команда для консолі:

І туди вписуємо:

Або через IP свого сервера

Ну і звичайно ж, не забуваємо відключити нативний WP Cron у файлі wp-config.php в корені сайту:

Помилки, пов'язані з WP Cron

Там було питання проникнення телефону до WP-Cron system on your site

Помилка вище означає, щоcurl не може отримати доступ до сайту стандартних портів 80 або 443 . Ви можете вирішити цю проблему, увімкнувши альтернативний варіант для роботи WP Cron, прописавши у wp-config.php :

Забираємо doing_wp_cron із URL

Як правило, її включають, коли WP Cron не працює у стандартному варіанті. Вам потрібно постаратися уникнути її використання:

Якщо WP Cron не запрацює або видаватиме помилку в роботі, можна повністю відключитиWP Cron і використовувати серверний крон (докладніше були вище). Також, не зайвим буде налаштувати редирект з ?doing_wp_cron= на оригінальну версію сторінки:

Як зробити редирект з ?doing_wp_cron= в NGINX Як зробити редирект з ?doing_wp_cron= в .htaccess (Apache)

Я вимкнув WP Cron, але в логах access.log знову з'являється POST /wp-cron.php?doins_wp_cron?параметри

Буває так, що, здавалося б, WP Cron відключено (все зроблено за інструкцією вище), однак, у логах все одно з'являються позначки про те, що йдуть стандартні запити

Справа в тому, що тут може бути так, що Ви неправильно прописали відключення WP Cron, зокрема рядок define('DISABLE_WP_CRON', true); прописали наприкінці файлу wp-config.php . Обов'язково перенесіть її до define('WP_DEBUG', false); :

Далі спробуйте очистити всі заплановані завдання (про це нижче).

WP Cron дуже гальмує, валяться помилки, що робити?

Для початку встановіть плагінWP Crontrol (про нього описано вище). Потім зайдіть вІнструменти-Cron Events( http://example.com/wp-admin/tools.php?page=crontrol_admin_manage_page ):

видалити
У нормі, ви побачите приблизно таке:

doing_wp_cron

Список подій у WP Crontrol

Якщо сторінка не відкривається, або відкривається, але її таблиці дуже багато позицій, отже, варто їх очистити. Найпростіше: черезfunctions.php:

    Відкриваєте functions.php і прямо на початку файлу під прописуєте:

та зберігаєте результат;

  • Відкриваєте будь-яку сторінку сайту;
  • Повертаєтеся у functions.php та видаляєте рядок update_option('cron', ''); , Зберігайте результат;
  • Знову відкриваєтеІнструментиCron Events і дивіться, таблиця повинна прийти в норму (бути порожньою або мати мало значень).
  • Все, тепер WP Cron має працювати нормально. Але я раджу відключити його та налаштувати серверний планувальник (інструкція вище), тоді сайт буде працювати, як годинник.