Làm cách nào để chạy chức năng kích hoạt khi plugin được kích hoạt mạng trên multisite?


12

Tôi đang cố gắng để làm cho plugin của tôi tương thích nhiều trang. Tôi đang sử dụng register_activation_hook()chức năng để đăng ký my_activate()chức năng của mình để chạy khi plugin được kích hoạt. Điều này hoạt động tốt trên một cài đặt trang web duy nhất.

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

Vấn đề là, my_activate()không chạy cho mỗi trang web khi plugin của tôi được 'kích hoạt mạng'. Ngoài ra, nó không chạy khi các trang web mới được tạo trên mạng.

Làm cách nào tôi có thể đưa thói quen kích hoạt của mình thành a) chạy khi plugin của tôi được kích hoạt mạng cho tất cả các trang web trong mạng và b) chạy khi một trang web mới được tạo trên mạng nhiều trang?

Câu trả lời:


21

Chức năng gọi lại của bạn sẽ chạy khi plugin của bạn được kích hoạt hoặc kích hoạt mạng cho một trang web. Dù bằng cách nào, nó nên được làm việc.

Tuy nhiên, nếu bạn dự định mã được chứa trong cuộc gọi lại của bạn sẽ được chạy cho mỗi blog trong mạng của bạn, thì hãy lưu ý rằng điều này sẽ không xảy ra, thay vào đó, mã trong cuộc gọi lại của bạn sẽ trong ngữ cảnh blog chính.

Nếu mã của bạn cần chạy trên mỗi blog khi Kích hoạt mạng:

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

Nếu mã của bạn cần chạy khi một blog mới được tạo:

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

Ngoài ra:

Đối với những người đọc muốn có chức năng tương tự nhưng đối với tất cả các plugin được kích hoạt mạng (không chỉ là plugin bạn kiểm soát, nếu có thể áp dụng) , thì bạn có thể muốn xem: https://wordpress.org/plugins/proper-network -activation / sẽ đảm bảo rằng mỗi plugin trong mạng nhiều trang của bạn được kích hoạt mạng, có cả plugin register_activation_hookregister_deactivation_hookchạy trong từng ngữ cảnh blog.


cảm ơn giải pháp, đánh giá cao! Về câu đầu tiên của bạn, tôi đã cập nhật từ ngữ câu hỏi của tôi một chút.
henrywright 14/03/2015

3
@henrywright register_activation_hookchỉ là một trình bao bọc add_action('activate_' . $file, $function)mà chính nó kích hoạt, do_action( 'activate_' . $plugin, $network_wide )trong đó bạn có thể thấy biến $network_widevà trạng thái giá trị của nó, một trong hai truehoặc falseluôn luôn được chuyển như một đối số cho cuộc gọi lại. Do đó, bạn có quyền truy cập vào lập luận này trong thư mục register_activation_hookregister_deactivation_hookgiấy gói. Để biết thêm thông tin xem activate_pluginchức năng trong wp-admin/includes/plugin.php. Mong rằng sẽ giúp.
Adam

1
Đánh giá cao lời giải thích và cảm ơn lần nữa vì câu trả lời của bạn :)
henrywright 15/03/2015

1
@ErenorPaz restore_current_blogcần phải ở trong foreachvòng lặp, vì nếu bạn đặt nó bên ngoài, sau đó lặp lại (chuyển qua) thành 10 blog, cuộc gọi cuối cùng restore_current_blogsẽ khôi phục blog cuối cùng bạn đã chuyển sang và KHÔNG phải là blog ban đầu bạn đã bắt đầu (có lẽ là trang web chính của bạn). codex.wordpress.org/WPMU_Fiances/restore_civerse_blog
Adam

1
@ErenorPaz không cần xóa bình luận, làm như vậy khiến lịch sử trò chuyện khó hiểu khi đọc cho mọi người. Không có gì sai khi đưa ra ý kiến ​​ngay cả khi nó có thể không đúng. Không ai sẽ ghét bạn vì điều đó, chúng tôi là cộng đồng ở đây để giúp đỡ, thảo luận, tìm hiểu và có được quan điểm. Dù sao thì cũng tốt ...
Adam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.