Обновления для приватного плагина?
Если я разрабатываю приватный плагин, есть ли способ использовать механизм автоматического обновления WordPress для его обновления?
Я хочу инкапсулировать функциональность, но она специфична только для моих 5 блогов, поэтому плагин не подходит для публичного репозитория. Но мне очень нравится механизм простого обновления.
Есть ли способ это реализовать?

Похоже, что соответствующий код находится в wp-includes/update.php
, функция wp_update_plugins()
:
$to_send = (object) compact('plugins', 'active');
$options = array(
'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3),
'body' => array( 'plugins' => serialize( $to_send ) ),
'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
);
$raw_response = wp_remote_post('http://api.wordpress.org/plugins/update-check/1.0/', $options);
Он явно проверяет api.wordpress.org. Технически возможно передать ключ внутри $to_send
для делегирования проверки, но насколько мне известно, это не поддерживаемая функция.
Если подключиться к хуку set_site_transient_update_plugins
, можно добавить свои собственные данные о пакете в эту переменную. Похоже, эти значения будут доверенными при запуске обновления плагина. Смотрите wp-admin/update.php
и wp-admin/includes/class-wp-upgrader.php
. Исходя из кода в этих двух функциях, я думаю, что можно внедрить свой собственный сервер обновлений, вам просто нужно изучить, как форматируются данные о пакете, и соответствовать этому формату.

Этот плагин сделает это за вас:
Автоматические обновления для приватных и коммерческих плагинов
С незапамятных времён автоматические обновления поддерживали только плагины, размещённые в официальном каталоге WordPress.org. Теперь я написал PHP-библиотеку, которую вы можете использовать, чтобы добавить возможность автоматического обновления любому плагину. Публичные, приватные и коммерческие плагины — все теперь могут пользоваться преимуществами автоматических уведомлений об обновлениях и обновлений в один клик.

Возможно, вам также будет интересно управлять плагинами на своей стороне... например, с помощью пакета wp-update-server
, написанного тем же автором ;) https://github.com/YahnisElsts/wp-update-server Используя этот сервер, вы можете защитить свои плагины, как описано здесь: http://w-shadow.com/blog/2013/03/19/plugin-updates-securing-download-links/

как я могу отключить стандартную проверку обновлений WordPress для бесплатных плагинов?

Хотя сайт выглядит устаревшим, проект активно поддерживается и работает с приватными репозиториями Bitbucket/Github! Подробнее о доступных интеграциях смотрите в их репозитории на Github https://github.com/YahnisElsts/plugin-update-checker

Начиная с WordPress версии 5.8, стало значительно проще создать базовую версию функционала для обновления пользовательских плагинов.
Шаг 1
Создайте JSON-файл на вашем сервере. Он будет содержать информацию о последней версии вашего плагина (или плагинов) и ссылку на ZIP-архив(ы), чтобы WordPress мог автоматически загрузить его при запуске обновления.
Пример расположения: https://my-domain.com/custom-plugins/plugins-info.json
Пример содержимого:
{
"my-plugin/my-plugin.php":{
"version":"1.1",
"package":"https://my-domain.com/custom-plugins/my-plugin.zip"
}
}
Вы можете добавить информацию о нескольких плагинах в этот JSON. Убедитесь, что ключ каждого плагина имеет формат имя_папки/имя_файла.php.
Конечно, WordPress покажет доступность новой версии только в том случае, если версия плагина в JSON больше, чем установленная у вас.
Для полного списка данных плагина(ов), которые можно указать в JSON-файле, ознакомьтесь с параметром $update здесь.
Шаг 2
Добавьте "Update URI" в основной файл плагина (секция комментариев). Он должен ссылаться на ваш пользовательский JSON-файл, созданный на шаге 1.
<?php
/**
* Plugin Name: Мой плагин
* Version: 1.0
* Update URI: https://my-domain.com/custom-plugins/plugins-info.json
*
*/
Шаг 3
Добавьте этот код в основной файл вашего пользовательского плагина (или в functions.php)
ВАЖНО: Замените "my-domain.com" внутри функции add_filter на фактический домен, который вы используете для JSON-файла.
if( ! function_exists( 'my_plugin_check_for_updates' ) ){
function my_plugin_check_for_updates( $update, $plugin_data, $plugin_file ){
static $response = false;
if( empty( $plugin_data['UpdateURI'] ) || ! empty( $update ) )
return $update;
if( $response === false )
$response = wp_remote_get( $plugin_data['UpdateURI'] );
if( empty( $response['body'] ) )
return $update;
$custom_plugins_data = json_decode( $response['body'], true );
if( ! empty( $custom_plugins_data[ $plugin_file ] ) )
return $custom_plugins_data[ $plugin_file ];
else
return $update;
}
add_filter('update_plugins_my-domain.com', 'my_plugin_check_for_updates', 10, 3);
}

