サポート » プラグイン » ACFユーザーとログインユーザーを紐づけて条件分岐

  • 解決済 mikujin

    (@mikujin)


    お世話になります。
    ACFで選択したユーザーとログインユーザーが一致したとき、そのログインユーザー情報のみ表示したいです。(ACFフィールドにて設定)
    また、アーカイブページでも同じことをやりたいです。

    以下のコードを書いています。

    <?php
    $user = get_field('username');
    $loginuser = get_users(); ←ここが分かりません
    ?>
    <?php if ( $user === $loginuser ) : ?>
        <h3><?php echo $user['display_name']; ?></h3> ←ここも意図した出力がされません
    <?php endif; ?>

    ACFで選択したユーザー情報とログインユーザー情報をどの情報で紐づけれるのかが分かりません。
    ネットやフォーラムを見ながら、試行錯誤しておりますが、そもそも本件は実装可能なのか・・・と疑問にも思っているところです・・・

    ご教示頂ければとても助かります。
    どうぞ宜しくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全16件中)
  • kimipooh

    (@kimipooh)

    get_users (developer.wordpress.org)

    をみると、get_users は array での取得のため、 $user === $loginuser はマッチしないはずです。

    https://codex.wordpress.org/Database_Description#Table:_wp_users
    https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_userdata
    をみると
    username の取得は、 user_login になりますね。
    ので $user === $loginuser->user_login で判定したらよいのではないかなと思います。

    get_filed では、特定のフィードから値をとってきているので、ここは文字列(配列ではない)かもしれません。
    そのあたりは、var_dump($user) などでどのような値がはいっているかチェックしてみるのがよいかなぁと思います。
    $user[‘display_name’] はそもそも ACFフィードに display_name の設定と値がないとだめでしょうし、ACFではなくユーザー側の display_name を表示したいのなら、、echo $loginuser->display_name; だと思います。

    • この返信は2年前にkimipoohが編集しました。
    トピック投稿者 mikujin

    (@mikujin)

    kimipooh様、ご返信ありがとうございます。
    貼り付けて頂いたURL先も質問前に目を通していたのですが、改めて内容確認いたしました。
    早速、ご教示内容から下記のコードを書いてみましたが、意図した結果にはなりませんでした。
    実行結果は空白となります。

    <?php
    $user = get_field('username');
    $loginuser = get_users(); ←ここが分かりません
    ?>
    <?php if ( $user === $loginuser->user_login ) : ?>
        <h3><?php echo $loginuser->display_name; ?></h3> ←ここも意図した出力がされません
    <?php endif; ?>

    また、ACFのフィールドの返り値は「配列」に指定しております。
    var_dump($user) で内容を確認しましたところ、display_nameでの出力がありました。

    上記コードのどの部分が問題なのか、再度ご教示頂ければ助かります。
    引き続き、宜しくお願いいたします。

    kimipooh

    (@kimipooh)

    $loginuser に入ってほしいユーザー名については、現在 WordPress にログインしているユーザーでしょうか。
    もしそうなら、
    $loginuser = wp_get_current_user()->user_login;
    で現在ログインしているユーザーのユーザ名を取得できます。

    つまり

    <?php
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    
    if($user['display_name'] === $loginuser) : ?>
        <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>

    といったコードになるだろうと思います。

    全ユーザーから、ACFで設定したユーザーが存在する場合については

    $user = get_field('username');
    $user_args = array(
      'orderby'=>'ID',
      'order'=>'ASC',
    );
    $user_list = get_users($user_args); // 全ユーザのリストをオブジェクト形式で取得した上で、
    
    $loginuser = ""; // 全ユーザーから、ACFのユーザー名に一致すれば $loginuser にユーザー名を入れる
    foreach($user_list as $each_user) :
      if($user['display_name'] === $each_user->user_login) :
         $loginuser = $each_user->user_login;
         break;
      endif;
    endforeach;
    
    // $loginuser に値が入っている(ということは、全ユーザの中に、ACFのユーザーと一致するものがあった)
    if(!empty($loginuser)) : ?>
        <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>

    などのように判定することができるかなと思います。

    • この返信は2年前にkimipoohが編集しました。
    トピック投稿者 mikujin

    (@mikujin)

    kimipooh様、ご返信ありがとうございます。
    頂いた1つ目のコードで実装したかったログインユーザーとACFユーザーの値の紐づけが出来ました。
    ありがとうございます!

    ただ、管理者権限のログイン時のみ分岐を除外したいのですが、どのようなコードを書き足せばよいでしょうか?
    下記のコードを書いてみたのですが、上手くいきません。

    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    if($user['display_name'] === $loginuser && !current_user_can('administrator')):
    ?>
    <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>

    また、これと同じ内容でアーカイブページにも、「管理者権限以外」で、ログインユーザーの記事のみ一覧表示する場合、どのようなコードにすればよいでしょうか?
    同じコードを貼り付けてみましたが、実装できませんでした。
    アーカイブページの場合の書き方についてアドバイス頂ければ助かります。

    2つ目のコードもありがとうございます。
    今後必要なときに何度も参照しながら学ばせて頂きます。
    きちんと要件定義ができていなくて、お手数をおかけしまして申し訳ありませんでした。

    引き続きご返信をお待ちしております。
    どうぞ宜しくお願いいたします。

    kimipooh

    (@kimipooh)

    管理者かどうかは、現在ログイン中のユーザーの権限をチェックする current_user_can 関数が WordPress によって用意されています。その関数自体はお使いのようですが、もしかしたら administrator の指定をつかうことでうまくいかない可能性があります。一度 manage_options (管理者モードで管理画面にアクセスできる権限)

    利用方法は、https://webgaku.net/jp/wordpress/check-administrator/ のほうでもわかりやすく説明されているかと思います。

    これを利用すると下記のコードになります。

    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    if($user['display_name'] === $loginuser && !current_user_can('manage_options')):
    ?>
    <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>
    トピック投稿者 mikujin

    (@mikujin)

    kimipooh様、ご返信ありがとうございます。
    リンクありがとうございます。manage_optionsの使い方について調べてみました。
    このようなタグがあるのは知りませんでした。
    しかしながら、頂いたコードでは実装には至りませんでした。
    下記のような書き方も試してみましたが結果は変わりませんでした。

    
    <?php if(!current_user_can('manage_options')): ?>
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    if($user['display_name']=== $loginuser):
    ?>
    <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>
    <?php endif; ?>
    

    管理者を除いて、処理を実行するには、どのようなコードを書けば良いのでしょうか・・・
    アドバイス頂ければ助かります(:_;)
    宜しくお願いします。

    kimipooh

    (@kimipooh)

    そうなってくると、ログイン中のユーザーの権限をなぜ取得できないかを調べる必要があるかなと思います。
    https://wemo.tech/722 
    を参考に、wp_get_current_user 関数で取得可能な情報のうち、管理者かどうかのデータをチェックしてみてください。

    $current_user = wp_get_current_user();
    var_dump($current_user->caps[“administrator”]);

    として、bool(true) という結果が表示されるかどうかです。
    これが表示されるのであれば、

    <?php 
    $current_user = wp_get_current_user();
    if($current_user->caps["administrator"] === false): ?>
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->user_login;
    if($user['display_name']=== $loginuser):
    ?>
    <h3><?php echo $loginuser; ?></h3> 
    <?php endif; ?>
    <?php endif; ?>

    が使えるということになります。

    • この返信は2年前にkimipoohが編集しました。
    Aki Hamano

    (@wildworks)

    @mikujin さん

    こんにちは。

    $user = get_field('username');
    $user['display_name']

    →WordPress上の表示名

    $loginuser = wp_get_current_user()->user_login;

    →ログインID

    なので、そもそも比較している項目自体が違うと思います。

    ACF側で返す項目が display_name なのであれば、

    $loginuser = wp_get_current_user()->display_name;

    と比較する必要があると思います。

    トピック投稿者 mikujin

    (@mikujin)

    kimipooh様、Aki Hamano様、ご返信ありがとうございます。

    kimipooh様に頂いたリンク先確認しました。
    wp_get_current_userでは、管理者情報すべて取得できました。

    $current_user = wp_get_current_user();
    var_dump($current_user->caps[“administrator”]);
    で実行結果、bool(true) でした。

    上記を踏まえて、Aki Hamano様に教えて頂いた内容で上書きし、以下を実行してみましたが、結果は空白で変わりませんでした。

    <?php 
    $current_user = wp_get_current_user();
    if($current_user->caps['administrator'] === false): ?>
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name']=== $loginuser):
    ?>
    
    <h3><?php echo $loginuser; ?></h3> 
    
    <?php endif; ?>
    <?php endif; ?>

    他に考えられる原因はありますでしょうか・・・
    ご教示頂ければ幸いです。
    どうぞ宜しくお願いいたします。

    Aki Hamano

    (@wildworks)

    @mikujin さん

    こんにちは。

    コード全体を実行した結果だけを見るのではなく、

    • このコードは何をしているのか
    • それぞれのコードで期待する結果が返ってきているか
    • どこに誤りがあるのか

    を理解・確認する事が基本です。
    ご自身で順番に試してみて下さい。

    <?php
    $user = get_field( 'username' );
    
    // ACFで設定した「WordPress上の表示名」が出力されるはず
    var_dump( $user['username'] );
    
    $loginuser = wp_get_current_user()->display_name;
    
    // ログイン中のユーザーの「WordPress上の表示名」が出力されるはず
    var_dump( $loginuser );
    
    // 条件チェック1つめ
    // ACFで設定した「WordPress上の表示名」が、ログインユーザーの「WordPress上の表示名」と一致していればtrueは出力されるはず
    // そうでなければfalseが出力されるはず
    var_dump( $user['display_name'] === $loginuser );
    
    // 条件チェック2つめ
    // 管理者権限でログインしていればtrueが出力されるはず
    // 管理者権限以外でログインしていればfalseが出力されるはず
    var_dump( current_user_can( 'administrator' ) );
    
    //条件チェック1がtrue、条件2がfalseの場合
    if ( $user['display_name'] === $loginuser && ! current_user_can( 'administrator' ) ) :
    // ACFで設定した「WordPress上の表示名」がログインユーザーの「WordPress上の表示名」と一致しており、かつ管理者権限以外でログインしていれば「here」と出力されるはず
    var_dump( 'here' );
    ?>
    
    <h3><?php echo $loginuser; ?></h3> 
    
    <?php endif; ?>
    
    トピック投稿者 mikujin

    (@mikujin)

    Aki Hamano様、ご返信ありがとうございます。

    頂いたコードで値を1つづつチェックしました。ありがとうございます。
    全ての項目において意図している値が出力されていました。

    これを踏まえて再度コードを書いてみましたが、やはり空白になってしまいます(:_;)
    自分なりにコードを分析しながら取り組んでいるのですが、つまづいてしまいます・・・

    下記のように条件を分けて書くと、意図した通りの実装ができますが、同じコンテンツ部分を2つ書かないといけなくなってしまいます。

    //ログインユーザー=ACFの値が一致したとき
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name']=== $loginuser):
    ?>
    <h3><?php echo $loginuser; ?></h3> //コンテンツ
    
    //上記以外で管理者権限のとき
    <?php else:?>
    <?php if(current_user_can( 'administrator' ) ) :?>
    <h3><?php echo $loginuser; ?></h3> //コンテンツ
    
    <?php endif; ?>

    一つの分岐で書ければベストなのですが・・・
    何かアドバイス頂ければとても助かります。
    どうぞ宜しくお願いいたします。

    • この返信は2年前にmikujinが編集しました。
    kimipooh

    (@kimipooh)

    最後にお示しのコードはやりたいことが、これまでのコードと変わっています。
    これらを自然言語で書き出すと次のようになります。

    従来
    管理者ではない場合に限定して
    ACFのユーザー名 と ログインしているユーザが一致するなら、
    ログインユーザー名を出力

    最後のコード
    1. ACFのユーザー名 と ログインしているユーザが一致する場合、
       ログインユーザー名を出力
    2. 一致しない場合、かつ管理者である場合
       ログインユーザー名を出力

    従来は、管理者でない場合に限定していますから、「2」は対象外だったということになります。
    つまり、従来のコードであれば管理者だといかなる場合も出力しないということになっています。

    そのため、まずは何をしたいのかを言葉で書き下すところからやってみるのが良いと思います。

    たとえば最後のコードで、管理者かどうかを先に判定したいなら
    1. 管理者の場合
      ACFのユーザー名 と ログインしているユーザが一致しない場合
         ログインユーザー名を出力
    2. 管理者でない場合
      ACFのユーザー名 と ログインしているユーザが一致する場合、
         ログインユーザー名を出力

    となります。ただ、あまりコードの整理はできているわけじゃないので、再度のコードで十分のような気もします。
    きになるのは、管理者の場合、一致しなくても出力してもいいのではないかなぁとは思います。ただこのあたりは、どういう意図をもってやりたいのかわからないので、あくまで感想ではあります。

    トピック投稿者 mikujin

    (@mikujin)

    kimipooh様、ご返信ありがとうございます。

    説明不足で申し訳ないです。
    やりたいことは下記です。

    1.ログインユーザーとACFの値(ユーザー)が一致したとき、ログインユーザー名を出力
    2.管理者の場合、この条件分岐は除外(全コンテンツ表示)

    1のみのですと、実装できております。
    2を追記すると、全ユーザー・管理者でもページが空白になってしまいます。(管理者は全コンテンツ表示したい)

    このような状態です(:_;)
    何かアドバイス頂ければとても助かります。
    どうぞ宜しくお願いいたします。

    kimipooh

    (@kimipooh)

    その条件であれば、最後のコードで問題ないはずです。
    まずはPHPやウェブサーバーのログで何かエラーが出ていないか確認してみてください。
    また
    https://wp.go-sign.info/how-to-enable-wordpress-debug-mode/
    などを参考に WordPressの Debugを有効にしておくのもよいです。

    気になる点としては、最後のコードについて if を閉じる endif が一つ不足しています。
    最後のコードを <?php 等ややこしいところは全部取っ払うと下記のようになります。

    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name'] === $loginuser):
      *ここで出力
    else:
      if(current_user_can( 'administrator' ) ) :
       *ここで出力
      endif; 

    つまり

    //ログインユーザー=ACFの値が一致したとき
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name']=== $loginuser):
    ?>
    <h3><?php echo $loginuser; ?></h3> //コンテンツ
    
    //上記以外で管理者権限のとき
    <?php else:?>
    <?php if(current_user_can( 'administrator' ) ) :?>
    <h3><?php echo $loginuser; ?></h3> //コンテンツ
    <?php endif; ?>
    
    <?php endif; ?>

    にしないと駄目ということですね。

    トピック投稿者 mikujin

    (@mikujin)

    kimipooh様、ご返信ありがとうございます。

    リンク先を確認しました。
    DEBUGを見ましたが、本件と関連のありそうなエラーはありませんでした。

    本来ならば、以下のコードで実装が可能とのことですが、私の環境ではなぜかできません。

    <?php 
    $current_user = wp_get_current_user();
    if($current_user->caps['administrator'] === false): ?>
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name']=== $loginuser):
    ?>
    //コンテンツ
    <?php endif; ?>
    <?php endif; ?>

    とりあえずは、意図した実装が可能なので、以下のコードを使用することにします。

    
    <?php 
    $user = get_field('username');
    $loginuser = wp_get_current_user()->display_name;
    if($user['display_name']=== $loginuser):
    ?>
    //コンテンツ
    <?php else:?>
    <?php if(current_user_can( 'administrator' ) ) :?>
    //コンテンツ
    <?php endif; ?>
    <?php endif; ?>

    ここまでお力を貸して頂いたのに、解決できず大変悔しいのですが、引き続き本件に取り組みながら、何かのタイミングで実装ができたら追記したいと思います。

    お忙しい中、本当にありがとうございましたm(_ _)m
    Aki Hamano様もたくさんのアドバイスありがとうございましたm(_ _)m

    今後ともどうぞよろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全16件中)
  • トピック「ACFユーザーとログインユーザーを紐づけて条件分岐」には新たに返信することはできません。