Cómo descargar, instalar, activar y reemplazar los complementos de WordPress de manera programática y automática
Publicado: 2018-09-18Conseguir que los usuarios hagan cualquier cosa es difícil. Ya sea completando un formulario o simplemente realizando unos pocos clics, existe una resistencia inherente. Incluso si esa acción es por el bien de los usuarios, como cambiar una contraseña débil, no lo harán. Lo mismo se aplica para hacer que los usuarios instalen un complemento requerido, o peor aún, para reemplazar un complemento activo por uno nuevo. Está en el límite de la misión imposible.
Afortunadamente, con un poco de código y el consentimiento del usuario, podemos descargar, instalar, activar, desactivar e incluso eliminar complementos de WordPress. Este proceso automatizado, cuando se implementa de manera responsable, puede mejorar drásticamente la experiencia del usuario y aumentar las tasas de conversión para las acciones necesarias del usuario en el administrador de WordPress.
Conseguir que los usuarios hagan cualquier cosa es difícil. Entonces, ¿por qué no descargar, instalar y activar los complementos de #WordPress automáticamente? Solo se necesitan unas pocas líneas de código.
HAGA CLIC PARA TUITAR¿Por qué descargar, instalar y activar complementos mediante código?
Hay múltiples escenarios, pero aparte de la teoría, veamos la situación que WP Reset tiene a mano. Ya escribí una publicación sobre el cambio de marca de reset-wp a WP Reset. Además de otras cosas, el proceso implica que las personas que ya usan reset-wp lo eliminen de sus sitios y luego instalen WP Reset. ¿Por qué alguien haría eso solo porque se lo pedimos? E incluso si quieren hacerlo, se mostrarán reacios porque está lejos de ser dos clics. Sin embargo, si explicamos todo y lo reducimos a un botón: "Sí, adelante, reemplace reset-wp con Reset WP", entonces las cosas no se ven tan mal.
¡No te metas con los sitios de las personas sin su permiso! Período. Ni siquiera si es "una cosita pequeña". Eso no es cool. No es tu sitio. Notifique a los usuarios sobre cualquier cambio cuando actualicen el complemento o cuando agregue nuevas funciones.
Debido a las reglas de wp.org que nos impiden rastrear las acciones de los usuarios (sin su consentimiento y no queríamos molestarlos preguntándonos), lamentablemente no tengo números para compartir. Pero lo que puedo decirles es que no tuvimos quejas de los usuarios de reset-wp que pasaron por el proceso de reemplazo, o que simplemente vieron la notificación en el complemento. Y hemos estado ejecutando el proceso durante más de siete semanas.
¿Esta bien hacer esto? ¿Les importará a los usuarios?
¡A los usuarios seguramente les importará todo lo que hagas a sus espaldas! ¡No hagas eso! No haga nada sin el permiso de los usuarios. Especialmente si el complemento está alojado en wp.org porque eso va en contra de las reglas. Si lo hace, los administradores eliminarán rápidamente su complemento del repositorio.
Pero, si solicita permiso: “¿Podemos reemplazar el complemento A con el complemento B? Por favor confirmar." Entonces está bien hacerlo. El proceso de desactivar y eliminar un complemento y descargar y activar otro requiere más de unos pocos clics. Entonces, si logra automatizar ese proceso y reducirlo a un clic, los usuarios estarán satisfechos.
Un proceso similar de activación de complementos necesarios para temas ha estado en juego durante años, y los usuarios están de acuerdo con él. En lugar de seguir varios enlaces para instalar complementos, confirman que están de acuerdo con el proceso y se instalan varios complementos con un solo clic.
Como de costumbre, se necesita muy poco código
En pseudocódigo esta es la idea general de lo que queremos hacer:
// pseudo code only! // DO NOT copy & paste var $old_plugin; var $new_plugin; if ( is_plugin_installed( $new_plugin ) ) { // new plugin is already installed // make sure we have the last version upgrade_plugin( $new_plugin ); } else { install_plugin( $new_plugin ); } if ( !is_plugin_active( $new_plugin ) ) { // new plugin is not active - activate it activate_plugin( $new_plugin ); } // deactivate old plugin deactivate_plugin( $old_plugin ); // if needed delete old plugin delete_plugin( $old_plugin ); // pseudo code only! // DO NOT copy & paste
Es bastante simple y directo. Siempre que el usuario tenga los permisos de archivo correctos, todo funcionará sin problemas. El reemplazo completo no toma más de uno o dos segundos en completarse.
Necesitamos algunas funciones
Afortunadamente, WordPress tiene la mayoría de las funciones que necesitamos hechas o semi-hechas, por lo que es cuestión de armar las cosas.
Un concepto crucial para entender es cómo WordPress identifica un complemento, cómo sabe qué complemento es cuál. Lo hace mediante el complemento slug: una combinación del nombre de la carpeta del complemento y el archivo PHP principal. Por ejemplo: hola-muñeca/hola-muñeca.php. El archivo PHP principal es el archivo con los encabezados del complemento. Para obtener el slug, ejecute plugin_basename( __FILE__ )
. Siempre que tenga que verificar si un complemento está activo o desea hacer algo con él, debe usar el slug del complemento. Este slug es similar pero no igual al slug de wp.org. En el repositorio, el slug es solo el nombre de la carpeta, sin el nombre del archivo. Entonces, para Hello Dolly es "hello-dolly". No necesitamos eso en este momento, pero necesita ser aclarado. Para una lectura más profunda sobre este tema un tanto confuso, consulte este hilo en Stack Exchange.
WordPress identifica los complementos por su slug, es decir, hello-dolly/hello-dolly.php. Para obtener el slug, ejecute plugin_basename( __FILE__ )
en el archivo principal del complemento.
is_plugin_active( $plugin_slug )
viene incorporado, por lo que no tenemos nada que hacer. La página del códice no revela mucho más, es una función simple.
is_plugin_installed( $plugin_slug )
no viene integrado, pero solo se trata de unas pocas líneas de código.
function is_plugin_installed( $slug ) { if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = get_plugins(); if ( !empty( $all_plugins[$slug] ) ) { return true; } else { return false; } }
Esas son todas las funciones de prueba condicionales que necesitamos. Ahora para los que hacen algo. activate_plugin( )
está integrado y tiene cuatro parámetros, así que consulte la página del Codex al respecto.
deactivate_plugins( $plugin_slug )
también está disponible listo para usar, pero asegúrese de anotar la "s" (plural) en el nombre de las funciones. También tiene algunos parámetros, así que lea la página del Codex.
install_plugin( $plugin_zip )
está disponible como parte de la clase Plugin_Upgrader
. No es necesario ningún código adicional, solo una nueva instancia de clase. Lo mismo ocurre con upgrade_plugin( $plugin_slug )
.
function install_plugin( $plugin_zip ) { include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; wp_cache_flush(); $upgrader = new Plugin_Upgrader(); $installed = $upgrader->install( $plugin_zip ); return $installed; } function upgrade_plugin( $plugin_slug ) { include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; wp_cache_flush(); $upgrader = new Plugin_Upgrader(); $upgraded = $upgrader->upgrade( $plugin_slug ); return $upgraded; }
wp_cache_flush()
puede no ser necesario, pero lo agregué solo para estar seguro. Además de que las cosas tardan 10 ms más en ejecutarse, no puede hacer ningún daño.
Poniendolo todo junto
Si está leyendo este artículo no por curiosidad, sino por una necesidad real de implementar el código en un complemento, le sugiero que instale el complemento reset-wp. Leer sobre el código es agradable, pero nada se compara con las pruebas en la naturaleza.
Mi preferencia es usar admin_action para casi todo lo que no necesita una GUI de administración completa. Entonces, agregue esto a la función donde se agregan otras acciones y filtros: add_action( 'admin_action_replace_plugin', 'replace_plugin' );
. Cuando el usuario abre admin.php?action=replace_plugin, nuestro código se ejecutará. Por favor, no codifique esa URL. Use algo como: $url = add_query_arg(array('action' => 'replace_plugin'), admin_url('admin.php'));
. Dice mucho sobre la calidad de su código.
Aquí está el código que puede copiar/pegar. Obviamente, modifique las tres variables en la parte superior con sus valores.
function replace_plugin() { // modify these variables with your new/old plugin values $plugin_slug = 'wp-reset/wp-reset.php'; $plugin_zip = 'https://downloads.wordpress.org/plugin/wp-reset.latest-stable.zip'; $old_plugin_slug = 'reset-wp/reset-wp.php'; echo 'If things are not done in a minute <a href="plugins.php">click here to return to Plugins page</a><br><br>'; echo 'Starting ...<br><br>'; echo 'Check if new plugin is already installed - '; if ( is_plugin_installed( $plugin_slug ) ) { echo 'it\'s installed! Making sure it\'s the latest version.'; upgrade_plugin( $plugin_slug ); $installed = true; } else { echo 'it\'s not installed. Installing.'; $installed = install_plugin( $plugin_zip ); } if ( !is_wp_error( $installed ) && $installed ) { echo 'Activating new plugin.'; $activate = activate_plugin( $plugin_slug ); if ( is_null($activate) ) { echo '<br>Deactivating old plugin.<br>'; deactivate_plugins( array( $old_plugin_slug ) ); echo '<br>Done! Everything went smooth.'; } } else { echo 'Could not install the new plugin.'; } } function is_plugin_installed( $slug ) { if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = get_plugins(); if ( !empty( $all_plugins[$slug] ) ) { return true; } else { return false; } } function install_plugin( $plugin_zip ) { include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; wp_cache_flush(); $upgrader = new Plugin_Upgrader(); $installed = $upgrader->install( $plugin_zip ); return $installed; } function upgrade_plugin( $plugin_slug ) { include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; wp_cache_flush(); $upgrader = new Plugin_Upgrader(); $upgraded = $upgrader->upgrade( $plugin_slug ); return $upgraded; }
El código usa todo lo que ya discutimos. La GUI y los mensajes son muy básicos, así que agregue un poco de CSS o cargue la URL en un lightbox como lo hicimos en reset-wp.
Realizar automáticamente tareas mundanas y aburridas para los usuarios siempre es una gran ventaja para #UX. Vea cómo puede descargar, instalar y activar fácilmente múltiples complementos de #WordPress con un solo clic.
HAGA CLIC PARA TUITARUn clic siempre es mejor que diez
¡Hacer que los usuarios hagan clic una vez en lugar de diez siempre es algo positivo! Es una señal de buena UX (experiencia de usuario). Entonces, si su complemento o tema requiere otros complementos, recomendaría implementar un procedimiento de instalación con un solo clic para todas las dependencias. Sin duda, obtendrá menos tickets de soporte de personas en las primeras etapas del uso del complemento.
En cuanto a reemplazar un complemento por otro, trate de mantenerse al margen de esas situaciones. A veces es inevitable, pero el problema es que nunca logrará que todos los usuarios cambien al nuevo complemento, lo que significa que debe admitir dos complementos o abandonar y decepcionar a una parte de su base de usuarios que continúa usando el antiguo complemento. Nos enfrentamos a la misma decisión con reset-wp y no nos gusta ninguna de esas dos soluciones.