Як запустити функцію активації, коли плагін активований мережею на багатосайтовому?


12

Я намагаюся зробити свій плагін багатосайтовим сумісним. Я використовую register_activation_hook()функцію, щоб зареєструвати свою my_activate()функцію для запуску, коли плагін активований. Це добре працює при встановленні одного сайту.

function my_activate() {
    // Do some things.
}
register_activation_hook( __FILE__, 'my_activate' );

Проблема полягає в тому, my_activate()що не працює для кожного сайту, коли мій плагін "мережа активована". Крім того, він не працює, коли в мережі створюються нові сайти.

Як я можу змусити рутину активації a) запустити, коли мій плагін активовано для всіх сайтів у мережі та б) запустити, коли новий веб-сайт буде створений у багатоміській мережі?

Відповіді:


21

Функція зворотного дзвінка повинна запускатися, коли ваш плагін активовано або активовано мережею для одного сайту. Так чи інакше, це повинно працювати.

Однак, якщо ви плануєте запускати код, який міститься у вашому зворотному дзвінку, для кожного блогу у вашій мережі, то майте на увазі, що це не відбудеться поза кодом, натомість код у вашому зворотному дзвінку буде в основному контексті блогу.

Якщо ваш код потрібно запускати на кожному блозі після активації мережі:

function my_plugin_activate($network_wide) {

    if ( is_multisite() && $network_wide ) { 

        global $wpdb;

        foreach ($wpdb->get_col("SELECT blog_id FROM $wpdb->blogs") as $blog_id) {
            switch_to_blog($blog_id);
            //do your specific thing here...
            restore_current_blog();
        } 

    } else {
        //run in single site context
    }

}

register_activation_hook( __FILE__, 'my_plugin_activate' );

Якщо ваш код потрібно запустити під час створення нового блогу:

function my_plugin_new_blog($blog_id, $user_id, $domain, $path, $site_id, $meta) {

    //replace with your base plugin path E.g. dirname/filename.php
    if ( is_plugin_active_for_network( 'my-plugin-name-dir/my-plugin-name.php' ) ) {
        switch_to_blog($blog_id);
        //do your specific thing here...
        restore_current_blog();
    } 

}

add_action('wpmu_new_blog', 'my_plugin_new_blog', 10, 6 );

Додатково:

Для тих, хто читає, хто хоче подібну функціональність, але для всіх плагінів, які активують мережу (не лише ту, якою ви керуєте, якщо вона взагалі застосовна) , ви можете подивитися: https://wordpress.org/plugins/proper-network -активація / що забезпечить, що кожен плагін у вашій багатосайтовій мережі, в якій активована мережа, має і свої, register_activation_hookі register_deactivation_hookзапускається в кожному контексті блогу.


дякую за рішення, високо цінуємо! Щодо вашого першого речення, я трохи оновив формулювання свого питання.
Генрірайт

3
@henrywright register_activation_hook- це лише обгортка, навколо add_action('activate_' . $file, $function)якої запускається сама по собі, do_action( 'activate_' . $plugin, $network_wide )з якої ви можете бачити змінну $network_wideта її значення, один із яких trueабо falseзавжди передається як аргумент зворотного виклику. Отже, ви маєте доступ до цього аргументу у своїх register_activation_hookта register_deactivation_hookобгортках. Для отримання додаткової інформації див activate_pluginфункцію в межах wp-admin/includes/plugin.php. Сподіваюся, що це допомагає.
Адам


1
@ErenorPaz restore_current_blogповинен бути в foreachциклі, тому що якщо ви поставите його назовні, то повторіть (перемкніть) на 10 блогів, наприклад, останній дзвінок restore_current_blogвідновить останній блог, на який ви перейшли, а НЕ початковий блог, на який ви розпочали роботу (імовірно ваш головний сайт). codex.wordpress.org/WPMU_Functions/restore_current_blog
Адам,

1
@ErenorPaz не потрібно видаляти коментар, це робить історію чату заплутаною для читання для людей. Немає нічого поганого в наданні думки, навіть якщо вона може бути невірною. Ніхто не збирається ненавидіти вас за це, ми тут спільноти, щоб допомогти, обговорити, дізнатися та отримати перспективу. У будь-якому випадку все добре ...
Адам,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.