如何在多站点中同步用户配置文件字段?

时间:2012-01-10 作者:PrivateUser

我正在使用wordpress多站点。我已安装Multisite user management 插件。

如果某个用户在“我的主站点”中注册,则该用户会自动添加到“我的所有站点”。

我的问题是它没有复制配置文件数据。我不希望我的用户在所有50个站点中填写相同的数据。那么,是否有任何代码可用于同步数据?

我的意思是,如果用户填写主站点中的配置文件字段,则所有子站点都应使用相同的值进行更新。同样,如果用户在中编辑配置文件site10.example.com 它应该在所有站点中同步和更新。有可能吗?

谢谢

1 个回复
最合适的回答,由SO网友:brasofilo 整理而成

这段代码可以工作,但只在localhost环境中进行了测试。

有一个函数extracted from the plugin Multisite User Management, 这是基于get_blog_list 已弃用的函数。

没有可用的替代方案。出于性能原因,不建议使用此功能。

必须单独检查用户元,即Aim、Jabber等。

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 );
}

结束