Почему activ_plugin не работает в register_activation_hook


10

Я пытаюсь активировать второй плагин автоматически при активации первого плагина.

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

Это не работает внутри register_activation_hook .. Это работает, если я использую его напрямую, как:

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

Как я могу это исправить? Спасибо за помощь

Решение:

Я использую это для себя сейчас:

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

Я неправильно прочитал ваш пост. Я должен сказать, это отформатировано правильно. Эта функция в основной части вашего плагина?
Крис

Секундочку Нужно отредактировать мой пост.
Крис

да, это первый плагин, который пытается активировать второй плагин. Второй плагин - hello.php в качестве примера
Unsal Korkmaz

Ответы:


8

Для полного объяснения того, что происходит, смотрите этот пост (это для деактивации плагинов, но проблема та же).

Краткое объяснение: Плагины по сути активируются путем добавления их в массив активных плагинов, хранящихся в базе данных. Когда вы активируете первый плагин, WordPress извлекает массив всех активных в настоящее время плагинов, добавляет к нему плагин (но еще не обновляет базу данных) и затем запускает обратный вызов установки.

Этот установочный обратный вызов запускает ваш код.

После этого WordPress обновляет базу данных указанным выше массивом, который содержит первый, но не второй плагин. Таким образом, ваш второй плагин не активирован.

Решение: уже упоминалось в приведенной выше ссылке, решение выглядит примерно так (не проверено):

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

Если у вас есть время, я редактирую свой вопрос, чтобы написать, что я использую сейчас. Вы можете увидеть activ_plugin ($ зависимый); не работает при активации плагина. Есть идеи, как это исправить?
Юнсал Коркмаз,

Скопируйте ваш код в тестовый плагин (и создайте другой hello.phpтестовый плагин - он прекрасно работает для меня). Помните, что если плагины существуют в подкаталоге, вам нужно указать папку: например hello/hello.php.
Стивен Харрис

мой код будет работать нормально .. проблема начинается, когда вы меняете activate_plugin('hello.php');строку сactivate_plugin($dependent);
Ünsal Korkmaz

Это потому, что переменная, переданная вашему обратному вызову, не hello.phpявляется массивом активных в данный момент плагинов. Вы не можете передавать свои собственные переменные таким обратным вызовам. Если вы не используете класс / глобальные переменные, вам нужно использовать activate_plugin('hello.php');. Но это не должно быть проблемой ...?
Стивен Харрис

Ну, я не люблю писать одни и те же переменные во многих местах. но это не имеет большого значения. Огромное спасибо
Юнсал Коркмаз

2

Вот кто-то объясняет, почему он не работает для него, и как он должен был скопировать метод activ_plugin и создать свой собственный без проблем: /programming/1415958/how-to- Activate-WordPress-плагинов-внутренне

Вот исходный код кода activ_plugin, который вы могли бы использовать для создания своей собственной функции и посмотреть, где он не работает для вас: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Вот возможное решение, содержащее альтернативный метод активации плагина, который кто-то, вероятно, использовал в этом исходном коде: Как активировать плагины с помощью кода?


это решение до сих пор не работает в register_activation_hook
Юнсал Коркмаз

К счастью, теперь, когда у вас есть собственный метод активации плагина, вы сможете отладить его и выяснить, где он выходит из строя, верно? :) Вы изменили ваш register_activation_hook, чтобы использовать ваш собственный метод activ_plugin вместо метода по умолчанию? Если это так, добавьте несколько операторов trigger_error и выясните, где это происходит. Например, хорошее место для начала было бы узнать, что ваш метод возвращает в случае сбоя.
mltsy

Я старался изо всех сил для отладки, но я не мог найти причину. Возможно, опция active_plugins получает обновление после выполнения register_activation_hook.
Юнсал Коркмаз,

Извините, я только что исправил порядок двух ссылок, которые я поменял (последние две). Используете ли вы код из ссылки под названием «Как активировать плагин с помощью кода?» Другим полезным указанием будет возвращаемое значение метода по умолчанию activate_plugin. Вы можете использовать, trigger_errorчтобы найти возвращаемое значение и опубликовать его здесь.
mltsy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.