web-dev-qa-db-ja.com

マルチサイトでユーザープロファイルフィールドを同期する方法

私はワードプレスマルチサイトを使用しています。 マルチサイトユーザー管理 プラグインをインストールしました。

ユーザーが私のメインサイトに登録すると、そのユーザーは自動的に私のすべてのサイトに追加されます。

私の問題はそれがプロフィールデータをコピーしないことです。ユーザーが50のサイトすべてに同じデータを入力したくない。それで、データを同期するために利用できるコードはありますか?

ユーザーがメインサイトのプロファイルフィールドを埋めると、すべてのサブサイトが同じ値で更新されるはずです。同様に、ユーザーがsite10.example.com内のプロファイルを編集した場合も、すべてのサイトで同期され更新されるはずです。出来ますか?

ありがとう

3
Giri

このコードは機能しますが、現状のまま提供されていることに注意してください。
これはlocalhostの開発でのみテストされていました。

プラグインから抽出された がありますMultisite User Management。これは に基づいています。/get_blog_list function、これは廃止予定です。

代替案はありません。パフォーマンス上の理由から、この機能はお勧めできません。

ユーザーmetaは個別にチェックする必要があります。つまり、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 );
}
1
brasofilo