¿Cómo activar complementos mediante código?

22

Si es posible, ¿cómo se pueden activar los complementos instalados (es decir, los archivos se han colocado en el directorio wp-content / plugins) desde otros complementos?

rsman
fuente

Respuestas:

30

Así es como lo hice en algunas aplicaciones web:

function run_activate_plugin( $plugin ) {
    $current = get_option( 'active_plugins' );
    $plugin = plugin_basename( trim( $plugin ) );

    if ( !in_array( $plugin, $current ) ) {
        $current[] = $plugin;
        sort( $current );
        do_action( 'activate_plugin', trim( $plugin ) );
        update_option( 'active_plugins', $current );
        do_action( 'activate_' . trim( $plugin ) );
        do_action( 'activated_plugin', trim( $plugin) );
    }

    return null;
}
run_activate_plugin( 'akismet/akismet.php' );
sorich87
fuente
1
Como Rarst escribió, esto no es muy "seguro". Debe asegurarse de que los complementos que active de esta manera sean seguros / no rompan su sitio.
sorich87
10
No es seguro en absoluto, incluso, pero diablos, si los está activando mediante programación, se supone que debe saber lo que está haciendo. ;-)
Denis de Bernardy
Seguridad aparte: quiero decir, esto no es parte de la pregunta, ¿verdad? - Me gusta el enfoque de sorich porque llama a los filtros de activación estándar. Entonces, los complementos obtienen un cambio para ejecutar sus rutinas de configuración si tienen algunos.
Hakre
3
Esto, al menos más recientemente, está reinventando la rueda. He usado el incorporado activate_plugin(), y parece funcionar igual.
Jake
1
@SagiveSEO Es perfectamente seguro, es similar a cómo lo hace WP, excepto que requiere la entrada / aprobación del usuario y el formulario nonces y las comprobaciones para esos nonces, solo introduce las comprobaciones necesarias para iniciar esa función en cualquier lugar, para que no se pueda acceder desde afuera (desde web, etc.), y no se puede llamar aleatoriamente de ninguna manera.
unity100
13

El proceso de activación del complemento está codificado para funcionar con la interfaz de administración de WP. Realiza algunas comprobaciones para evitar habilitar complementos con errores (cargarlos al inicio puede interrumpir WP).

Se maneja por la activate_plugin()función ( fuente ) que está documentada como inutilizable en otros lugares.

Entonces, si desea activar el complemento por código, el objetivo en sí es relativamente fácil: cambiar la active_pluginsopción para incluir ese complemento. Pero tendrá que volver a crear ganchos de activación relacionados desde cero y se arriesgará a romper el sitio al activarlo sin el paso de sandbox.

Rarst
fuente
7

Los complementos se almacenan en una matriz en la opción 'active_plugins'. La matriz contiene la ruta del archivo a cada complemento que está activo.

Para activar un complemento, debe determinar cuál será su ruta y luego pasar esa ruta a activate_plugin($plugin_path).

Sin embargo, esto es más fácil decirlo que hacerlo, y (al menos en 2.9) el código central no lo hace fácil.

Antes de que puedas activar_plugin () debes incluir el archivo plugin.php de wp-admin / includes /. También debe verificar para asegurarse de que su complemento ya no esté activo. El resultado se parece a esto (YMMV):

// Define the new plugin you want to activate
$plugin_path = '/path/to/your/new/plugin.php';
// Get already-active plugins   
$active_plugins = get_option('active_plugins');
// Make sure your plugin isn't active
if (isset($active_plugins[$plugin_path]))
    return;

// Include the plugin.php file so you have access to the activate_plugin() function
require_once(ABSPATH .'/wp-admin/includes/plugin.php');
// Activate your plugin
activate_plugin($plugin_path);

Utilizo esto en producción en WP 2.9 y no he tenido problemas importantes, pero en mis pruebas tuvo resultados muy inesperados con WPMU, así que tenga cuidado al usar esto en las instalaciones de red.

jerclarke
fuente
Pasó mucho tiempo, pero si recuerdas, ¿cuál fue el resultado inesperado de esto?
Ünsal Korkmaz
No me acuerdo por completo. Creo que simplemente no funcionó e hice las cosas a mano porque no tenía muchos sitios de MS.
jerclarke
¿Cómo ejecuto esto? si solo lo ejecuto directamente, get_option no está definido ...
Janus Troelsen
Agregue esto en functions.php y debería funcionar, aunque aun así siempre debe poner las cosas en funciones y conectarlas a "init" o "wp".
jerclarke
3

Wordpress proporciona una función para activar complementos, de acuerdo con WP Codex

function plugin_activation( $plugin ) {
    if( ! function_exists('activate_plugin') ) {
        require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }

    if( ! is_plugin_active( $plugin ) ) {
        activate_plugin( $plugin );
    }
}

plugin_activation('akismet/akismet.php');
Mowshon
fuente
Ethan, ¿qué hay de malo en mi respuesta?
Mowshon
Si bien publicar solo el código está bien para una respuesta, puede ser difícil de interpretar para cualquier programador nuevo que lea su respuesta. De esta manera, OP puede comprender mejor cómo funciona su código.
Ethan Jinks O'Sullivan
0

Simplemente puede llamar a la función predeterminada de WordPress.

activate_plugin('akismet/akismet.php');

Por favor, consulte el siguiente enlace para obtener más detalles.

activar el complemento

Sohel Khan
fuente