WordPress MU plugin activation for each blog

register_activation_hook( __FILE__, 'pluginname_register_activation_hook' );
register_deactivation_hook( __FILE__, 'pluginname_register_deactivation_hook' );

function pluginname_create_database_table() {
    $table_name = 'plugin_table_name';

    if( ! pluginname_database_table_exists( $table_name ) ) {
        $sql = "CREATE TABLE " . $table_name . " (
				id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
				name VARCHAR(250) NOT NULL DEFAULT '',
				date_created DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
				) CHARACTER SET utf8 COLLATE utf8_unicode_ci;";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
}

function pluginname_database_table_exists( $table_name ) {
    global $wpdb;
    return strtolower( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") ) == strtolower( $table_name );
}

function pluginname_register_activation_hook() {
    if( function_exists('is_multisite') && is_multisite() ) {
        if( isset($_GET['networkwide']) && ( $_GET['networkwide'] == 1 ) ) {
            pluginname_call_function_for_each_site( 'pluginname_activate' );
            return;
        }
    }
    
    pluginname_activate(); // otherwise do it for a single blog/site
}

function pluginname_activate() {
    pluginname_create_database_table();
    update_option( PLUGINNAME_VERSION_KEY, PLUGINNAME_VERSION_NUM );
}

function pluginname_register_deactivation_hook() {
    if( function_exists( 'is_multisite' ) && is_multisite() ) {
        if( isset( $_GET['networkwide'] ) && ( $_GET['networkwide'] == 1 ) ) {
            pluginname_call_function_for_each_site( 'pluginname_deactivate' );
            return;
        }
    }
   
    pluginname_deactivate(); // otherwise do it for a single blog/site
}

function pluginname_deactivate() {
    delete_option( PLUGINNAME_VERSION_KEY );
}


function pluginname_call_function_for_each_site( $function ) {
    global $wpdb;

    // Hold this so we can switch back to it
    $root_blog = $wpdb->blogid;

    // Get all the blogs/sites in the network and invoke the function for each one
    $blog_ids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM $wpdb->blogs"));
    foreach ($blog_ids as $blog_id) {
        switch_to_blog($blog_id);
        call_user_func($function);
    }

    // Now switch back to the root blog
    switch_to_blog($root_blog);
}

Leave a Comment