Автоматическое обновление плагинов в WordPress — важный аспект безопасности и стабильности сайта. Однако стандартный механизм WP-Cron не всегда надежен, особенно на слабых хостингах или при низкой посещаемости. В этой статье разберем, как реализовать собственное автоматическое обновление плагинов без использования стандартного WP-Cron, используя альтернативные методы и примеры кода.
Почему стандартный WP-Cron не всегда подходит для обновления плагинов
WP-Cron запускается при посещении сайта, что делает его зависимым от трафика. Если у сайта мало посетителей, задания могут не запускаться вовремя. Это критично для обновления плагинов, поскольку устаревшие версии могут содержать уязвимости.
Кроме того, WP-Cron не является настоящим системным cron и не гарантирует точное время выполнения заданий. Это вызывает необходимость использовать более надежные решения для автоматизации обновлений.
Одним из вариантов является отключение WP-Cron и настройка системного cron на сервере, но не всегда есть доступ к серверным настройкам, особенно на shared-хостингах.
Альтернативный способ запуска обновлений — через внешние сервисы и хуки
Если вы не можете настроить системный cron, можно использовать внешние сервисы, которые будут периодически обращаться к вашему сайту и запускать обновления. Для этого создадим собственный endpoint и функцию обновления.
Создание кастомного endpoint для запуска обновлений
Добавим в functions.php или создадим небольшой плагин с таким кодом:
add_action('init', 'wpplugins_custom_update_endpoint');
function wpplugins_custom_update_endpoint() {
if (isset($_GET['wpplugins_update']) && $_GET['wpplugins_update'] === '1') {
if (!current_user_can('update_plugins')) {
status_header(403);
exit('Нет прав на обновление');
}
wpplugins_run_plugin_updates();
exit('Обновления выполнены');
}
}
function wpplugins_run_plugin_updates() {
if (!function_exists('wp_update_plugins')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
require_once ABSPATH . 'wp-admin/includes/update.php';
}
// Проверяем обновления
wp_update_plugins();
$updates = get_site_transient('update_plugins');
if (!empty($updates->response)) {
foreach ($updates->response as $plugin_file => $plugin_info) {
// Обновляем каждый плагин
$result = wpplugins_update_plugin($plugin_file);
}
}
}
function wpplugins_update_plugin($plugin_file) {
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
$upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
return $upgrader->upgrade($plugin_file);
}Этот код создает URL вида https://example.com/?wpplugins_update=1, при обращении к которому происходит проверка и обновление плагинов. Важно, что обновление доступно только пользователям с правами update_plugins, чтобы избежать несанкционированного запуска.
Настройка внешнего сервиса для вызова обновления
Чтобы обновления запускались автоматически, настроим внешний cron-сервис, например, cron-job.org или UptimeRobot, который будет обращаться к нашему endpoint с нужной периодичностью.
Это решает проблему с недостатком посещаемости и гарантирует своевременное обновление.
Как обезопасить автоматическое обновление плагинов
Важно ограничить доступ к endpoint, чтобы избежать возможности злоумышленников запускать обновления или перегружать сайт.
Для этого можно добавить секретный ключ в URL и проверять его в функции:
add_action('init', 'wpplugins_custom_update_endpoint');
function wpplugins_custom_update_endpoint() {
$secret_key = 'vashe-sekretnoe-slovo';
if (isset($_GET['wpplugins_update']) && $_GET['wpplugins_update'] === $secret_key) {
if (!current_user_can('update_plugins')) {
status_header(403);
exit('Нет прав на обновление');
}
wpplugins_run_plugin_updates();
exit('Обновления выполнены');
}
}Также можно ограничить доступ по IP-адресам внешних сервисов или добавить капчу, если используете веб-интерфейс для запуска обновлений.
Плагины для управления обновлениями с расширенными возможностями
Если вы хотите более простой способ управления обновлениями без ручного кода, обратите внимание на плагины:
- Easy Updates Manager — позволяет гибко настраивать автоматические обновления для ядра, тем и плагинов.
- WP Auto Updater — автоматизирует обновления с возможностью логирования и уведомлений.
- Clearfy Pro — в том числе содержит функции оптимизации обновлений и безопасности.
Эти решения удобны, но иногда бывают избыточны или тяжеловесны. Наш подход с кастомным endpoint дает полный контроль и легкость.
Дополнительные рекомендации по автоматизации и мониторингу обновлений
После внедрения автоматического обновления важно настроить уведомления о результатах обновлений. Можно расширить функцию wpplugins_run_plugin_updates(), чтобы отправлять email или логировать события.
Пример отправки email после обновления:
function wpplugins_run_plugin_updates() {
if (!function_exists('wp_update_plugins')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
require_once ABSPATH . 'wp-admin/includes/update.php';
}
wp_update_plugins();
$updates = get_site_transient('update_plugins');
$updated_plugins = [];
if (!empty($updates->response)) {
foreach ($updates->response as $plugin_file => $plugin_info) {
$result = wpplugins_update_plugin($plugin_file);
if ($result) {
$updated_plugins[] = $plugin_info->slug;
}
}
}
if (!empty($updated_plugins)) {
wp_mail(get_option('admin_email'), 'Автоматическое обновление плагинов', 'Обновлены плагины: ' . implode(', ', $updated_plugins));
}
}Таким образом, вы будете всегда в курсе, что происходит с обновлениями.
Кроме того, следите за совместимостью обновленных плагинов и делайте регулярные бэкапы сайта, чтобы избежать потери данных при ошибках обновления.