Desinstalar, Activar, Desactivar un plugin: características típicas y cómo hacerlo

15 ago 2011, 02:21:36
Vistas: 62.1K
Votos: 110

Estoy creando un plugin para WordPress. ¿Cuáles son las cosas típicas que debería incluir en la función de desinstalación?

Por ejemplo, ¿debería eliminar las tablas que creé en la función de instalación?

¿Debo limpiar mis entradas de opciones?

¿Algo más?

2
Comentarios

Perdí mucho tiempo intentando que funcionara. El problema es que el hook init no funciona dentro del registro de hooks. Supongo que ningún hook (acción o filtro) funcionará tan temprano. Lee las notas en el enlace de abajo. http://codex.wordpress.org/Function_Reference/register_activation_hook Dice: "¡Registrar el hook dentro de tu hook plugins_loaded es demasiado tarde y no se ejecutará! (Incluso cuando parece funcionar para register_deactivation_hook hasta el hook wp_loaded)"

Anton Anton
9 nov 2011 14:43:50

Soy quien actualizó el codex con lo que mencionas, así que esto ya está considerado en la respuesta de arriba ↑. :)

kaiser kaiser
28 feb 2012 02:00:19
Todas las respuestas a la pregunta 2
23
165

Existen tres ganchos diferentes. Se activan en los siguientes casos:

  • Desinstalación
  • Desactivación
  • Activación

Cómo activar funciones de forma segura durante estos escenarios

Lo siguiente muestra las formas correctas de enganchar de manera segura funciones de callback que se activan durante las acciones mencionadas.

Como podrías usar este código en un plugin que utiliza:

  • funciones simples,
  • una clase o
  • una clase externa,

mostraré tres plugins de demostración diferentes que puedes inspeccionar y luego implementar el código en tus propios plugins.

¡Nota importante de antemano!

Como este tema es extremadamente difícil y muy detallado, con docenas de casos extremos, esta respuesta nunca será perfecta. La seguiré mejorando con el tiempo, así que revísala regularmente.

(1) Activar/Desactivar/Desinstalar plugins.

Las funciones de callback de configuración del plugin son activadas por el núcleo de WordPress y tú no tienes influencia sobre cómo lo hace. Hay algunas cosas que recordar:

  • Nunca, bajo ninguna circunstancia, uses echo/print durante las funciones de callback de configuración. Esto generará un mensaje de headers already sent y el núcleo recomendará desactivar y eliminar tu plugin... no preguntes: ya lo sé...
  • No verás ninguna salida visual. Pero he añadido declaraciones exit() a todas las funciones de callback para que puedas entender lo que realmente está pasando. Simplemente descoméntalas para ver cómo funciona.
  • Es extremadamente importante que verifiques si __FILE__ != WP_PLUGIN_INSTALL y (si no es así: ¡aborta!) para asegurarte de que realmente se está desinstalando el plugin. Recomiendo activar las funciones on_deactivation() durante el desarrollo, así ahorras el tiempo que necesitarías para restaurar todo. Al menos eso es lo que hago yo.
  • También incluyo algunas medidas de seguridad. Algunas ya las realiza el núcleo, pero ¡más vale prevenir que lamentar!.
    • Primero, impido el acceso directo al archivo si el núcleo no está cargado: defined( 'ABSPATH' ) OR exit;
    • Luego verifico si el usuario actual tiene permisos para realizar esta tarea.
    • Como última tarea, verifico el referente. Nota: Pueden ocurrir resultados inesperados con una pantalla wp_die() que solicite permisos adecuados (y si quieres intentarlo otra vez... claro, por supuesto), cuando hay un error. Esto sucede porque el núcleo te redirige, establece la acción actual $GLOBALS['wp_list_table']->current_action(); como error_scrape y luego verifica el referente con check_admin_referer('plugin-activation-error_' . $plugin);, donde $plugin es $_REQUEST['plugin']. Así que la redirección ocurre a mitad de la carga de la página y aparece esta extraña barra de desplazamiento y la pantalla de error dentro del cuadro de notificación/mensaje amarillo del administrador. Si esto pasa: Mantén la calma y busca el error con algunos exit() y depuración paso a paso.

(A) Plugin con funciones simples

