web-dev-qa-db-fra.com

Comment synchroniser les champs de profil utilisateur dans multisite?

J'utilise wordpress multisite. J'ai installé plugin de gestion d'utilisateurs multisites .

Si un utilisateur s'inscrit sur mes sites principaux, cet utilisateur est automatiquement ajouté à tous mes sites.

Mon problème, il ne copie pas les données du profil. Je ne veux pas que mes utilisateurs remplissent les mêmes données sur les 50 sites. Y a-t-il un code disponible pour synchroniser les données?

Je veux dire que si un utilisateur remplit les champs de profil dans les sites principaux, tous les sous-sites doivent être mis à jour avec la même valeur. De même, si l'utilisateur modifie le profil dans site10.example.com, il doit être synchronisé et mis à jour sur tous les sites. C'est possible?

Merci

3
Giri

Ce code fonctionne, mais veuillez noter qu'il est fourni tel quel.
Il n’avait été testé que dans un développement localhost.

Il existe une fonction extraite du plugin Gestion des utilisateurs multisites , basée sur le get_blog_list , qui est obsolète.

Aucune alternative disponible. Pour des raisons de performances, cette fonction n'est pas recommandée.

La méta de l'utilisateur doit être vérifiée individuellement, à savoir: objectif, jabber, etc.

add_action( 'admin_init', 'wpse_38421_init');

function wpse_38421_init() 
{
    add_action( 'personal_options_update', 'wpse_38421_save_profile_fields' );
    add_action( 'edit_user_profile_update', 'wpse_38421_save_profile_fields' );
}

function wpse_38421_save_profile_fields( $user_id ) 
{

    $user_url = ( isset( $_POST['url'] ) && '' !== $_POST['url'] ) 
                ? $_POST['url'] : false;

    $user_aim = ( isset( $_POST['aim'] ) && '' !== $_POST['aim'] ) 
                ? $_POST['aim'] : false;

    $user_yim = ( isset( $_POST['yim'] ) && '' !== $_POST['yim'] ) 
                ? $_POST['yim'] : false;

    $user_Jabber = ( isset( $_POST['Jabber'] ) && '' !== $_POST['Jabber'] ) 
                ? $_POST['Jabber'] : false;

    $current_site = get_current_blog_id();
    $all_blogs = wpse_38421_get_blog_list( 0, 'all' );

    foreach ( $all_blogs as $key => $blog ) 
    { 
        if ( 
            is_user_member_of_blog( $user_id, $blog[ 'blog_id' ] ) 
            && $current_site != $blog[ 'blog_id' ] 
            )
            continue;

        switch_to_blog( $blog[ 'blog_id' ] );

        if ( $user_url ) 
            update_usermeta( $user_id, 'url', $user_url );

        if ( $user_aim ) 
            update_usermeta( $user_id, 'aim', $user_aim );

        if ( $user_yim ) 
            update_usermeta( $user_id, 'yim', $user_yim );

        if ( $user_Jabber ) 
            update_usermeta( $user_id, 'Jabber', $user_Jabber );
    }

    switch_to_blog( $current_site );
}

/**
 * Based on the deprecated WPMU get_blog_list function. 
 * 
 * Except this function gets all blogs, even if they are marked as mature and private.
 *
 * Extracted from the plugin http://wordpress.org/extend/plugins/multisite-user-management/
 */
function wpse_38421_get_blog_list( $start = 0, $num = 10 ) {
    global $wpdb;

    $blogs = $wpdb->get_results( $wpdb->prepare( 
            "SELECT blog_id, domain, path FROM $wpdb->blogs 
            WHERE site_id = %d AND archived = '0' AND spam = '0' AND deleted = '0' 
            ORDER BY registered DESC", $wpdb->siteid 
            ), ARRAY_A );

    foreach ( (array) $blogs as $details ) {
        $blog_list[ $details[ 'blog_id' ] ] = $details;
        $blog_list[ $details[ 'blog_id' ] ]['postcount'] = $wpdb->get_var( 
                "SELECT COUNT(ID) FROM " 
                . $wpdb->get_blog_prefix( $details['blog_id'] )
                . "posts WHERE post_status='publish' AND post_type='post'" 
                );
    }
    unset( $blogs );
    $blogs = $blog_list;

    if ( false == is_array( $blogs ) )
        return array();

    if ( $num == 'all' )
        return array_slice( $blogs, $start, count( $blogs ) );
    else
        return array_slice( $blogs, $start, $num );
}
1
brasofilo