¿Por qué enable_plugin no funciona en register_activation_hook?


10

Estoy tratando de activar el segundo complemento automáticamente mientras activo el primer complemento.

register_activation_hook(__FILE__, 'example_activation' );
function example_activation() {
        include_once(ABSPATH .'/wp-admin/includes/plugin.php');
        activate_plugin('hello.php');
}

No funciona dentro de register_activation_hook .. Funciona si lo uso directamente como:

include_once(ABSPATH .'/wp-admin/includes/plugin.php');
activate_plugin('hello.php');

¿Cómo puedo arreglarlo? Gracias por la ayuda

Solución:

Estoy usando esto para mí ahora:

// When this plugin activate, activate another plugin too.
register_activation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_inactive($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            /* for some reason, 
            activate_plugin($dependent); 
               is not working */
            activate_plugin('hello.php');
        });
    }
}); 

// When this plugin deactivate, deactivate another plugin too.
register_deactivation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_active($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            deactivate_plugins('hello.php');
        });
    }
}); 

Leí mal tu publicación originalmente. Tengo que decir que está formateado correctamente. ¿Esta función es la principal de tu complemento?
Chris

Sólo un segundo. Necesito editar mi publicación.
Chris

sí, está en el primer complemento que intenta activar el segundo complemento ... el segundo complemento es hello.php como ejemplo
Ünsal Korkmaz

Respuestas:


8

Para obtener una explicación completa de lo que está sucediendo, vea esta publicación (esto es para desactivar los complementos, pero el problema es el mismo).

Una breve explicación: los complementos se activan esencialmente agregándolos a la matriz de pug-ins activos almacenados en la base de datos. Cuando activa el primer complemento, WordPress recupera la matriz de todos los complementos actualmente activos, le agrega el complemento (pero aún no actualiza la base de datos) y luego ejecuta su devolución de llamada de instalación.

Esta devolución de llamada de instalación ejecuta su código.

Después de eso, WordPress actualiza la base de datos con la matriz anterior, que contiene el primer pero no el segundo complemento. Por lo tanto, su segundo complemento parece no estar activado.

Solución: ha mencionado en el enlace anterior que la solución es algo como esto (no probado):

//This goes inside Plugin A.
//When A is activated. activate B.
register_activation_hook(__FILE__,'my_plugin_A_activate'); 
function my_plugin_A_activate(){
    $dependent = 'B/B.php';
    if( is_plugin_inactive($dependent) ){
         add_action('update_option_active_plugins', 'my_activate_dependent_B');
    }
}

function my_activate_dependent_B(){
    $dependent = 'B/B.php';
    activate_plugin($dependent);
}

Si tiene tiempo, edito mi pregunta para escribir lo que estoy usando ahora. Puede ver active_plugin ($ dependiente); no funciona al activar el complemento. ¿Alguna idea de como arreglarlo?
Ünsal Korkmaz

Copiar su código en un complemento de prueba (y crear otro hello.phpcomplemento de prueba de prueba, funciona bien para mí). Recuerde que si los complementos existen en un subdirectorio, deberá proporcionar la carpeta: por ejemplo hello/hello.php.
Stephen Harris

mi código funcionará normales .. problema comienza cuando se cambia activate_plugin('hello.php');de acuerdo conactivate_plugin($dependent);
Ünsal Korkmaz

Esto se debe a que la variable dada a su devolución de llamada no es hello.phpsino la matriz de complementos actualmente activos. No puede pasar sus propias variables a devoluciones de llamada de esa manera. A menos que use variables globales / de clase, deberá usarlas activate_plugin('hello.php');. Pero eso no debería ser un problema ...?
Stephen Harris

bueno, no me gusta escribir las mismas variables en muchos lugares tbh. Pero no es gran cosa. muchas gracias
Ünsal Korkmaz

2

Aquí hay alguien que explica por qué no estaba funcionando para él y cómo tuvo que copiar el método enable_plugin y crear uno propio sin el problema: /programming/1415958/how-to- active-wordpress-plugins-internamente

Aquí está la fuente original del código enable_plugin, que puede usar para crear su propia función y ver dónde no funciona: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Aquí hay una posible solución, que contiene un método alternativo de activación de complementos que probablemente alguien más haya extraído de ese código fuente: ¿Cómo activar complementos mediante código?


esa solución todavía no funciona en register_activation_hook
Ünsal Korkmaz

Afortunadamente, ahora que tiene su propio método para activar un complemento, debería poder depurarlo y descubrir dónde está fallando, ¿verdad? :) ¿Cambiaste tu register_activation_hook para utilizar tu método personalizado enable_plugin en lugar del predeterminado? Si es así, agregue algunas declaraciones trigger_error y descubra dónde está fallando. Por ejemplo, un buen lugar para comenzar sería averiguar qué regresa su método cuando falla.
mltsy

Hice mi mejor esfuerzo para depurar pero no pude encontrar la razón. Tal vez la opción active_plugins se actualice después de ejecutar register_activation_hook.
Ünsal Korkmaz

Lo siento, acabo de arreglar el orden de los dos enlaces que había intercambiado (los dos últimos). ¿Está utilizando el código del enlace titulado "Cómo activar el complemento a través del código?" Otra sugerencia útil para proporcionar sería el valor de retorno del activate_pluginmétodo predeterminado . Puede usar trigger_errorpara encontrar el valor de retorno y publicarlo aquí.
mltsy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.