멀티 사이트에서 플러그인이 네트워크로 활성화 된 경우 활성화 기능을 실행하는 방법은 무엇입니까?


12

플러그인 다중 사이트를 호환하려고합니다. 플러그인이 활성화되었을 때 실행할 register_activation_hook()기능을 등록 하는 기능을 사용하고 있습니다 my_activate(). 이것은 단일 사이트 설치에서 잘 작동합니다.

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

문제는 my_activate()플러그인이 '네트워크 활성화 됨'인 경우 각 사이트에 대해 실행되지 않는다는 것입니다. 또한 네트워크에 새 사이트를 만들 때 실행되지 않습니다.

활성화 루틴을 a) 네트워크의 모든 사이트에 대해 플러그인이 네트워크 활성화 될 때 실행 하고 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를 참조하십시오. -activation / 당신의 다중 네트워크의 각 플러그인이있는 네트워크가 활성화되어 있는지 확인 할,이 둘의 register_activation_hook및 register_deactivation_hook각 블로그의 컨텍스트에서 실행됩니다.


솔루션 주셔서 감사합니다, 대단히 감사합니다! 첫 번째 문장과 관련하여 질문의 문구를 약간 업데이트했습니다.
— henrywright

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. 희망이 도움이됩니다.
— Adam

1
설명을 감사하고 답장을 보내 주셔서 다시 한 번 감사드립니다 :)
— henrywright

1
@ErenorPaz restore_current_blog는 foreach루프 에 있어야합니다. 예를 들어 외부에 배치 한 경우 10 개의 블로그로 반복 (전환)하면 마지막 호출 restore_current_blog은 사용자가 시작한 원래 블로그가 아니라 마지막으로 전환 한 블로그를 복원합니다 (아마도 기본 사이트). codex.wordpress.org/WPMU_Functions/restore_current_blog
— Adam

1
@ErenorPaz는 댓글을 삭제할 필요가 없으므로 채팅 기록이 사람들에게 읽기 어려워집니다. 정확하지 않더라도 의견을 제시하는 데 아무런 문제가 없습니다. 아무도 당신을 미워하지 않을 것입니다. 우리는 여기에 도움을주고 토론하고 배우고 관점을 얻기위한 커뮤니티입니다. 어쨌든 모든 좋은 ...
— Adam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.