web-dev-qa-db-ja.com

カスタムプロファイルフィールドを保存する

このように、特定の役割を持つユーザーにカスタムプロファイルフィールドを追加します。

function add_custom_profile_fields( $fields ) {

    // get current user ID
    $user = new WP_User( $_GET['user_id'] );

    // get current user role
    if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
        foreach ( $user->roles as $role ) {

            // filter roles
            if ($role == "paying_member"){
               $fields['Paypal_account'] = 'Paypal account';        
            }
         }
     }

    return $fields;
}
add_filter('user_contactmethods','add_custom_profile_fields',10,1);

問題は、フィールドの値が保存されないことです。管理者としてログインすると、ユーザーのプロフィールが編集されます。それはどういうわけか私がユーザーの役割によってフィルタリングしているという事実と関係があります、なぜなら私がその部分を削除するとき、値は完全に保存されるからです。

編集:私は多分全体の方法が間違っていると思う、私は代わりにこれ これを試してみるつもりです

1
mike23

さて、私はそれを間違ってやっていた、これはJustin Tadlockの チュートリアル に基づいた実用的な解決策です。

<?php
/* Add custom profile fields (call in theme : echo $curauth->fieldname;) */ 

add_action( 'show_user_profile', 'my_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );

function my_show_extra_profile_fields( $user ) { ?>

    <?php if(user_can($user->ID, "paying_member")) : ?>

        <h3>Extra profile information</h3>

        <table class="form-table">

            <tr>
                <th><label for="Paypal_account">Paypal</label></th>

                <td>
                    <input type="text" name="Paypal_account" id="Paypal_account" value="<?php echo esc_attr( get_the_author_meta( 'Paypal_account', $user->ID ) ); ?>" class="regular-text" /><br />
                    <span class="description">Please enter your Paypal account.</span>
                </td>
            </tr>

        </table>

    <?php endif; ?>

<?php }

add_action( 'personal_options_update', 'my_save_extra_profile_fields' );
add_action( 'edit_user_profile_update', 'my_save_extra_profile_fields' );

function my_save_extra_profile_fields( $user_id ) {

    if ( !current_user_can( 'edit_user', $user_id ) )
        return false;

    /* Copy and paste this line for additional fields. Make sure to change 'Paypal_account' to the field ID. */
    update_usermeta( $user_id, 'Paypal_account', $_POST['Paypal_account'] );
}


?>

彼のコードへの主な追加は、このコード行です:

<?php if(user_can($user->ID, "paying_member")) : ?>

これは、 "paying_member"の役割を持つユーザーと管理者に対してのみカスタムフィールドを表示します。

4
mike23

ロールのループをスキップして、 user_can を使用することができます。

この関数は、パラメータとしてケーパビリティまたはロールのいずれかを取ります。

if (user_can($user->ID, "paying_member")) { 
    $fields['Paypal_account'] = 'Paypal account';
}

ユーザー検索をスキップするために current_user_can をチェックインすることも価値があるかもしれません。

2
Dave Konopka

問題は、$ _ GET ['user_id']が設定されていないことです。現在のユーザー変数を引き込みたいです。これを試してみてください。

function add_custom_profile_fields( $fields ) {
  global $current_user;
  if user_can($current_user, "paying_member") { 
    $fields['Paypal_account'] = 'Paypal account';
  }
  return $fields;
}
0
Dave Konopka