В работе с WordPress важно отслеживать изменения, которые вносятся в плагины и темы после обновлений. Особенно это актуально для разработчиков и администраторов сайтов, которые хотят иметь историю изменений (changelog) для отладки и контроля. В этой статье мы разберем, как создать собственный плагин для автоматического сохранения changelog'ов после обновления плагинов и тем.
Почему важно сохранять changelog обновлений плагинов и тем
Обновления плагинов и тем часто включают исправления багов, новые функции и улучшения безопасности. Однако иногда обновление может вызвать конфликт или сломать функционал сайта. Если вы ведете историю изменений, то сможете быстро определить, какие обновления повлияли на работу сайта и откатиться к предыдущей версии, если потребуется.
WordPress не сохраняет changelog автоматически, поэтому полезно иметь собственный инструмент, который будет фиксировать эти данные и сохранять их в базе данных или в отдельных файлах.
Обзор решения: как работает плагин для сохранения changelog
Основная идея плагина — отследить событие обновления плагина или темы и получить changelog из источника обновления. Обычно changelog хранится в readme.txt плагина или темы, а также доступен на официальном репозиторие WordPress. Наш плагин будет перехватывать событие обновления, получать changelog и сохранять его в кастомную таблицу базы данных, чтобы потом можно было просмотреть историю изменений через админ-панель.
Основные этапы разработки плагина
- Создание структуры плагина и регистрация хуков обновления.
- Получение информации о новом обновлении и извлечение changelog.
- Сохранение changelog в базе данных.
- Создание интерфейса в админке для просмотра истории.
Регистрация хуков для отслеживания обновлений плагинов и тем
WordPress предоставляет специальные хуки, которые срабатывают при обновлении плагинов и тем. В частности, upgrader_process_complete — очень полезный хук, который вызывается после завершения процесса обновления.
Пример регистрации хука в нашем плагине wpeditor_save_changelog:
add_action('upgrader_process_complete', 'wpeditor_save_changelog_on_update', 10, 2);Функция wpeditor_save_changelog_on_update будет получать объект обновления и данные обновления, по которым можно определить, что именно обновилось — плагин или тема.
Пример функции обработки обновления
function wpeditor_save_changelog_on_update($upgrader_object, $options) {
if ($options['action'] == 'update' && ($options['type'] == 'plugin' || $options['type'] == 'theme')) {
$items = $options['plugins'] ?? $options['themes'] ?? [];
foreach ($items as $item) {
// Получаем changelog и сохраняем
wpeditor_save_changelog($item, $options['type']);
}
}
}В этой функции мы проверяем тип обновления и для каждого обновленного плагина или темы вызываем функцию сохранения changelog.
Получение changelog из репозитория WordPress
В репозитории WordPress changelog обычно хранится в разделе readme.txt плагина или темы. Мы можем получить содержимое этого файла через API WordPress.org и извлечь раздел changelog.
Для примера рассмотрим получение changelog плагина через API:
function wpeditor_get_changelog_from_wporg($slug, $type = 'plugin') {
$api_url = $type === 'plugin'
? 'https://api.wordpress.org/plugins/info/1.0/' . $slug . '.json'
: 'https://api.wordpress.org/themes/info/1.0/' . $slug . '.json';
$response = wp_remote_get($api_url);
if (is_wp_error($response)) return false;
$data = json_decode(wp_remote_retrieve_body($response));
if (!$data) return false;
return $data->changelog ?? false;
}Эта функция обращается к API WordPress.org, получает JSON с информацией и возвращает changelog. Если changelog отсутствует, возвращается false.
Сохранение changelog в базе данных
Для хранения changelog создадим отдельную таблицу в базе данных при активации плагина:
function wpeditor_save_changelog_install() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpeditor_changelogs';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
slug VARCHAR(255) NOT NULL,
type VARCHAR(20) NOT NULL,
changelog LONGTEXT NOT NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY slug_type (slug, type)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wpeditor_save_changelog_install');После создания таблицы реализуем функцию для сохранения changelog:
function wpeditor_save_changelog($slug, $type) {
global $wpdb;
$table_name = $wpdb->prefix . 'wpeditor_changelogs';
$changelog = wpeditor_get_changelog_from_wporg($slug, $type);
if (!$changelog) return;
$wpdb->replace(
$table_name,
[
'slug' => $slug,
'type' => $type,
'changelog' => $changelog,
'updated_at' => current_time('mysql')
],
['%s', '%s', '%s', '%s']
);
}Создание интерфейса для просмотра changelog в админке WordPress
Чтобы удобно просматривать сохраненные changelog, добавим страницу в меню админки. Для этого используем хук admin_menu:
add_action('admin_menu', 'wpeditor_changelog_admin_menu');
function wpeditor_changelog_admin_menu() {
add_menu_page(
'Changelog WPEditor',
'Changelog WPEditor',
'manage_options',
'wpeditor-changelog',
'wpeditor_changelog_page',
'dashicons-update',
80
);
}
function wpeditor_changelog_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpeditor_changelogs';
$results = $wpdb->get_results("SELECT * FROM $table_name ORDER BY updated_at DESC");
echo '<div class="wrap"><h1>История изменений (Changelog) обновленных плагинов и тем</h1>';
if (!$results) {
echo '<p>Changelog не найден.</p>';
} else {
foreach ($results as $row) {
echo '<h2>' . esc_html($row->slug) . ' (' . esc_html($row->type) . ')</h2>';
echo '<pre style="background:#f5f5f5; padding:10px; border:1px solid #ddd; white-space: pre-wrap;">' . esc_html($row->changelog) . '</pre>';
echo '<hr>';
}
}
echo '</div>';
}Расширения и улучшения плагина
Данный базовый плагин можно улучшить следующими способами:
- Добавить фильтрацию по плагинам и темам.
- Отправлять уведомления администратору при появлении новых changelog.
- Сохранять changelog в формате Markdown и отображать его с форматированием.
- Кэшировать changelog для уменьшения количества запросов к API WordPress.org.
Также можно расширить функционал, интегрируя плагин с системой контроля версий или отслеживания ошибок.
Выводы
Создание плагина для автоматического сохранения changelog — полезная задача для профессионального администрирования WordPress-сайтов. Такой инструмент помогает контролировать изменения, быстро реагировать на возможные проблемы после обновлений и вести историю изменений в удобном виде.
В статье приведены основные принципы и примеры кода, которые позволят вам создать собственный плагин и адаптировать его под свои нужды. Используйте данный подход, чтобы сделать управление обновлениями на вашем сайте прозрачным и безопасным.