Чому activate_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 як приклад
Ünsal 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);
}

Якщо у вас є час, я редагую своє запитання, щоб написати те, що я зараз використовую. Ви можете бачити activate_plugin ($ залежно); не працює при активації плагіна. Будь-яка ідея, як це виправити?
Ünsal Коркмаз

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

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

Це тому, що змінна, надана вашому зворотному виклику, не hello.phpє масивом поточно активних плагінів. Ви не можете передавати власні змінні таким чином, як зворотний зв'язок. Якщо ви не використовуєте класові / глобальні змінні, вам потрібно буде користуватися activate_plugin('hello.php');. Але це не повинно бути проблемою ...?
Стівен Харріс

добре, я не люблю писати ті ж змінні в багатьох місцях tbh. але це не велика справа. thx a lot
Ünsal Korkmaz

2

Ось хтось пояснює, чому це не працює для нього, і як йому довелося без проблем скопіювати метод activate_plugin та створити власний власний нестандарт: /programming/1415958/how-to- активувати-wordpress-плагіни - внутрішньо

Ось оригінальне джерело коду activate_plugin, який ви могли використовувати для створення власної функції та побачити, де вона не працює для вас: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Ось можливе рішення, що містить альтернативний метод активації плагінів, який інший, ймовірно, вибухнув із цього вихідного коду: Як активувати плагіни за допомогою коду?


це рішення все ще не працює в register_activation_hook
Ünsal Korkmaz

На щастя, тепер, коли у вас є власний метод активації плагіна, ви зможете налагодити його та зрозуміти, де він не працює? :) Чи змінили ви свою реєстраційну_активацію_гука, щоб використовувати власний метод activate_plugin замість стандартного? Якщо це так, введіть декілька заяв про запуск_error та з’ясуйте, де воно не вдається. Наприклад, хорошим місцем для початку було б з’ясувати, який метод повертається, коли він не працює.
млці

Я намагався зробити все можливе для налагодження, але я не міг знайти причину. Можливо, параметр active_plugins отримує оновлення після того, як виконано register_activation_hook.
Ünsal Korkmaz

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