el gancho de activación del complemento no funciona en wordpress

4 minutos de lectura

avatar de usuario
Reydel León

Estoy tratando de desarrollar mi primer complemento de WordPress y me quedé obsoleto en la primera etapa. Estoy tratando de configurar algunas opciones y tablas de bases de datos cuando el complemento está activado, pero no tuve suerte. No importa lo que haga, el complemento se activa, pero la base de datos no se toca y las opciones no se almacenan en la base de datos. Intenté hacer eco dentro del constructor, pero parece que nunca lo alcanza. Tengo la depuración activada en WP, pero no se informa ningún error. La función no está siendo enganchada. ¿Alguien puede detectar lo que está mal con mi código?

Gracias por cualquier ayuda de antemano.

class Myplugin {

    private static $instance;

    public static function get_instance() {
        if ( ! self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        register_activation_hook( __FILE__, array( &$this, 'plugin_activate' ) );
    }

    public function plugin_activate() {
        if ( version_compare( get_bloginfo( 'version' ), '3.8.2', ' < ' ) ) {
            deactivate_plugins( basename( __FILE__ ) );
        } else {
            $rlm_rsvplus_options = array(
                'db_version'          => '1.0',
                'event_name'          => '',
                'end_date'            => '',
            );

        update_option( 'rlm_myplugin_options', $rlm_myplugin_options );

        require_once( "includes/rlm_myplugin_db_setup.php" );//It never reaches this file.


    }
    }
}

$myplugin = Myplugin::get_instance();

avatar de usuario
DevWL

Volver a la documentación de WordPress.

<?php register_activation_hook( $file, $function ); ?>

Parámetros

$archivo

(cadena) (requerido) Ruta al archivo del complemento principal dentro del directorio wp-content/plugins. Una ruta completa funcionará. Predeterminado: Ninguno

$ función

(devolución de llamada) (obligatorio) La función que se ejecutará cuando se active el complemento. Cualquiera de los pseudotipos de devolución de llamada de PHP funcionará. Predeterminado: Ninguno

posible problema

Si llama a una función desde un archivo que está fuera del archivo del complemento principal, el enlace no funcionará porque no apunta al archivo correcto. EXPEDIENTE apuntará al archivo donde está escrito el código. Así que si te sucede incluir esta parte del código de otro lugar (otro archivo, no el archivo del complemento principal) no se supone que funcione a menos que señale el camino correcto.

Solución

Una solución podría ser declarar una constante en el archivo del complemento principal.

su_archivo_de_complemento_principal.php

define(PLUGIN_FILE_URL, __FILE__);

y luego utilícelo en su archivo incluido como tal.

incluye/algún_archivo.php

<?php register_activation_hook( PLUGIN_FILE_URL, ['your_class_name_here', 'your_class_method_name_here']); ?>

o si usa funciones en lugar de clases, entonces haga

<?php register_activation_hook( PLUGIN_FILE_URL, 'your_function_name_here'); ?>

  • impresionante respuesta @DevWL era mi problema

    – Daniel García Sánchez

    16 de mayo de 2018 a las 7:48

  • +1 para la constante PLUGIN_FILE_URL. Sin embargo, debe estar entre comillas simples. Además, el nombre de la constante debe ser YOUR_PLUGIN_NAME_PLUGIN_FILE_URL para evitar conflictos con otros complementos.

    – Amar Ilindra

    29 de julio a las 18:01

avatar de usuario
Toote

los register_activation_hook la llamada debe estar fuera de la clase misma.

Algo como:

class Myplugin {

    private static $instance;

    public static function get_instance() {
        if ( ! self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        // do other stuff here
    }

    public function plugin_activate() {
        if ( version_compare( get_bloginfo( 'version' ), '3.8.2', ' < ' ) ) {
            deactivate_plugins( basename( __FILE__ ) );
        } else {
            $rlm_rsvplus_options = array(
                'db_version'          => '1.0',
                'event_name'          => '',
                'end_date'            => '',
            );

        update_option( 'rlm_myplugin_options', $rlm_myplugin_options );

        require_once( "includes/rlm_myplugin_db_setup.php" );
    }
}

register_activation_hook( __FILE__, array( 'Myplugin', 'plugin_activate' ) );

Puedes leer más en el siguiente tutorial de Francis Yaconiello sobre Cómo escribir un complemento de WordPress.

  • alternativamente, puede dejar el registro de enlace dentro del constructor e instanciar su clase fuera del código de la clase

    – Toote

    9 de abril de 2014 a las 5:31

  • Ejemplifico mi clase afuera. He actualizado la pregunta para reflejar este hecho. Es realmente extraño, la ejecución entra en el constructor, pero simplemente ignora la parte del gancho.

    – Reydel León

    9 de abril de 2014 a las 5:38

  • Muchas gracias, el recurso vinculado me ahorró otras 12 horas depurando esta mierda de WordPress.

    – Salathiel Genèse

    17 sep 2018 a las 10:39

  • Nota importante: la función en la clase debe ser pública. Las funciones privadas o protegidas no se pueden activar con una acción o filtro.

    –Daan van den Bergh

    10 dic 2019 a las 20:12

Para que funcione registro_activación_gancho O register_deactivation_hook las funciones deben estar en el archivo de índice O necesitamos especificar la ruta completa al argumento del archivo.

Reemplace esto:

register_activation_hook( FILE, array( &$this, 'plugin_activate' ) );

Con:

register_activation_hook( FILE . 'plugin-main-file.php', array( &$this, 'plugin_activate' ) );

Aquí el punto es register_activation_hook ($ archivo, $ función);

Aquí $archivo medio Ruta al archivo del complemento principal

Referencia: https://codex.wordpress.org/Function_Reference/register_activation_hook

Gracias, Adi

¿Ha sido útil esta solución?