¿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');
        });
    }
}); 
Ünsal Korkmaz
fuente
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);
}
Stephen Harris
fuente
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?

mltsy
fuente
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