Recuerda que esto podría no funcionar si enganchas las funciones de callback antes de su definición.

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activar/Desactivar/Desinstalar - Funciones
 * Description: Plugin de ejemplo para mostrar callbacks de activación/desactivación/desinstalación con funciones simples.
 * Author:      Franz Josef Kaiser/wecodemore
 * Author URL:  http://unserkaiser.com
 * Plugin URL:  http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
 */

function WCM_Setup_Demo_on_activation()
{
    if ( ! current_user_can( 'activate_plugins' ) )
        return;
    $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
    check_admin_referer( "activate-plugin_{$plugin}" );

    # Descomenta la siguiente línea para ver la función en acción
    # exit( var_dump( $_GET ) );
}

function WCM_Setup_Demo_on_deactivation()
{
    if ( ! current_user_can( 'activate_plugins' ) )
        return;
    $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
    check_admin_referer( "deactivate-plugin_{$plugin}" );

    # Descomenta la siguiente línea para ver la función en acción
    # exit( var_dump( $_GET ) );
}

function WCM_Setup_Demo_on_uninstall()
{
    if ( ! current_user_can( 'activate_plugins' ) )
        return;
    check_admin_referer( 'bulk-plugins' );

    // Importante: Verifica si el archivo es el mismo
    // que se registró durante el gancho de desinstalación.
    if ( __FILE__ != WP_UNINSTALL_PLUGIN )
        return;

    # Descomenta la siguiente línea para ver la función en acción
    # exit( var_dump( $_GET ) );
}

register_activation_hook(   __FILE__, 'WCM_Setup_Demo_on_activation' );
register_deactivation_hook( __FILE__, 'WCM_Setup_Demo_on_deactivation' );
register_uninstall_hook(    __FILE__, 'WCM_Setup_Demo_on_uninstall' );

(B) Arquitectura basada en clases/POO

Este es el ejemplo más común en los plugins actuales.

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activar/Desactivar/Desinstalar - CLASE
 * Description: Plugin de ejemplo para mostrar callbacks de activación/desactivación/desinstalación con clases/objetos.
 * Author:      Franz Josef Kaiser/wecodemore
 * Author URL:  http://unserkaiser.com
 * Plugin URL:  http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
 */


register_activation_hook(   __FILE__, array( 'WCM_Setup_Demo_Class', 'on_activation' ) );
register_deactivation_hook( __FILE__, array( 'WCM_Setup_Demo_Class', 'on_deactivation' ) );
register_uninstall_hook(    __FILE__, array( 'WCM_Setup_Demo_Class', 'on_uninstall' ) );

add_action( 'plugins_loaded', array( 'WCM_Setup_Demo_Class', 'init' ) );
class WCM_Setup_Demo_Class
{
    protected static $instance;

    public static function init()
    {
        is_null( self::$instance ) AND self::$instance = new self;
        return self::$instance;
    }

    public static function on_activation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "activate-plugin_{$plugin}" );

        # Descomenta la siguiente línea para ver la función en acción
        # exit( var_dump( $_GET ) );
    }

    public static function on_deactivation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "deactivate-plugin_{$plugin}" );

        # Descomenta la siguiente línea para ver la función en acción
        # exit( var_dump( $_GET ) );
    }

    public static function on_uninstall()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        check_admin_referer( 'bulk-plugins' );

        // Importante: Verifica si el archivo es el mismo
        // que se registró durante el gancho de desinstalación.
        if ( __FILE__ != WP_UNINSTALL_PLUGIN )
            return;

        # Descomenta la siguiente línea para ver la función en acción
        # exit( var_dump( $_GET ) );
    }

    public function __construct()
    {
        # INICIALIZAR el plugin: Engancha tus callbacks
    }
}

(C) Arquitectura basada en clases/POO con un objeto de configuración externo

Este escenario asume que tienes un archivo principal del plugin y un segundo archivo llamado setup.php en un subdirectorio del plugin llamado inc: ~/wp-content/plugins/tu_plugin/inc/setup.php. Esto también funcionará cuando la carpeta del plugin esté fuera de la estructura predeterminada de WP, cuando el directorio de contenido tenga otro nombre o cuando tu archivo de configuración tenga un nombre diferente. Solo la carpeta inc debe tener el mismo nombre y ubicación relativa desde el directorio raíz del plugin.

