В процессе эксплуатации WordPress-сайта иногда возникает необходимость временно отключать плагины — например, для проведения технических работ, тестирования или снижения нагрузки в определённые часы. Вместо ручного отключения и включения можно автоматизировать этот процесс и настроить отключение плагинов по расписанию. В этой статье подробно рассмотрим, как это реализовать с помощью WP-Cron и собственного кода.
Почему важно автоматизировать отключение плагинов
Часто плагины могут вызывать конфликты или нагружать сайт в определённые периоды. Например, плагин для бэкапа или аналитики не должен работать круглосуточно, или рекламные блоки нужно отключать в ночное время, чтобы не мешать серверу. Автоматизация отключения позволяет:
- Экономить ресурсы сервера в часы пик и ночью.
- Обеспечивать стабильность сайта при технических работах.
- Быстро и безопасно управлять функционалом без участия администратора.
Рассмотрим, как реализовать такую автоматизацию на практике.
Использование WP-Cron для планирования задач
WordPress имеет встроенный планировщик задач WP-Cron, который позволяет запускать определённые функции по расписанию. Мы можем использовать его, чтобы в нужное время отключать и включать плагины.
Основная идея — создать две задачи: одна отключает плагины, другая — включает их обратно.
Регистрация новых событий в WP-Cron
Для начала зарегистрируем собственные события:
function wpboot_register_cron_events() {
if ( ! wp_next_scheduled( 'wpboot_deactivate_plugins_event' ) ) {
wp_schedule_event( strtotime('23:00:00'), 'daily', 'wpboot_deactivate_plugins_event' );
}
if ( ! wp_next_scheduled( 'wpboot_activate_plugins_event' ) ) {
wp_schedule_event( strtotime('06:00:00'), 'daily', 'wpboot_activate_plugins_event' );
}
}
add_action( 'wp', 'wpboot_register_cron_events' );Этот код планирует два события: wpboot_deactivate_plugins_event на 23:00 и wpboot_activate_plugins_event на 06:00 следующего дня. Важно, что время указывается в формате timestamp, и WP-Cron запускается при посещении сайта, поэтому событие может немного сдвигаться.
Обработка событий — отключение и включение плагинов
Теперь нужно написать функции, которые будут отключать и включать плагины. Для примера отключим плагин akismet/akismet.php и contact-form-7/wp-contact-form-7.php.
function wpboot_deactivate_plugins() {
$plugins_to_deactivate = [
'akismet/akismet.php',
'contact-form-7/wp-contact-form-7.php'
];
foreach ( $plugins_to_deactivate as $plugin ) {
if ( is_plugin_active( $plugin ) ) {
deactivate_plugins( $plugin );
}
}
}
add_action( 'wpboot_deactivate_plugins_event', 'wpboot_deactivate_plugins' );
function wpboot_activate_plugins() {
$plugins_to_activate = [
'akismet/akismet.php',
'contact-form-7/wp-contact-form-7.php'
];
foreach ( $plugins_to_activate as $plugin ) {
if ( ! is_plugin_active( $plugin ) ) {
activate_plugin( $plugin );
}
}
}
add_action( 'wpboot_activate_plugins_event', 'wpboot_activate_plugins' );Функции проверяют, активен ли плагин, и включают или отключают его соответственно. Для работы функций is_plugin_active, activate_plugin и deactivate_plugins нужно подключить файл с их определениями, если код выполняется вне админки.
Обработка времени и зоны — важные нюансы
WP-Cron использует время сервера, а не часовой пояс сайта, что может привести к рассинхронизации. Чтобы избежать этого, рекомендуем приводить время к timestamp с учётом текущего часового пояса WordPress:
function wpboot_get_timestamp_for_time( $time_str ) {
$timezone = new DateTimeZone( wp_timezone_string() );
$date = new DateTime( 'today ' . $time_str, $timezone );
return $date->getTimestamp();
}Используйте эту функцию при планировании:
wp_schedule_event( wpboot_get_timestamp_for_time('23:00:00'), 'daily', 'wpboot_deactivate_plugins_event' );Таким образом расписание будет корректным для вашего сайта.
Практические рекомендации и улучшения
1. Учитывайте кеширование: WP-Cron запускается при посещении сайта, поэтому на сайтах с малым трафиком может срабатывать с задержкой. Для точного срабатывания используйте системный cron и wp-cron.php.
2. Логируйте изменения: Добавьте запись в лог при отключении и включении плагинов — это поможет отследить работу скрипта.
3. Расширяйте список плагинов динамически: Можно добавить настройки в админке или использовать опции для выбора плагинов, которые нужно отключать.
Пример расширения: создание настроек в админке для управления
Для удобства можно добавить страницу настроек с чекбоксами плагинов для отключения по расписанию. Это позволит редактировать список без правки кода.
Примерный код для добавления опции и использования её в функции отключения:
function wpboot_get_plugins_to_manage() {
$plugins = get_option( 'wpboot_plugins_to_schedule', [] );
return is_array( $plugins ) ? $plugins : [];
}
function wpboot_deactivate_plugins() {
$plugins_to_deactivate = wpboot_get_plugins_to_manage();
foreach ( $plugins_to_deactivate as $plugin ) {
if ( is_plugin_active( $plugin ) ) {
deactivate_plugins( $plugin );
}
}
}Добавление админ-страницы выходит за рамки этой статьи, но для примера можете использовать стандартные функции WordPress: add_options_page и register_setting.
Совместимость с плагинами WPShop
Если вы используете плагины с https://wpshop.ru/, например, Clearfy Pro, они могут иметь собственные инструменты оптимизации работы плагинов и расписание задач. Рекомендуем изучить их документацию для интеграции с автоматическим отключением.
Также плагин WPRemark позволяет гибко управлять пользовательским интерфейсом, что может быть полезно при отключении плагинов, влияющих на фронтенд.