¿Actualizaciones para un plugin privado?

11 ago 2010, 22:43:40
Vistas: 41.8K
Votos: 135

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?

2
Comentarios

Si no quieres crear tu propia solución, puedes usar https://kernl.us para actualizaciones de plugins alojadas.

Jack Slingerland Jack Slingerland
8 may 2015 17:01:14

Creo que esto se discutió como una opción filtrable en la lista de correo wp-hackers en su momento. Nunca se resolvió, según recuerdo. Creo que la discusión relevante fue en este hilo: http://lists.automattic.com/pipermail/wp-hackers/2009-February/024796.html ...pero podría estar equivocado.

ZaMoose ZaMoose
11 ago 2010 23:20:15
Todas las respuestas a la pregunta 8
0
51

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.

11 ago 2010 23:16:44
3
46

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.

Repositorio en GitHub

12 dic 2010 17:58:17
Comentarios

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/

SimonSimCity SimonSimCity
9 jul 2014 10:32:01

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

csandreas1 csandreas1
11 nov 2017 09:03:21

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

wp-overwatch.com wp-overwatch.com
5 sept 2019 01:23:41
2
16

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);
    
}
11 abr 2022 03:31:30
Comentarios

¡Esto fue realmente útil, gracias!

Gavin Gavin
9 ene 2023 14:32:55

¿Cómo protegerías esto contra cualquier persona que descargue el plugin?

Toniq Toniq
11 ene 2024 21:26:43
3
10

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):

https://github.com/afragen/github-updater

20 sept 2016 03:34:28
Comentarios

¡Guau! ¡Parece un proyecto muy respaldado y maduro!

Armstrongest Armstrongest
12 oct 2016 23:44:00

Depender de otro plugin no parece una solución muy limpia.

kontur kontur
13 feb 2018 13:25:34

@kontur muy cierto, pero dado que esto es código abierto y se actualiza constantemente, podría usarse como un framework o simplemente como un ejemplo de código para construir el tuyo propio.

sMyles sMyles
13 feb 2018 16:28:36
2

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);
}
12 ago 2010 15:44:42
Comentarios

@Dougal - ¡Buenos enlaces!

MikeSchinkel MikeSchinkel
21 oct 2010 11:53:57

El segundo enlace no funciona, esta es la razón por la que realmente deberías intentar incluir el contenido de enlaces externos desde el principio si es posible.

Cyclonecode Cyclonecode
16 ene 2021 15:03:51
1

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.

8 may 2015 17:02:38
Comentarios

Esto parece viable.

kontur kontur
13 feb 2018 20:33:31
0

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.

5 may 2015 23:26:02
3

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:

Ejemplo de información del plugin mostrada en ventana modal

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

1 ago 2021 12:58:36
Comentarios

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

Naren Verma Naren Verma
24 nov 2022 04:56:24

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; }

Naren Verma Naren Verma
24 nov 2022 04:56:59

) falta en tu código

Naren Verma Naren Verma
24 nov 2022 05:00:58