Nota: Puedes tomar las tres funciones register_*_hook()* y las clases y colocarlas directamente en tu plugin.

El archivo principal del plugin:

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activar/Desactivar/Desinstalar - ARCHIVO/CLASE
 * Description: Plugin de ejemplo
 * Author:      Franz Josef Kaiser/wecodemore
 * Author URL:  http://unserkaiser.com
 * Plugin URL:  http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
 */


register_activation_hook(   __FILE__, array( 'WCM_Setup_Demo_File_Inc', 'on_activation' ) );
register_deactivation_hook( __FILE__, array( 'WCM_Setup_Demo_File_Inc', 'on_deactivation' ) );
register_uninstall_hook(    __FILE__, array( 'WCM_Setup_Demo_File_Inc', 'on_uninstall' ) );

add_action( 'plugins_loaded', array( 'WCM_Setup_Demo_File', 'init' ) );
class WCM_Setup_Demo_File
{
    protected static $instance;

    public static function init()
    {
        is_null( self::$instance ) AND self::$instance = new self;
        return self::$instance;
    }

    public function __construct()
    {
        add_action( current_filter(), array( $this, 'load_files' ), 30 );
    }

    public function load_files()
    {
        foreach ( glob( plugin_dir_path( __FILE__ ).'inc/*.php' ) as $file )
            include_once $file;
    }
}

El archivo de configuración:

<?php
defined( 'ABSPATH' ) OR exit;

class WCM_Setup_Demo_File_Inc
{
    public static function on_activation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "activate-plugin_{$plugin}" );

        # Descomenta la siguiente línea para ver la función en acción
        # exit( var_dump( $_GET ) );
    }

    public static function on_deactivation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "deactivate-plugin_{$plugin}" );

        # Descomenta la siguiente línea para ver la función en acción
        # exit( var_dump( $_GET ) );
    }

    public static function on_uninstall()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        check_admin_referer( 'bulk-plugins' );

        // Importante: Verifica si el archivo es el mismo
        // que se registró durante el gancho de desinstalación.
        if ( __FILE__ != WP_UNINSTALL_PLUGIN )
            return;

        # Descomenta la siguiente línea para ver la función en acción
        # exit( var_dump( $_GET ) );
    }
}

(2) Actualizaciones de plugins

Si escribes un plugin que tiene su propia tabla en la base de datos u opciones, puede haber escenarios donde necesites cambiar o actualizar cosas.

Lamentablemente, hasta ahora no hay una forma de ejecutar algo durante la instalación o actualización de plugins/temas. Afortunadamente, hay una solución: Enganchar una función personalizada a una opción personalizada (sí, es un poco rudimentario, pero funciona).

function prefix_upgrade_plugin() 
{
    $v = 'plugin_db_version';
    $update_option = null;
    // Actualizar a versión 2
    if ( 2 !== get_option( $v ) ) 
    {
        if ( 2 < get_option( $v ) )
        {
            // La función de callback debe devolver true si tuvo éxito
            $update_option = custom_upgrade_cb_fn_v3();

            // Solo actualizar la opción si fue exitoso
            if ( $update_option )
                update_option( $v, 2 );
        }
    }

    // Actualizar a versión 3, se ejecuta justo después de actualizar a versión 2
    if ( 3 !== get_option( $v ) ) 
    {
        // Volver a ejecutar desde el principio si la actualización anterior falló
        if ( 2 < get_option( $v ) )
            return prefix_upgrade_plugin();

        if ( 3 < get_option( $v ) )
        {
            // La función de callback debe devolver true si tuvo éxito
            $update_option = custom_upgrade_cb_fn_v3();

            // Solo actualizar la opción si fue exitoso
            if ( $update_option )
                update_option( $v, 3 );
        }
    }

    // Devolver el resultado de la función de actualización para probar éxito/fallo/error
    if ( $update_option )
        return $update_option;

return false;
}
add_action('admin_init', 'prefix_upgrade_plugin' );

Fuente

Esta función de actualización no es el mejor ejemplo en cuanto a escritura, pero como dije: es un ejemplo y la técnica funciona bien. La mejoraré en una actualización posterior.

