Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Actualizaciones automáticas para tu plugin o tema propio, sin pasar por WordPress.org

Los plugins de WordPress.org se actualizan solos: WordPress pregunta al directorio si hay versiones nuevas y muestra el aviso. Pero si tu plugin es privado (para tus clientes) o comercial (lo vendes en tu sitio), no está en el directorio, y tus usuarios tendrían que descargar e instalar cada versión a mano. Google

Desde WordPress 5.8 hay una forma oficial de resolverlo.

Paso 1: la cabecera Update URI

En la cabecera del archivo principal del plugin, agrega Update URI con una dirección de tu dominio:

<?php
/**
 * Plugin Name: Mi Plugin Pro
 * Version:     1.2.0
 * Update URI:  https://actualizaciones.tudominio.cl/mi-plugin-pro
 */

Esta línea hace dos cosas:

  1. Le dice a WordPress que no busque este plugin en WordPress.org. Así evitas que un plugin del directorio con el mismo nombre de carpeta se instale «encima» del tuyo al actualizar, un riesgo real.
  2. Activa un filtro con el nombre de tu dominio (update_plugins_actualizaciones.tudominio.cl) donde puedes responder si hay una versión nueva.

Paso 2: el archivo de información en tu servidor

En tu servidor, publica un archivo JSON con los datos de la última versión, por ejemplo en https://actualizaciones.tudominio.cl/mi-plugin-pro/info.json:

{
	"version": "1.3.0",
	"package": "https://actualizaciones.tudominio.cl/mi-plugin-pro/mi-plugin-pro-1.3.0.zip",
	"url": "https://tudominio.cl/mi-plugin-pro/",
	"tested": "6.9",
	"requires_php": "8.1"
}

Cada vez que publiques una versión, subes el zip nuevo y actualizas este archivo.

Paso 3: el filtro en tu plugin

Dentro del plugin, agrega:

<?php
add_filter( 'update_plugins_actualizaciones.tudominio.cl', function ( $actualizacion, $datos, $archivo ) {
	if ( plugin_basename( __FILE__ ) !== $archivo ) {
		return $actualizacion;
	}

	$info = get_transient( 'mi_plugin_pro_info' );
	if ( false === $info ) {
		$respuesta = wp_remote_get( 'https://actualizaciones.tudominio.cl/mi-plugin-pro/info.json', array( 'timeout' => 10 ) );
		if ( is_wp_error( $respuesta ) || 200 !== wp_remote_retrieve_response_code( $respuesta ) ) {
			return $actualizacion;
		}
		$info = json_decode( wp_remote_retrieve_body( $respuesta ), true );
		set_transient( 'mi_plugin_pro_info', $info, 6 * HOUR_IN_SECONDS );
	}

	if ( empty( $info['version'] ) || empty( $info['package'] ) ) {
		return $actualizacion;
	}

	return array(
		'slug'         => dirname( plugin_basename( __FILE__ ) ),
		'version'      => $info['version'],
		'package'      => $info['package'],
		'url'          => $info['url'] ?? '',
		'tested'       => $info['tested'] ?? '',
		'requires_php' => $info['requires_php'] ?? '',
	);
}, 10, 3 );

WordPress compara la version que devuelves con la instalada. Si la tuya es mayor, muestra el aviso de actualización, el botón Actualizar ahora y, si el sitio lo tiene activado, la actualiza sola.

El filtro debe estar en el archivo principal del plugin (o en uno que se cargue siempre), porque __FILE__ tiene que apuntar al archivo principal. Y recuerda que solo funciona con el plugin activo: un plugin desactivado no ejecuta su código, así que no sabrá que hay actualización.

Paso 4: proteger la descarga con una licencia

Si vendes el plugin, no quieres que cualquiera descargue el zip. La forma habitual:

  1. Al comprar, la persona recibe una clave de licencia y la guarda en los ajustes del plugin.
  2. El plugin envía esa clave al pedir la información: info.json?licencia=XXXX&sitio=tudominio.cl.
  3. Tu servidor comprueba la licencia y solo entonces devuelve un enlace de descarga temporal y firmado.

Esa parte del servidor la puedes programar tú o usar una plataforma de venta de plugins que ya la incluya.

Nunca pongas en package un enlace permanente a un zip público si el plugin es de pago: se compartirá. Y sirve todo por HTTPS: si la información de actualización viaja sin cifrar, alguien podría cambiarla y hacer que miles de sitios instalen un zip malicioso.

¿Y para temas?

Funciona igual: agrega Update URI en la cabecera del style.css del tema y usa el filtro update_themes_{tu-dominio}.

Prueba antes de publicar

  1. Instala la versión 1.2.0 en un sitio de pruebas.
  2. Publica info.json con la 1.3.0.
  3. Borra el transitorio (wp transient delete mi_plugin_pro_info) y fuerza la búsqueda de actualizaciones (wp plugin list o Escritorio → Actualizaciones → Comprobar de nuevo).
  4. Actualiza y comprueba que todo funcione.

¿Distribuyes un plugin propio a tus clientes? Cuéntanos en el foro cómo manejas hoy sus actualizaciones.