วิธีการเรียกใช้ฟังก์ชั่นการเปิดใช้งานเมื่อปลั๊กอินเปิดใช้งานเครือข่ายบนเว็บไซต์หลายไซต์


12

ฉันกำลังพยายามทำให้ปลั๊กอินหลายไซต์เข้ากันได้ ฉันใช้register_activation_hook()ฟังก์ชันเพื่อลงทะเบียนmy_activate()ฟังก์ชั่นของฉันให้ทำงานเมื่อเปิดใช้งานปลั๊กอิน วิธีนี้ใช้ได้ดีในการติดตั้งไซต์เดียว

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

ปัญหาคือmy_activate()ไม่ทำงานสำหรับแต่ละไซต์เมื่อปลั๊กอินของฉันคือ 'เปิดใช้งานเครือข่าย' นอกจากนี้มันจะไม่ทำงานเมื่อมีการสร้างเว็บไซต์ใหม่ในเครือข่าย

ฉันจะทำให้รูทีนการเปิดใช้งานของฉันเป็น)ทำงานเมื่อปลั๊กอินของฉันเปิดใช้งานเครือข่ายสำหรับทุกไซต์ในเครือข่ายและb)ทำงานเมื่อมีการสร้างไซต์ใหม่บนเครือข่ายหลายไซต์

คำตอบ:


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ทำงานในแต่ละบริบทของบล็อก


ขอบคุณสำหรับการแก้ปัญหาชื่นชมมาก! เกี่ยวกับประโยคแรกของคุณฉันได้อัปเดตข้อความของคำถามของฉันเล็กน้อย
henrywright

3
@ Henrywright register_activation_hookเป็นเพียง wrapper 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หวังว่าจะช่วย
Adam

1
ขอบคุณคำอธิบายและขอขอบคุณอีกครั้งสำหรับคำตอบของคุณ :)
henrywright

1
@ErenorPaz restore_current_blogจำเป็นต้องอยู่ในforeachลูปเพราะถ้าคุณวางไว้ข้างนอกให้ทำซ้ำ (สลับไป) เป็น 10 บล็อกตัวอย่างการโทรครั้งสุดท้ายที่restore_current_blogจะคืนค่าบล็อกล่าสุดที่คุณเปลี่ยนไปไม่ใช่บล็อกดั้งเดิมที่คุณเริ่มต้น (น่าจะเป็นไปได้ เว็บไซต์หลักของคุณ) codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam

1
@ErenorPaz ไม่จำเป็นต้องลบความคิดเห็นการทำเช่นนั้นทำให้ประวัติการแชททำให้คนอ่านสับสน ไม่มีอะไรผิดที่ให้ความเห็นแม้ว่ามันอาจจะไม่ถูกต้องก็ตาม ไม่มีใครเกลียดคุณเพราะเรื่องนี้เราเป็นชุมชนที่นี่เพื่อช่วยเหลือพูดคุยเรียนรู้และรับมุมมอง อย่างไรก็ตามดีทั้งหมด ...
อดัม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.