15 ago 2011 21:18:05
Comentarios

Esto es genial, PERO lo que realmente quiero saber son las cosas que debería incluir en mi método de desactivación... por ejemplo, ¿debería eliminar mis tablas en la base de datos o dejarlas por si el usuario cambia de opinión y reactiva el plugin?

redconservatory redconservatory
16 ago 2011 00:25:01

Sobre el "PERO": Mencioné que hay 3 métodos. Uno para activación, uno para desactivación temporal y otro para desinstalación. En mi opinión, "uninstall" significa "Elimíname y todo lo que hice", mientras que "deactivate" es un estado temporal y podría revertirse. Pero: Mira la actualización. Añadí comentarios sobre tu pregunta + la amplié con algunas recomendaciones de desarrollo.

kaiser kaiser
16 ago 2011 00:55:23

Ah, ahora lo entiendo. Solo una pregunta, ¿cuándo se llama a uninstalled? ¿Cuando se eliminan los archivos?

redconservatory redconservatory
17 ago 2011 01:40:41

Hmm. Buena pregunta. plugin.php es el archivo que contiene register_uninstall_hook y se carga con los archivos iniciales en wp-settings.php (que es el archivo principal que siempre debes revisar). Actualicé la pregunta con los docblocks del núcleo.

kaiser kaiser
17 ago 2011 11:14:20

También agregué la verificación de la constante WP_UNINSTALL_PLUGIN, que básicamente es el nombre del archivo, para que puedas colocar tus funciones de desinstalación en un archivo separado y evitar la ejecución de otras funciones que están en los archivos de tus plugins.

kaiser kaiser
17 ago 2011 11:20:25

Para lectores posteriores: Eliminé los docBlocks ya que eran de WP 3.2.1. Aún puedes revisar las ediciones de esta pregunta para ver las funciones del núcleo.

kaiser kaiser
7 ene 2012 19:55:01

Aún así, no entiendo cuándo ocurre la "desinstalación". ¿Al eliminar el plugin? ¿Al desactivarlo?

onetrickpony onetrickpony
9 ene 2012 21:09:05

@OneTrickPony Se llamará cuando el usuario haga clic en el enlace de desinstalación que solicita que el plugin se desinstale. Actualizo la respuesta.

kaiser kaiser
9 ene 2012 21:48:51

No he visto ese enlace. Supongo que debería aparecer junto a (des)activar/editar/eliminar ¿?

onetrickpony onetrickpony
10 ene 2012 23:36:26

@OneTrickPony Ok, ya no puedo actualizar más porque me topé con la wiki de la comunidad, pero la Respuesta a "qué ocurre al desinstalar" va aquí: La función register_uninstall_hook() añade un archivo de desinstalación y una función callback a la opción 'uninstall_plugins' en la tabla de opciones de la base de datos. Esto luego se llama mediante la función uninstall_plugin($name), que es invocada por la función delete_plugin($array_of_plugins). La última función se dispara dependiendo de la acción configurada en /wp-admin/plugin.php, cuando (en el switch) el caso es 'delete-selected'. Esto significa que $_REQUEST['verify-delete'] está establecido. ¿Queda claro hasta aquí? :)

kaiser kaiser
10 ene 2012 23:51:55

Para resumir: En la interfaz de administración /wp-admin/plugin.php » isset( $_REQUEST['verify-delete'] ) » delete_plugin($array_of_plugins) » uninstall_plugin($name) » update_option('uninstall_plugins',$array) » define('WP_UNINSTALL_PLUGIN') Y include WP_PLUGIN_DIR.'/'.dirname($file).'/uninstall.php'

kaiser kaiser
10 ene 2012 23:55:41

WP_UNINSTALL_PLUGIN solo se define si se encuentra un archivo uninstall.php en la carpeta del plugin. Si estás usando la técnica del hook de desinstalación y no la técnica del uninstall.php, la constante no será definida. Esto es evidente al revisar el código fuente. Cuando se escribió esta respuesta, esta era la versión actual: http://core.trac.wordpress.org/browser/tags/3.2.1/wp-admin/includes/plugin.php#L804

bcworkz bcworkz
18 nov 2013 00:51:28

