Как запустить функцию активации, когда плагин активирован по сети на мультисайте?

12

Я пытаюсь сделать плагин совместимым с несколькими сайтами. Я использую register_activation_hook()функцию, чтобы зарегистрировать свою my_activate()функцию для запуска, когда плагин активирован. Это хорошо работает при установке на одном сайте.

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

Проблема в том, my_activate()что не работает для каждого сайта, когда мой плагин «активирован по сети». Кроме того, он не запускается при создании новых сайтов в сети.

Как я могу заставить мою процедуру активации а) запускаться, когда мой плагин активирован по сети для всех сайтов в сети, и б) запускаться, когда новый сайт создается в многосайтовой сети?

henrywright
источник

Ответы:

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
Ценю объяснение и еще раз спасибо за ваш ответ :)
Генрирайт
1
@ErenorPaz restore_current_blogдолжен быть в foreachцикле, потому что если вы поместите его снаружи, то итерируйте (переключитесь), например, на 10 блогов, при последнем вызове restore_current_blogбудет восстановлен последний блог, на который вы переключились, а НЕ исходный блог, с которого вы начали (предположительно) ваш главный сайт). codex.wordpress.org/WPMU_Functions/restore_current_blog
Адам
1
@ErenorPaz не нужно удалять комментарий, это делает историю чата запутанной, чтобы читать для людей. Нет ничего плохого в том, чтобы дать мнение, даже если оно может быть неверным. Никто не будет ненавидеть вас за это, мы сообщество, чтобы помочь, обсудить, узнать и получить перспективу. Во всяком случае, все хорошо ...
Адам