Desinstalar, activar, desactivar un plugin: características típicas & cómo

Estoy haciendo un plugin para wordpress. ¿Qué es típica que debería incluir en la función de desinstalación? ¿Por ejemplo, debería borrar cualquier tabla que he creado en la función de instalación? ¿puedo limpiar mis opción entradas? ¿Algo más?.


Solución 1

Hay tres diversos ganchos. Ellas provocan en los siguientes casos:

Desinstalar la activación desactivación

Cómo activar las funciones con seguridad durante los escenarios

A continuación muestra las formas correctas de gancho con seguridad funciones callback que salir disparadas durante las acciones mencionadas. Como puedes usar este código en un plugin que utiliza funciones de llanas, una clase o una clase externa, te voy a mostrar tres diferentes demo plugins que puede inspeccionar y luego más adelante a aplicar el código en su propio plugin(s).

Nota importante por adelantado!

Este tema es extremadamente difícil y muy detallada y tiene una docena + borde casos, esta respuesta nunca será perfecta.

Tendrás que seguir mejorándola con el tiempo, mira en una base regular.

(1) Activar/desactivar o desinstalar plugins.

Las devoluciones de llamada configuración de plugin se desencadenan por la base y no tiene influencia sobre cómo núcleo hace esto. Aquí están algunas cosas a tener en cuenta: nunca, nunca
echo/print
Anything(!) durante las devoluciones de llamada configuración.

Esto llevará a
headers already sent
mensaje y núcleo recomendará para desactivar y eliminar su plugin... no preguntes: lo sé...

No verá ninguna salida visual. Pero he añadido
exit()
declaraciones de todas las devoluciones de llamada diferentes así puede obtener algunas ideas sobre lo que está pasando.

Sólo activarlos para ver cosas trabajan. Es muy importante que compruebe si
__FILE__ != WP_PLUGIN_INSTALL
y (si no: abortar!) para ver si realmente uno es desinstalar el plugin.

Yo recomendaría simplemente activar
on_deactivation()
las devoluciones de llamada durante el desarrollo, así te ahorras el tiempo que necesitas para conseguir todo de nuevo. Al menos esto es lo que hago.

También hago algunas cosas de seguridad. Algunos se hace por la base tan bien, pero bueno! Más vale prevenir que lamentar.

Primero yo no permitir acceso a los archivos directos cuando no está cargado el núcleo:
defined( 'ABSPATH' ) OR exit;
Luego reviso si el usuario actual puede hacer esta tarea. Como última tarea, reviso el referente.

Nota: Puede haber resultados inesperados con un
wp_die()
pantalla pidiendo los permisos adecuados (y si quieres volver a intentarlo... Sí, claro), cuando tienes un error.

Esto sucede como núcleo redirige, establece la corriente
$GLOBALS['wp_list_table']->current_action();
Para
error_scrape
y a continuación, comprueba el referente para
check_admin_referer('plugin-activation-error_' . $plugin);
, donde
$plugin
es
$_REQUEST['plugin']
.

Casualmente la redirección a la mitad la carga de la página y esta barra de desplazamiento por cable y la penetración de pantalla dado el cuadro de mensaje/aviso amarillo admin. Si esto sucede: mantener la calma y sólo busca el error con algunos
exit()
y depuración paso a paso.

(A) llano funciones plugin

Recuerde que esto no puede funcionar si engancha a las devoluciones de llamada antes de la definición de función.

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activate/Deactivate/Uninstall - Functions
 * Description: Example Plugin to show activation/deactivation/uninstall callbacks for plain functions.
 * 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}" );

    # Uncomment the following line to see the function in action
    # 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}" );

    # Uncomment the following line to see the function in action
    # exit( var_dump( $_GET ) );
}

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

    // Important: Check if the file is the one
    // that was registered during the uninstall hook.
    if ( __FILE__ != WP_UNINSTALL_PLUGIN )
        return;

    # Uncomment the following line to see the function in action
    # 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) una arquitectura de clase base/programación orientada a objetos

Este es el ejemplo más común de hoy en día plugins.
<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activate/Deactivate/Uninstall - CLASS
 * Description: Example Plugin to show activation/deactivation/uninstall callbacks for classes/objects.
 * 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}" );

        # Uncomment the following line to see the function in action
        # 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}" );

        # Uncomment the following line to see the function in action
        # exit( var_dump( $_GET ) );
    }

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

        // Important: Check if the file is the one
        // that was registered during the uninstall hook.
        if ( __FILE__ != WP_UNINSTALL_PLUGIN )
            return;

        # Uncomment the following line to see the function in action
        # exit( var_dump( $_GET ) );
    }

    public function __construct()
    {
        # INIT the plugin: Hook your callbacks
    }
}

Arquitectura de base/programación orientada a objetos (C) una clase con un objeto de configuración externa

Este escenario asume que tienes un archivo plugin principal y un segundo llamado
setup.php
en un subdirectorio del plugin llamado
inc
:
~/wp-content/plugins/your_plugin/inc/setup.php
.

Esto funciona así cuando la carpeta plugin está fuera por defecto estructura de carpeta WP, así como cuando cambia el contenido dir o en casos donde el archivo de configuración se llama diferentes. Sólo el
inc
carpeta tiene que tener el mismo nombre y ubicación relativa desde el directorio raíz de plugins.