Tienes razón. De todos modos voy a revisar esa respuesta en una semana y subir un repositorio en GitHub que sea más fácil de mantener.

kaiser kaiser
18 nov 2013 01:30:59

Edición: Lo he inspeccionado y he publicado un comentario en una solicitud de extracción que hice. Habrá actualizaciones.

kaiser kaiser
18 nov 2013 01:54:45

Estoy haciendo linting de un código basado en el enfoque con clases y los estándares de código VIP me están dando problemas con esas variables globales $_REQUEST, diciendo que no están sanitizadas. ¿Alguna idea de cómo solucionarlo?

aendra aendra
14 ago 2014 03:58:26

@aendrew Solo se usan en el lado de check_admin_referer(). No necesitan ser sanitizados porque el núcleo no lo hace por sí mismo y de todos modos lo compararía con valores no sanitizados de $_REQUEST. Pero si empiezan a quejarse como niñas pequeñas por eso, simplemente usa filter_var() o esc_attr() en ellos.

kaiser kaiser
14 ago 2014 04:09:14

@kaiser Eso es lo que imaginaba. Tu respuesta incluso está referenciada en la documentación oficial de WP, así que supuse que probablemente no era un problema. ¡Gracias por responder!

aendra aendra
17 ago 2014 05:26:48

@kaiser Aunque, solo para tu información — phpcs sigue generando el mismo error incluso si envuelves $_REQUEST en filter_var() o esc_attr(). Parece más un problema con phpcs que con otra cosa...

aendra aendra
17 ago 2014 05:35:49

No deberías verificar WP_UNINSTALL_PLUGIN en la función de callback si usas wp_register_uninstall_hook, solo si usas uninstall.php

paul paul
21 ene 2015 21:13:41

No estoy 100% seguro de que la opción (c) funcione a partir de la versión 4.2.4 (o quizás antes). En mis pruebas el método on_activation() nunca se llama. En su lugar, hay una advertencia de PHP en los registros: call_user_func_array() espera que el parámetro 1 sea un callback válido, clase 'WCM_Setup_Demo_File_Inc' no encontrada en /ruta/a/wp-includes/plugin.php en la línea 496

