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


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_hookregister_deactivation_hook각 블로그의 컨텍스트에서 실행됩니다.


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

3
@henrywright register_activation_hookadd_action('activate_' . $file, $function)그 자체로 발생 하는 래퍼 일 뿐이며 do_action( 'activate_' . $plugin, $network_wide )변수 $network_wide와 값 상태를 볼 수 true있거나 false항상 콜백의 인수로 전달됩니다. 따라서, 당신은 당신이 인수에 액세스 할 수 있습니다 register_activation_hookregister_deactivation_hook래퍼. 자세한 내용은의 activate_plugin기능을 참조하십시오 wp-admin/includes/plugin.php. 희망이 도움이됩니다.
Adam

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

1
@ErenorPaz restore_current_blogforeach루프 에 있어야합니다. 예를 들어 외부에 배치 한 경우 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.