サポート » 使い方全般 » 特定のユーザー権限のみアクションフックを実行させたい

  • 解決済 seven0321

    (@seven0321)


    初めて質問させていただきます。

    会員サイトの構築を考えており、下記仕様となっています。

    1.生徒(購読者権限)と講師(投稿者権限)の会員登録は別ルートとする
    2.WordPress標準のユーザー登録画面は使用しない
    3.生徒の会員登録はプラグインで行い、講師の会員登録は自作の会員登録フォームで行う
    4.自作の会員登録フォームではダッシュボードからではなく直接WordPressユーザー登録を行う
    5.講師会員は生徒会員と区別するために、WordPressユーザーにカスタムフィールドを設定し、講師の会員登録時に直接カスタムフィールドにも値をセットする

    上記の5なのですが、wp_insert_user処理後にupdate_user_metaを利用することによって、自動で講師会員登録およびカスタムフィールドへの値セットができています。以下コードを抜粋します。
    【講師会員ユーザー登録】
    $userdata = array(
    ‘user_login’ => $user_name, // ログイン名
    ‘user_pass’ => $user_pass, // パスワード
    ‘user_email’ => $user_email, // メールアドレス
    ‘role’ => ‘author’, // 権限
    );
    $user_id = wp_insert_user( $userdata );

    【カスタムフィールドへ値セット】
    function user_cf_set($user_id) {
    $val = ‘lecturer’;
    update_user_meta($user_id, ‘group’, $val);
    }
    add_action( ‘user_register’, ‘user_cf_set’, 10, 1 );

    なお、講師の会員登録フォームはHTMLで作成し、固定ページにHTMLの登録フォームを適用させています。
    【HTMLフォーム(page-lecturer.php)スラッグ:lecturer】
    <html>
    <head>
    <title>entry</title>
    </head>
    <body>
    <div class=”wrapper”>
    <div class=”container”>
    <h1>講師登録</h1>
    <form class=”my_form” name=”my_signup_form” id=”my_signup_form” action=”” method=”post”>
    <div>
    <label for=”signup_user_name”>ユーザー名</label>
    <input id=”signup_user_name” name=”user_name” type=”text” pattern=”^([a-zA-Z0-9@._-]{4,})$” title=”半角英数字4文字以上で入力してください
     日本語は使用不可です” required>
    </div>
    <div>
    <label for=”signup_password”>パスワード</label>
    <input id=”signup_password” name=”user_pass” id=”user_pass” type=”password” pattern=”(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}” title=”8文字以上で下記全てを必ず含む必要があります
    【1文字以上の数字、小文字アルファベット、大文字アルファベット】” required>
    </div>
    <div>
    <label for=”signup_email”>メールアドレス</label>
    <input id=”signup_email” name=”user_email” type=”email” pattern=”[\w\d_-]+@[\w\d_-]+\.[\w\d._-]+” required>
    </div>
    <button type=”submit” name=”my_submit” class=”my_submit_btn” value=”signup”>登録</button>
    <?php wp_nonce_field( ‘my_nonce_action’, ‘my_nonce_name’ ); //nonceフィールド設置 ?>
    </form>
    </div>
    </div>
    </body>
    </html>

    なお、生徒登録のプラグインはSimple WordPress Membershipを利用する予定です。

    ここからが質問なのですが、上記ユーザー登録およびカスタムフィールドに値セットするコードをそのまま子テーマのfunctions.phpファイルに記述すると、プライグインでの生徒会員登録時もカスタムフィールドに値がセットされてしまいます。

    そこで、講師会員登録用のフォームからの登録時のみ、カスタムフィールドに値セットするようにしたいのですが、そのようなことは可能でしょうか。

    固定ページのスラッグや投稿IDでカスタムフィールドへの値セットの処理を分岐させようとしたり、カスタムフィールドに値セットする部分の処理をphpファイルを分けて講師会員登録用のフォームからショートコードで呼ぼうとしたりしたのですが、全くうまくいきませんでした。

    もしくは、そもそもこのようなことはできないのでしょうか。
    蛇足ですが、上記コードはネットで検索したコードを見よう見まねで動かしているもので、私はPHPのプログラミングができません。

    つたない質問になってしまいましたが、何卒お知恵を貸していただけると助かります。

    以上長文となってしまいましたが、ご回答いただければ幸いです。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • こんにちは

    挙げられている設計では、登録したユーザーが投稿者権限(author)であれば、カスタムフィールドgrouplecturerを設定すれば良いと思います。
    user_cf_set関数の第一引数にユーザーIDが渡されていますので、

     $user = get_user_by( 'id', $user_id);
    if( in_array( 'author', $user->roles ) ) {
        // 講師の場合の処理
    }

    という感じかと思います。

    通常は、講師に投稿者権限などを使うのではなく、講師という権限を別に追加するのが分かりやすい設計かと思います。
    わざわざカスタムフィールドに講師であることを示す値をセットする必要もありません。

    また、こちらの方が重要なのですが、示していただいているソース(一部かと思いますが)では色々と問題がありそうです。

    まず、ログイン名かメールアドレスがすでに登録されている場合、登録が失敗します。
    wp_insert_user の戻り値をチェックして、送信したあとに遷移する画面でなぜ失敗したのかをユーザーに示す必要があります。
    そうでないと、ユーザーは登録できていないことが分からず、「登録したのにできていない」といった現象が発生します。

    次に、セキュリティ的に問題があります。
    入力値をそのままwp_insert_userに渡してはいけません。
    WordPress コアでの実装を参考にしてみてください。

    次もセキュリティ面ですが、入力値のチェックが HTML 側でしかされていませんが、サーバー側でも実装するべきです。
    なぜなら、送信データは容易に改竄可能だからです。
    単純な例では、ブラウザのデベロッパーコンソールを開いて pattern 属性を削除してなんでも入力できるようにできます。
    サーバー側だけ、あるいはブラウザとサーバーの両方で入力チェックを実装すべきで、ブラウザでのチェックのみに頼ってはいけません。

    次もまたセキュリティですが、入力値をサーバーに送信して更新するような処理では WordPress Nonce を実装し、フォームデータの送信元が自身のサイトのフォームからであることなどをチェックするべきです。

    サーバー上のデータを更新させる処理には様々な考慮があります。
    私がここで返答したことの意味が分からないのであれば、このフォームの制作をどちらかへ委託されることをお勧めします。

    トピック投稿者 seven0321

    (@seven0321)

    munyagu 様

    お世話になります。

    詳細なご回答誠にありがとうございます。
    まず、ご教示いただいたコードにて意図した挙動になるのを確認できました。

    それと質問にご配慮いただいてセキュリティに関するご指摘をくださったのも本当にありがとうございます。
    セキュリティに関してご指摘いただいた点はなるほどおっしゃる通りで、私にはその観点(経験)がありませんでした。

    まずは例示いただいたリンクを自己学習してみますが、私はご教示いただいたコードも書けないレベルなのでおっしゃる通り有償で外部委託したほうがいいのかもしれません。

    質問の目的は十分に満たせたので、本件はこれにてクローズとさせていただきます。

    早々に正確・適切なご回答いただけたこと、重ねて御礼申し上げます。
    ありがとうございました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「特定のユーザー権限のみアクションフックを実行させたい」には新たに返信することはできません。