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.