wpquiz.ru wordpress WPQuiz.ru

Автоматическое создание обновлений для плагинов WordPress: практическое руководство

В процессе разработки и поддержки плагинов для WordPress важной задачей является организация системы обновлений. Благодаря автоматическим обновлениям пользователи всегда получают свежие версии плагинов с исправлениями ошибок и новыми функциями, а разработчик снижает нагрузку на службу поддержки. В этой статье мы подробно разберём, как настроить автоматическое создание обновлений плагина WordPress, используя собственный сервер обновлений и примеры кода.

Зачем нужна система автоматических обновлений плагина WordPress

Когда вы публикуете плагин вне официального репозитория WordPress, например, на собственном сайте или маркетплейсе, обновления не будут автоматически доступны через стандартный механизм WP. В таких случаях необходимо реализовать свой API для проверки и доставки обновлений. Это повышает доверие пользователей к вашему продукту и облегчает процесс поддержки.

Основные преимущества автоматических обновлений:

  • Уведомление пользователей о новых версиях;
  • Автоматическая загрузка и установка обновлений;
  • Контроль версий и совместимости;
  • Повышение безопасности и стабильности плагина.

Как работает система обновлений плагина в WordPress

Стандартный механизм обновлений плагинов в WordPress основан на API, который запрашивает список доступных обновлений у официального репозитория. Для собственного плагина нужно реализовать аналогичный API, который будет возвращать данные о новой версии.

Обновления для плагина реализуются с помощью фильтра pre_set_site_transient_update_plugins, который позволяет внедрить данные о новых версиях в список обновлений WordPress. Также используется фильтр plugins_api для отображения дополнительной информации о версии в админке.

Реализация собственного API для обновлений плагина

Для начала создадим простой API на сервере, который будет отдавать данные о последней версии плагина в формате JSON.

header('Content-Type: application/json');
$plugin_slug = 'my-plugin-slug';
$latest_version = '1.2.3';
$download_url = 'https://example.com/downloads/my-plugin.zip';

$response = [
    'slug' => $plugin_slug,
    'new_version' => $latest_version,
    'url' => 'https://example.com/my-plugin-info',
    'package' => $download_url
];
echo json_encode($response);

Этот скрипт возвращает информацию о новой версии, которую будет читать WordPress.

Добавление проверки обновлений в плагин WordPress

В плагине добавим код для проверки обновлений с удалённого сервера. В этом примере функции начинаются с префикса wpquiz_ согласно тематике сайта.

add_filter('pre_set_site_transient_update_plugins', 'wpquiz_check_for_plugin_update');
function wpquiz_check_for_plugin_update($transient) {
    if (empty($transient->checked)) {
        return $transient;
    }

    $remote_url = 'https://example.com/api/plugin-update.php';
    $response = wp_remote_get($remote_url);
    if (is_wp_error($response) || wp_remote_retrieve_response_code($response) != 200) {
        return $transient;
    }

    $remote_data = json_decode(wp_remote_retrieve_body($response));
    $plugin_file = plugin_basename(__FILE__); // например, my-plugin/my-plugin.php

    if (version_compare($remote_data->new_version, $transient->checked[$plugin_file], '>')) {
        $obj = new stdClass();
        $obj->slug = $remote_data->slug;
        $obj->new_version = $remote_data->new_version;
        $obj->url = $remote_data->url;
        $obj->package = $remote_data->package;

        $transient->response[$plugin_file] = $obj;
    }

    return $transient;
}

Этот код получает данные о новой версии и добавляет их в список обновлений WordPress, если версия на сервере новее установленной.

Добавление информации о версии для страницы плагина

Чтобы корректно отображать информацию о новой версии и описание, добавим фильтр plugins_api:

add_filter('plugins_api', 'wpquiz_plugin_api_info', 10, 3);
function wpquiz_plugin_api_info($res, $action, $args) {
    if ($args->slug !== 'my-plugin-slug') {
        return false;
    }

    $remote_url = 'https://example.com/api/plugin-info.php?slug=' . $args->slug;
    $response = wp_remote_get($remote_url);
    if (is_wp_error($response) || wp_remote_retrieve_response_code($response) != 200) {
        return false;
    }

    $plugin_info = json_decode(wp_remote_retrieve_body($response));

    $res = new stdClass();
    $res->name = $plugin_info->name;
    $res->slug = $plugin_info->slug;
    $res->version = $plugin_info->version;
    $res->author = $plugin_info->author;
    $res->homepage = $plugin_info->homepage;
    $res->download_link = $plugin_info->download_link;
    $res->sections = [
        'description' => $plugin_info->description,
        'changelog' => $plugin_info->changelog,
    ];

    return $res;
}

На сервере API plugin-info.php должен отдавать расширенную информацию о плагине, которая отобразится в админке при просмотре деталей обновления.

Рекомендации по безопасности и производительности

Важно обезопасить API от несанкционированного доступа. Рекомендуется реализовать проверку авторизации, например, с помощью токенов или IP-фильтрации. Также стоит кэшировать ответы API, чтобы не нагружать сервер частыми запросами.

Для уменьшения нагрузки на сайт клиента можно использовать transient API WordPress для кэширования результата проверки обновлений:

function wpquiz_check_for_plugin_update($transient) {
    if (empty($transient->checked)) {
        return $transient;
    }

    $cached = get_transient('wpquiz_plugin_update');
    if ($cached !== false) {
        return $cached;
    }

    // Выполняем запрос к серверу обновлений
    // ...

    set_transient('wpquiz_plugin_update', $transient, 12 * HOUR_IN_SECONDS);
    return $transient;
}

Это позволит проверять обновления не чаще одного раза в 12 часов, снижая количество запросов.

Примеры готовых решений и плагинов

Если вы не хотите писать свой механизм обновлений с нуля, можно воспользоваться готовыми библиотеками:

  • Plugin Update Checker — популярный PHP-класс для интеграции обновлений плагинов вне репозитория;
  • Clearfy Pro — плагин с расширенными возможностями оптимизации, включая управление обновлениями.

Оба варианта существенно упрощают задачу и позволяют сосредоточиться на развитии функционала плагина.

Выводы и советы по реализации

Автоматическое создание обновлений для плагинов WordPress — ключ к удобству пользователей и успешной поддержке продукта. Организация собственного API обновлений требует понимания работы фильтров WordPress и умения работать с удалёнными запросами.

Используйте кэширование и защищайте API, чтобы обеспечить безопасный и стабильный обмен данными. При необходимости обратитесь к готовым решениям, которые ускорят разработку и повысят качество вашего плагина.

Подробное знание этой темы позволит вам создавать профессиональные плагины с удобным механизмом обновлений, повышая лояльность пользователей и облегчая поддержку.

×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