Jak aktywować wtyczki za pomocą kodu?

22

Jeśli to możliwe, w jaki sposób można aktywować zainstalowane wtyczki (co oznacza, że ​​pliki zostały umieszczone w katalogu wp-content / plugins) z innych wtyczek?

rsman
źródło

Odpowiedzi:

30

Tak zrobiłem w niektórych aplikacjach internetowych:

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
źródło
1
Jak napisał Rarst, nie jest to zbyt „bezpieczne”. Należy upewnić się, że wtyczki aktywowane w ten sposób są bezpieczne / nie spowodują uszkodzenia witryny.
sorich87
10
W ogóle nie jest to bezpieczne, ale do cholery, jeśli aktywujesz je programowo, powinieneś wiedzieć, co robisz. ;-)
Denis de Bernardy
Bezpieczeństwo na bok - mam na myśli, że to nie jest część pytania, prawda? - Podoba mi się podejście Soricha, ponieważ wywołuje standardowe filtry aktywacyjne. Wtyczki otrzymują zmianę, aby uruchomić swoje procedury instalacyjne, jeśli takie mają.
hakre
3
To przynajmniej ostatnio wymyśla koło na nowo. Użyłem wbudowanego activate_plugin()i wydaje się, że działa tak samo.
Jake
1
@SagiveSEO Jest całkowicie bezpieczny - podobny do tego, w jaki sposób robi to WP, z wyjątkiem wymogu wprowadzania danych przez użytkownika / zatwierdzania i tworzenia jednostek i sprawdzeń dla tych jednostek - wystarczy wprowadzić niezbędne kontrole w celu zainicjowania tej funkcji w dowolnym miejscu - aby nie można było uzyskać do niej dostępu z zewnątrz (z internet itp.) i nie można go w żaden sposób losowo wywołać.
jedność 100
13

Proces aktywacji wtyczki jest zakodowany do pracy z interfejsem administratora WP. Przeprowadza pewne kontrole, aby zapobiec włączaniu wtyczek z błędami (ładowanie podczas uruchamiania może spowodować uszkodzenie WP).

Jest obsługiwany przez activate_plugin()funkcję ( źródło ), która jest udokumentowana jako bezużyteczna w innym miejscu.

Jeśli więc chcesz aktywować wtyczkę kodem, sam cel jest stosunkowo łatwy - zmienić active_pluginsopcję włączenia tej wtyczki. Ale będziesz musiał ponownie utworzyć powiązane haczyki aktywacyjne od zera i zaryzykować przełamanie witryny przez aktywację bez kroku piaskownicy.

Rarst
źródło
7

Wtyczki są przechowywane w tablicy w opcji „active_plugins”. Tablica zawiera ścieżkę pliku do każdej aktywnej wtyczki.

Aby aktywować wtyczkę, musisz określić jej ścieżkę, a następnie przekazać ją do activate_plugin($plugin_path).

Łatwiej to powiedzieć niż zrobić i (przynajmniej w wersji 2.9) kod podstawowy nie ułatwia.

Aby móc aktywować_plugin (), musisz dołączyć plik plugin.php z wp-admin / obejmuje /. Powinieneś również sprawdzić, czy wtyczka nie jest już aktywna. Wynik wygląda mniej więcej tak (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);

Używam tego podczas produkcji w WP 2.9 i nie miałem żadnych poważnych problemów, ale w moich testach przy WPMU przyniosło to bardzo nieoczekiwane rezultaty, więc uważaj na to przy instalacjach sieciowych.

jerclarke
źródło
minęło dużo czasu, ale jeśli pamiętasz, jaki był to nieoczekiwany wynik?
Ünsal Korkmaz,
Zupełnie nie pamiętam. Myślę, że to po prostu nie działało i robiłem rzeczy ręcznie, ponieważ nie miałem zbyt wielu witryn MS.
jerclarke
jak to zrobić? jeśli wykonam to bezpośrednio, get_option nie zostanie zdefiniowane ...
Janus Troelsen,
Dodaj to w functions.php i powinno działać, ale nawet wtedy powinieneś zawsze wstawiać rzeczy do funkcji i podpinać je do „init” lub „wp”.
jerclarke
3

Wordpress zapewnia funkcję aktywacji wtyczek, zgodnie z 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
źródło
Ethan, co jest nie tak z moją odpowiedzią?
Mowshon
Chociaż opublikowanie samego kodu jest w porządku dla odpowiedzi, może być trudne do interpretacji dla nowych programistów, którzy czytają twoją odpowiedź. W ten sposób OP może lepiej zrozumieć, jak działa Twój kod.
Ethan Jinks O'Sullivan
0

Możesz po prostu wywołać domyślną funkcję WordPress.

activate_plugin('akismet/akismet.php');

Proszę sprawdzić poniższy link, aby uzyskać więcej szczegółów.

aktywuj wtyczkę

Sohel Khan
źródło