Nota: Usted puede simplemente tomar los tres
register_*_hook()*
las funciones y las clases y soltarlos en su plugin. El archivo principal plugin:
<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) Activate/Deactivate/Uninstall - FILE/CLASS
 * Description: Example Plugin
 * 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 fichero 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}" );

        # Uncomment the following line to see the function in action
        # 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}" );

        # Uncomment the following line to see the function in action
        # exit( var_dump( $_GET ) );
    }

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

        // Important: Check if the file is the one
        // that was registered during the uninstall hook.
        if ( __FILE__ != WP_UNINSTALL_PLUGIN )
            return;

        # Uncomment the following line to see the function in action
        # exit( var_dump( $_GET ) );
    }
}

(2) Las actualizaciones del Plugin

Si escribes un plugin que tiene su propia tabla DB u opciones, puede haber situaciones donde tienes que cambiar o actualizar las cosas.

Lamentablemente hasta ahora no hay ninguna posibilidad de ejecutar algo en instalar plugin/tema o de actualización. Alegre hay una obra alrededor: una función personalizada para una opción personalizada del gancho (Sí, es lamentable pero funciona).

function prefix_upgrade_plugin() 
{
    $v = 'plugin_db_version';
    $update_option = null;
    // Upgrade to version 2
    if ( 2 !== get_option( $v ) ) 
    {
        if ( 2 < get_option( $v ) )
        {
            // Callback function must return true on success
            $update_option = custom_upgrade_cb_fn_v3();

            // Only update option if it was an success
            if ( $update_option )
                update_option( $v, 2 );
        }
    }

    // Upgrade to version 3, runs just after upgrade to version 2
    if ( 3 !== get_option( $v ) ) 
    {
        // re-run from beginning if previous update failed
        if ( 2 < get_option( $v ) )
            return prefix_upgrade_plugin();

        if ( 3 < get_option( $v ) )
        {
            // Callback function must return true on success
            $update_option = custom_upgrade_cb_fn_v3();

            // Only update option if it was an success
            if ( $update_option )
                update_option( $v, 3 );
        }
    }

    // Return the result from the update cb fn, so we can test for success/fail/error
    if ( $update_option )
        return $update_option;

return false;
}
add_action('admin_init', 'prefix_upgrade_plugin' );
Source Esta función de actualización es un ejemplo no tan bueno/bien escrito, sino que como dijo: es un ejemplo y la técnica funciona bien. Eso mejorará con una actualización más adelante..

Solución 2

Para poner a prueba el actual sistema para featurs requiere como versión de PHP o instalar extensiones puede usar algo así:
<?php  # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 Check Plugin Requirements
 * Description: Test for PHP version and installed extensions
 * Plugin URI:
 * Version:     2013.03.31
 * Author:      Thomas Scholz
 * Author URI:  http://toscho.de
 * Licence:     MIT
 * License URI: http://opensource.org/licenses/MIT
 */

/*
 * Don't start on every page, the plugin page is enough.
 */
if ( ! empty ( $GLOBALS['pagenow'] ) && 'plugins.php' === $GLOBALS['pagenow'] )
    add_action( 'admin_notices', 't5_check_admin_notices', 0 );

/**
 * Test current system for the features the plugin needs.
 *
 * @return array Errors or empty array
 */
function t5_check_plugin_requirements()
{
    $php_min_version = '5.4';
    // see 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[] = "Your server is running PHP version $php_current_version but
            this plugin requires at least PHP $php_min_version. Please run an upgrade.";

    foreach ( $extensions as $extension )
        if ( ! extension_loaded( $extension ) )
            $errors[] = "Please install the extension $extension to run this plugin.";

    return $errors;

}

/**
 * Call t5_check_plugin_requirements() and deactivate this plugin if there are error.
 *
 * @wp-hook admin_notices
 * @return  void
 */
function t5_check_admin_notices()
{
    $errors = t5_check_plugin_requirements();

    if ( empty ( $errors ) )
        return;

    // Suppress "Plugin activated" notice.
    unset( $_GET['activate'] );

    // this plugin's name
    $name = get_file_data( __FILE__, array ( 'Plugin Name' ), 'plugin' );

    printf(
        '<div class="error"><p>%1$s</p>
        <p><i>%2$s</i> has been deactivated.</p></div>',
        join( '</p><p>', $errors ),
        $name[0]
    );
    deactivate_plugins( plugin_basename( __FILE__ ) );
}
Prueba con un cheque para PHP 5.5:.




Problemas relacionados

Desactivar archivo admin\/plugin install.php

Error 404 en activar \/ desactivar Plugin

¿Mejores prácticas: Eliminar los datos de desactivación o desinstalar?

Cómo restablecer los plugins sin desactivar el plugin

Cómo llamar a uninstall.php

¿Cómo puedo desactivar todas las casillas de selección de páginas

¿Puede desactivar un plugin de sí mismo?

Edita plugin no teniendo efecto

No se puede desactivar mensaje Offline sitio

¿Por qué mi Plugin mantiene desactivar automáticamente?

Activar Autoguardar o desactivar el cuadro de diálogo sin guardar los cambios

activar un plugin para WordPress mediante una consulta SQL

Source: Stack Exchange Inc; License: cc by-sa 3.0 Contacto / Contact