Dlaczego Activ_plugin nie działa w haczyku register_activation_hook


10

Próbuję aktywować drugą wtyczkę automatycznie podczas aktywacji pierwszej wtyczki.

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

Nie działa wewnątrz register_activation_hook .. Działa, jeśli używam go bezpośrednio jak:

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

Jak mogę to naprawić? Dzięki za pomoc

Rozwiązanie:

Używam tego teraz dla siebie:

// 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 odczytałem twój post. Muszę powiedzieć, że jest poprawnie sformatowany. Czy ta funkcja znajduje się w głównej części wtyczki?
Chris

Jeszcze chwila. Muszę edytować mój post.
Chris,

tak, jest w pierwszej wtyczce, która próbuje aktywować drugą wtyczkę .. druga wtyczka jest hello.php jako przykład
Ünsal Korkmaz

Odpowiedzi:


8

Pełne wyjaśnienie tego, co się dzieje, znajduje się w tym poście (służy do dezaktywacji wtyczek, ale problem jest taki sam).

Krótkie wyjaśnienie: wtyczki są zasadniczo aktywowane poprzez dodanie ich do tablicy aktywnych wtyczek przechowywanych w bazie danych. Po aktywacji pierwszej wtyczki WordPress pobiera tablicę wszystkich aktualnie aktywnych wtyczek, dodaje do niej wtyczkę (ale nie aktualizuje jeszcze bazy danych), a następnie uruchamia oddzwonienie instalacji.

To wywołanie zwrotne instalacji uruchamia kod.

Następnie WordPress aktualizuje bazę danych o powyższą tablicę, która zawiera pierwszą, ale nie drugą wtyczkę. W ten sposób druga wtyczka wydaje się nie być aktywowana.

Rozwiązanie: wspomniane w powyższym linku rozwiązanie jest mniej więcej takie (niesprawdzone):

//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);
}

Jeśli masz czas, edytuję moje pytanie, aby napisać, czego teraz używam. Możesz zobaczyć enable_plugin (zależny od $); nie działa podczas aktywacji wtyczki. Masz pomysł, jak to naprawić?
Ünsal Korkmaz

Skopiowanie kodu do testowej wtyczki (i utworzenie kolejnej hello.phptestowej wtyczki - działa dla mnie dobrze). Pamiętaj, że jeśli wtyczki istnieją w podkatalogu, musisz podać folder: np hello/hello.php.
Stephen Harris

mój kod będzie działał normalnie .. problem zaczyna się po zmianie activate_plugin('hello.php');linii naactivate_plugin($dependent);
Ünsal Korkmaz

Wynika to z faktu, że zmienna podana do wywołania zwrotnego to nie hello.phptablica aktualnie aktywnych wtyczek. Nie można przekazywać własnych zmiennych do takich wywołań zwrotnych. O ile nie użyjesz zmiennych klasowych / globalnych, będziesz musiał użyć activate_plugin('hello.php');. Ale to nie powinno być problemem ...?
Stephen Harris

cóż, nie lubię pisać tych samych zmiennych w wielu miejscach. ale to nie jest wielka sprawa. bardzo
dziękuję

2

Oto ktoś, kto wyjaśnia, dlaczego to nie działało dla niego i jak musiał skopiować metodę Activ_plugin i stworzyć własną bez problemu: /programming/1415958/how-to- aktywuj-wordpress-plugins-wewnętrznie

Oto oryginalne źródło kodu Activ_plugin, którego można użyć do stworzenia własnej funkcji i sprawdzenia, gdzie ona nie działa: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Oto możliwe rozwiązanie, zawierające alternatywną metodę aktywacji wtyczek, którą ktoś inny prawdopodobnie usunął z tego kodu źródłowego: Jak aktywować wtyczki za pomocą kodu?


to rozwiązanie nadal nie działa w register_activation_hook
Ünsal Korkmaz

Na szczęście, skoro masz już własną metodę aktywacji wtyczki, powinieneś być w stanie ją debugować i dowiedzieć się, gdzie zawodzi, prawda? :) Czy zmieniłeś haka register_activation_hook, aby użyć niestandardowej metody Activ_plugin zamiast domyślnej? Jeśli tak, dodaj kilka instrukcji trigger_error i dowiedz się, gdzie zawodzi. Na przykład dobrym miejscem do rozpoczęcia byłoby sprawdzenie, jaka metoda zwraca metodę, gdy zawiedzie.
mltsy

Starałem się jak najlepiej debugować, ale nie mogłem znaleźć powodu. Być może opcja active_plugins pobiera aktualizację po wykonaniu register_activation_hook.
Ünsal Korkmaz

Przepraszam, właśnie naprawiłem kolejność dwóch linków, które zamieniłem (dwa ostatnie). Czy używasz kodu z linku „Jak aktywować wtyczkę za pomocą kodu?” Inną przydatną wskazówką, jaką należy podać, jest wartość zwracana przez activate_pluginmetodę domyślną . Możesz użyć, trigger_erroraby znaleźć wartość zwracaną i opublikować ją tutaj.
mltsy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.