web-dev-qa-db-ja.com

ユーザーの役割に応じて異なるUsermetaフィールドを保存する方法

私はプラグインを使用していくつかのカスタムロールを作成しました。また、各ユーザーのプロファイルページに表示されるカスタムユーザーメタフィールド(/wp-admin/profile.php)も作成しました。

カスタムフィールドの保存に問題があります。ユーザーの役割を変更しなくても問題なくフィールドを保存できます。だから、例を挙げましょう:

  • ユーザー1にはフィールドa、b、およびcがあり、それらは保留中のユーザー役割を持っています。
  • 自分のユーザーロールをOwnerに変更すると、そのフィールドはaとbになります。
  • その後、自分のユーザーロールをPendingに変更すると、フィールドCに表示されていた詳細が消えます。

WPがデータベースから削除しているようです。 usermetaデータベーステーブルに格納されているデータを失うことなく、ロールとフィールドを変更できるようにしたいです。

私の問題はupdate_usermeta関数にあると思います。

//saving the user fields
add_action( 'personal_options_update', 'save_user_fields' );
add_action( 'edit_user_profile_update', 'save_user_fields' );

function save_user_fields( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) )
    return false;
update_usermeta( $user_id, 'unit_type', $_POST['unit_type'] );
update_usermeta( $user_id, 'registered_as', $_POST['registered_as'] );
update_usermeta( $user_id, 'date_registered', $_POST['date_registered'] );
update_usermeta( $user_id, 'unit_number', $_POST['unit_number'] );
update_usermeta( $user_id, 'first_name', $_POST['first_name'] );
update_usermeta( $user_id, 'last_name', $_POST['last_name'] );
update_usermeta( $user_id, 'owner1_address', $_POST['owner1_address'] );
update_usermeta( $user_id, 'owner1_tel_day', $_POST['owner1_tel_day'] );
update_usermeta( $user_id, 'owner1_tel_night', $_POST['owner1_tel_night'] );
update_usermeta( $user_id, 'emergency_contact_name', $_POST['emergency_contact_name'] );
update_usermeta( $user_id, 'emergency_contact_tel_day',     $_POST['emergency_contact_tel_day'] );
update_usermeta( $user_id, 'emergency_contact_tel_night',     $_POST['emergency_contact_tel_night'] );
}
3
Fraggy

所見:この記事で提案されているガイドライン に従って 、QとAの両方の品質を向上させようとしています。これは学習プロセスです。 。

あなたの オリジナルのコード では、ユーザーの役割や他の条件に従って異なる入力フィールドを表示していました。

add_action( 'show_user_profile', 'user_fields_for_admin', 10);
add_action( 'edit_user_profile', 'user_fields_for_admin', 10);
function user_fields_for_admin( $user ){ 
    switch ($user->roles[0]) {
        case 'pending':
            if ($selected_register == "Owner"){
                // Display some fields;
            } elseif ($selected_register == "Board") {
                // Display other fields
            }
            break;

        case 'owner':
            // Display yet another fields
            break;
    }
}

しかし、update_usermetaを使用してフィールドを保存すると(編集した質問のコードに従って)、表示されているかどうかにかかわらず、すべてのフィールドが保存されていました。

あなたはフィールド値が渡されているかどうかをチェックしなければならないので、usermetaは更新のたびに存在しない値で上書きされないでしょう。

function save_user_fields($user_id) {
    if (!current_user_can('edit_user', $user_id))
        return false;
    if( isset($_POST['unit_type']) )     update_usermeta($user_id, 'unit_type', $_POST['unit_type']);
    if( isset($_POST['registered_as']) ) update_usermeta($user_id, 'registered_as', $_POST['registered_as']);
    // ETC
}

HTMLのデバッグと印刷に関する提案

参考までに、次のコードを使用してPHPオブジェクトの内容を確認できます。

echo '<pre>'.print_r($user, true).'</pre>';

また、一度に1行ずつエコーする代わりに、 Heredoc sintax を使用して、HTMLを読みやすくしたり印刷したりできます。 PHP変数は中括弧で囲まれています。例:

echo <<<HTML
    <h3>Owner Details</h3>
    <table class="form-table"><tbody><tr>
    <tr><th>First Name</th>
    <td><input type="text" name="first_name" id="first_name1" value="{$first_name}" class="regular-text" /></td>
    </tr>
    <tr><th>Last Name</th>
    <td><input type="text" name="last_name" id="last_name1" value="{$last_name}" class="regular-text" /></td>
    </tr>
HTML;
3
brasofilo