¿Actualizaciones para un plugin privado?
Si escribo un plugin privado, ¿hay alguna manera de usar el mecanismo de actualización automática de WordPress para actualizarlo?
Quiero encapsular la funcionalidad, pero es específica para mis propios 5 blogs aproximadamente, por lo que no es un buen candidato para el repositorio público de plugins. Pero me encanta el mecanismo de actualización fácil.
¿Hay alguna forma de hacer esto?

Parece que el código aplicable está en wp-includes/update.php
, específicamente en 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);
Específicamente verifica api.wordpress.org. Técnicamente hablando, sería posible pasar una clave dentro de $to_send
para delegar la verificación, pero hasta donde sé, eso no es una característica soportada.
Si te conectas a set_site_transient_update_plugins
, podrías agregar tus propios detalles de paquete en esta variable. Parece que esos valores serán confiados cuando ejecutes el actualizador de plugins. Revisa wp-admin/update.php
y wp-admin/includes/class-wp-upgrader.php
. Dado el código en estas dos funciones, creo que sería posible inyectar tu propio servidor de actualización, solo necesitas ver cómo están formateados los detalles del paquete y hacer coincidir eso.

Este plugin lo hace por ti:
Actualizaciones automáticas para plugins privados y comerciales
Desde tiempos inmemoriales, solo los plugins alojados en el directorio oficial de WordPress.org soportaban actualizaciones automáticas. Ahora, he escrito una biblioteca PHP que puedes usar para agregar capacidades de actualización automática a cualquier plugin. Plugins públicos, privados y comerciales por igual, todos pueden ahora disfrutar de los beneficios de notificaciones de actualización automática y actualizaciones con un solo clic.

También puede interesarte gestionar los plugins en tu propio servidor... quizás con el paquete wp-update-server
, escrito por el mismo autor ;) https://github.com/YahnisElsts/wp-update-server Al usar este servidor, puedes proteger tus plugins, como se describe aquí: http://w-shadow.com/blog/2013/03/19/plugin-updates-securing-download-links/

¿cómo puedo deshabilitar el verificador de actualizaciones por defecto de WordPress en plugins gratuitos?

Aunque ese sitio web parece desactualizado, el proyecto tiene un soporte muy activo, ¡y también funciona con repositorios privados de Bitbucket/Github! Consulta su repositorio en Github para más información sobre las diferentes integraciones disponibles https://github.com/YahnisElsts/plugin-update-checker

Desde WordPress v5.8, es mucho más sencillo crear una versión básica de funcionalidad personalizada de actualización de plugins.
Paso 1
Crea un archivo JSON en tu servidor. Contendrá información sobre el número de versión más reciente de tus plugin(s) y el enlace al archivo ZIP para que WordPress lo descargue automáticamente cuando se active la actualización.
Ejemplo de ubicación: https://mi-dominio.com/plugins-personalizados/info-plugins.json
Ejemplo de contenido:
{
"mi-plugin/mi-plugin.php":{
"version":"1.1",
"package":"https://mi-dominio.com/plugins-personalizados/mi-plugin.zip"
}
}
Puedes agregar información de múltiples plugins a ese JSON. Solo asegúrate de que la clave del plugin para cada uno esté en formato nombre_directorio/nombre_archivo.php.
Por supuesto, solo cuando la versión del plugin en el JSON sea mayor que la versión que tienes instalada, WordPress te mostrará que hay una nueva versión disponible.
Para la lista completa de datos del plugin(s) que puedes establecer en el archivo JSON, consulta el parámetro $update aquí
Paso 2
Agrega "Update URI" al archivo principal del plugin (sección de comentarios). Debe enlazar al archivo JSON personalizado que creaste en el paso 1.
<?php
/**
* Plugin Name: Mi plugin
* Version: 1.0
* Update URI: https://mi-dominio.com/plugins-personalizados/info-plugins.json
*
*/
Paso 3
Agrega este código al archivo principal del plugin personalizado (o a functions.php)
IMPORTANTE: Cambia "mi-dominio.com" dentro de la función add_filter por el dominio real que estás usando para el archivo JSON.
if( ! function_exists( 'mi_plugin_check_for_updates' ) ){
function mi_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_mi-dominio.com', 'mi_plugin_check_for_updates', 10, 3);
}

Si te gusta lo gratuito... y quieres usar algo como GitHub, GitLab o BitBucket, este es un plugin de buena calidad y soportado para manejarlo (soporta privado y empresarial):

Estoy investigando lo mismo. Un par de enlaces que he encontrado que podrían ser útiles:
El primero es información y referencias a la API de actualizaciones. El segundo es un fragmento de código que muestra cómo solicitar información a la API.
get_api_data()
<?php
/*
Recupera elementos de la API de plugins
*/
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);
}

Si buscas una solución alojada que no tengas que gestionar, echa un vistazo a Kernl (https://kernl.us). Es un servicio que proporciona la infraestructura para actualizar complementos y facilita su integración en tus propios complementos.

Quizás quieras echar un vistazo al plugin WordPress Development Kit. Recientemente migré mi sistema de actualizaciones propietario a este plugin. Ahora el plugin funciona como el procesador backend para las actualizaciones de mis plugins premium.
La configuración es similar a la solución proporcionada por agileapricot mencionada anteriormente. Se instalará como un plugin estándar en un sitio WordPress. Alojas tus archivos .zip premium y el plugins.json en directorios de producción o prerelease en tu servidor (especificados en los ajustes del plugin).
El plugin también te permite listar versiones de plugins e incluso proporcionar una descarga de los archivos en páginas públicas, protegidas por contraseña o por suscripción. Puedes ver un ejemplo del listado de versiones en la página aquí.
He estado usando este plugin durante meses para publicar el registro de cambios de mis add-ons premium, la lista de versiones actuales y listas de descarga para los titulares de mi Suscripción Premier. Ahora, con la versión 0.7.01, también funciona como destino de consulta para las actualizaciones integradas de WordPress.
Espero que algunos de vosotros lo encontréis útil.

Si estás interesado en crear tu propio servidor de actualizaciones, es bastante fácil hacerlo sin bibliotecas utilizando solo dos filtros: plugins_api
y site_transient_update_plugins
plugins_api
– se utiliza para obtener la información del plugin y mostrarla en la ventana modal, ejemplo:
site_transient_update_plugins
es necesario para enviar la actualización desde tu servidor.
Más información en este tutorial: https://rudrastyh.com/wordpress/self-hosted-plugin-update.html

He probado tu código pero obtengo un error Parse error: syntax error, unexpected '{' in

En este código estoy obteniendo el error // no hacer nada si no obtenemos la respuesta correcta del servidor if( is_wp_error( $remote ) || 200 !== wp_remote_retrieve_response_code( $remote ) || empty( wp_remote_retrieve_body( $remote ) ) { return $res; }