Если вам нравится бесплатный ... и вы хотите использовать что-то вроде GitHub, GitLab или BitBucket, это качественный и поддерживаемый плагин для работы с ними (поддерживает приватные и корпоративные репозитории):

Я тоже изучаю этот вопрос. Вот несколько ссылок, которые могут быть полезными:
Первая ссылка содержит информацию и указания по API обновлений. Вторая - фрагмент кода, показывающий, как фактически запрашивать информацию из API.
get_api_data()
<?php
/*
Получение данных из API плагинов
*/
function get_api_data($per_page, $page)
{
$fields = array(
'downloaded' => true,
'author' => false,
'author_profile' => false,
'contributors' => false,
'requires' => true,
'tested' => false,
'compatibility' => false,
'homepage' => false,
'description' => false,
'last_updated' => true,
'added' => true
);
$body = (object) array('browse' => 'new', 'page' => $page, 'per_page' => $per_page, 'fields' => $fields);
$post_data = array('action' => 'query_plugins', 'request' => serialize($body));
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_URL, 'http://api.wordpress.org/plugins/info/1.0/');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$return = curl_exec($ch);
curl_close($ch);
return unserialize($return);
}

Если вам нужно готовое решение без необходимости самостоятельного управления, обратите внимание на Kernl (https://kernl.us). Это сервис, который предоставляет инфраструктуру для обновления плагинов и упрощает интеграцию в ваши собственные плагины.

Возможно, вам стоит ознакомиться с плагином WordPress Development Kit. Я недавно перенёс свою проприетарную систему обновлений на этот плагин. Теперь он служит бэкенд-обработчиком для обновлений моего премиум-плагина.
Это решение схоже по настройке с тем, что предложил agileapricot выше. Плагин устанавливается как стандартный на сайт WordPress. Вы размещаете свои премиум-архивы .zip и файл plugins.json в рабочих или тестовых директориях на вашем сервере (указывается в настройках плагина).
Плагин также позволяет выводить список версий и даже предоставлять загрузку файлов на публичных, защищённых паролем или доступных по подписке страницах. Пример списка версий на странице можно посмотреть здесь.
Я использую этот плагин уже несколько месяцев для публикации списка изменений моих премиум-дополнений, списка текущих версий и загрузок для владельцев Premier-подписки. Теперь, начиная с версии 0.7.01, он также работает как конечная точка запросов для встроенных обновлений WordPress.
Надеюсь, кому-то это окажется полезным.

Если вы хотите создать собственный сервер обновлений, это достаточно легко сделать без использования библиотек, используя всего два хука: plugins_api
и site_transient_update_plugins
.
plugins_api
— используется для получения информации о плагине и отображения её в модальном окне, например:
site_transient_update_plugins
— необходим для отправки обновления с вашего сервера.
Подробнее об этом в этом руководстве: https://rudrastyh.com/wordpress/self-hosted-plugin-update.html

Я попробовал ваш код, но получаю ошибку Parse error: syntax error, unexpected '{' in

В этом коде я получаю ошибку // ничего не делать, если мы не получаем корректный ответ от сервера if( is_wp_error( $remote ) || 200 !== wp_remote_retrieve_response_code( $remote ) || empty( wp_remote_retrieve_body( $remote ) ) { return $res; }