Esto parece tener sentido porque el archivo incluido no se incluye hasta que el plugin está realmente activo (ya que el __construct() es lo que incluye el archivo y eso solo se hace en plugins_loaded

RichardTape RichardTape
6 ago 2015 21:34:22

@kaiser En esta respuesta sugieres verificar __FILE__ != WP_UNINSTALL_PLUGIN, sin embargo, realmente solo es necesario verificar si la constante está definida. No necesitas verificar el valor de la constante, y de hecho no siempre será correcto.

J.D. J.D.
29 abr 2016 00:18:58

@J.D. No estaba al tanto de ese error en la desinstalación masiva. La razón por la que lo reviso es simple: asegurarme de que el plugin correcto esté llamando esto. Después de 5 años, no estoy del todo seguro de mis intenciones en ese momento. Sobre tu enlace de Trac: quizás quieras reconsiderar el problema que estás enfrentando allí: la desinstalación masiva no está funcionando. Degradar la constante podría no ser la mejor solución. En mi opinión, aún debería haber una forma de determinar qué plugin se está desinstalando.

kaiser kaiser
29 abr 2016 05:28:54

El código de desinstalación tiene 2 errores. 1. Como menciona @paul, WP_UNINSTALL_PLUGIN no está definido. 2. Y check_admin_referer( 'bulk-plugins' ) falla, impidiendo la desinstalación.

"Más vale prevenir que lamentar" suena bien, pero los cambios en el núcleo de WP pueden causar errores.

Usar register_uninstall_hook() en lugar de uninstall.php significa que debes tener cuidado, incluso en cualquier __construct(). Si todo es estático, podrías estar bien.

En los comentarios se ha mencionado https://tommcfarlin.com/wordpress-plugin-boilerplate/ Está más actualizado y no tiene current_user_can, check_admin_referer, ni register_uninstall_hook.

kitchin kitchin
21 mar 2018 15:51:05
Mostrar los 18 comentarios restantes
6
19

Para probar el sistema actual en busca de características requeridas como la versión de PHP o extensiones instaladas, puedes usar algo como esto:

<?php  # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 Verificar Requisitos del Plugin
 * Description: Prueba para versión de PHP y extensiones instaladas
 * Plugin URI:
 * Version:     2013.03.31
 * Author:      Fuxia Scholz
 * Licence:     MIT
 * License URI: http://opensource.org/licenses/MIT
 */

/*
 * No iniciar en cada página, la página de plugins es suficiente.
 */
if ( ! empty ( $GLOBALS['pagenow'] ) && 'plugins.php' === $GLOBALS['pagenow'] )
    add_action( 'admin_notices', 't5_check_admin_notices', 0 );

/**
 * Prueba el sistema actual para las características que el plugin necesita.
 *
 * @return array Errores o array vacío
 */
function t5_check_plugin_requirements()
{
    $php_min_version = '5.4';
    // ver http://www.php.net/manual/en/extensions.alphabetical.php
    $extensions = array (
        'iconv',
        'mbstring',
        'id3'
    );
    $errors = array ();

    $php_current_version = phpversion();

    if ( version_compare( $php_min_version, $php_current_version, '>' ) )
        $errors[] = "Tu servidor está ejecutando PHP versión $php_current_version pero
            este plugin requiere al menos PHP $php_min_version. Por favor realiza una actualización.";

    foreach ( $extensions as $extension )
        if ( ! extension_loaded( $extension ) )
            $errors[] = "Por favor instala la extensión $extension para ejecutar este plugin.";

    return $errors;

}

/**
 * Llama a t5_check_plugin_requirements() y desactiva este plugin si hay errores.
 *
 * @wp-hook admin_notices
 * @return  void
 */
function t5_check_admin_notices()
{
    $errors = t5_check_plugin_requirements();

    if ( empty ( $errors ) )
        return;

    // Suprimir el aviso "Plugin activado".
    unset( $_GET['activate'] );

    // nombre de este plugin
    $name = get_file_data( __FILE__, array ( 'Plugin Name' ), 'plugin' );

    printf(
        '<div class="error"><p>%1$s</p>
        <p><i>%2$s</i> ha sido desactivado.</p></div>',
        join( '</p><p>', $errors ),
        $name[0]
    );
    deactivate_plugins( plugin_basename( __FILE__ ) );
}

Prueba con una verificación para PHP 5.5:

Descripción de la imagen

9 abr 2013 21:45:04
Comentarios

Un poco confundido, básicamente aquí no hay una llamada a register_activation_hook -- ¿por qué no usarlo? También, ¿esto se ejecutará antes o después de register_activation_hook y register_activation_hook se ejecutará incluso si lo anterior no pasa?

orionrush orionrush
31 jul 2013 15:52:24

Se ejecuta después del hook de activación solo en la página del plugin.

fuxia fuxia
31 jul 2013 15:54:36

Entiendo - pero si el plugin se activa fuera de la página del plugin (digamos como parte de una dependencia del tema) entonces tus verificaciones se saltarán, ¿no? Así que intenté mover add_action( 'admin_notices', 't5_check_admin_notices', 0 ); a un hook de activación y el plugin se activa sin realizar las verificaciones...

orionrush orionrush
31 jul 2013 16:30:41

@kaiser ha explicado cómo funciona el gancho de activación, yo quería mostrar una alternativa. Si el plugin no se activa desde la página de plugins, podría ocurrir un error fatal, sí. Este enfoque no puede funcionar en un gancho de activación sin una reescritura seria, porque ese gancho se dispara después de admin_notices.

fuxia fuxia
31 jul 2013 16:46:13

De hecho, acabo de encontrarme con la forma fácil: http://stackoverflow.com/a/13927297/362445

orionrush orionrush
31 jul 2013 16:50:02

Creo que esto debería funcionar: `register_activation_hook( FILE, function() { add_option('Activated_Plugin','Plugin-Slug'); });

add_action('admin_init', 'load_plugin'); function load_plugin() { if ( ! current_user_can( 'activate_plugins' ) ) return; if(is_admin()&&get_option('Activated_Plugin')=='Plugin-Slug') { delete_option('Activated_Plugin'); add_action( 'admin_notices', 't5_check_admin_notices', 0 ); } }`

orionrush orionrush
31 jul 2013 16:50:33
Mostrar los 1 comentarios restantes