サポート » 使い方全般 » ACFのselectフィールドの値を条件に、表示内容を変えたい

  • 解決済 no23h

    (@no23h)


    ユーザー情報のループを固定ページで表示することについて質問です。

    [前提]
    1. 学校のサイトで、学科ごとの紹介ページ(固定ページ)に配属している教員のリストを出力したい。
    2. 各教員にWPのアカウントを与え、ユーザーのプロフィール編集ページで入力した値を上記ページに反映する。
    3. Advanced Custom Fieldで、プロフィール編集ページに、配属学科名のSelectフィールドを追加し、各教員に選択してもらう。フィールド名は「users_department」。
    ※ Selectフィールドの選択肢は例として以下の通り、値とラベルで設定
    dep1 : 〇〇学科
    dep2 : □□学科
    dep3 : △△学科

    [実現したいこと]
    選択した値を元に、各学科の紹介ページに教員を振り分けて一覧で表示したい。

    現状作成したコードは以下になります。
    全教員の一覧が表示されます。

    <div class="authors">
    
    <?php $users = get_users( array('orderby'=>'ID','order'=>'ASC') ); ?>
    <?php foreach($users as $user) {
    $uid = $user->ID; ?>
    
    <div class="author-profile">
      <p class="author-thumbanil"><?php echo get_avatar( $uid ,300 ); ?></p>
      <p class="author-name"><?php echo $user->display_name ; ?></p>
      <p class="author-description"><?php echo $user->user_description ; ?></p>
      <p><?php the_field('users_labo', 'user_'. $uid ); ?></p>
    </div>
    
    <?php } ?>
    
    </div>

    これを各学科ページのテンプレートデータに配置し、条件式を加えて一覧を表示したいのですが、
    ACFの値を使ってどのように記述するのかわかりません。
    get_users()のパラメータでIDを元に除外等できるようですが、
    ACFの項目を元にとなると、記述方法がわかりません。

    [やってみたこと]

    こちらを参考に、if文で囲ってみましたがうまくいきません。
    ‘dep1’を指定すると全員表示され、それ以外を指定すると「該当する教員はいません。」と表示されます。

    <div class="authors">
    
    <?php $users = get_users( array('orderby'=>'ID','order'=>'ASC') ); ?>
    <?php foreach($users as $user) {
    $uid = $user->ID; ?>
    
    <?php if( get_field('users_department') == 'dep1' ) { ?>
    <div class="author-profile">
      <p class="author-thumbanil"><?php echo get_avatar( $uid ,300 ); ?></p>
      <p class="author-name"><?php echo $user->display_name ; ?></p>
      <p class="author-description"><?php echo $user->user_description ; ?></p>
      <p><?php the_field('users_labo', 'user_'. $uid ); ?></p>
    </div>
    <?php } else { ?>
    <p>該当する教員はいません。</p>
    <?php } ?>
    
    <?php } ?>
    
    </div>

    お詳しい方、よろしければ解決法、ヒントなどご教授いただけないでしょうか。
    よろしくお願いいたします。

    • このトピックはno23hが3ヶ月前に変更しました。
    • このトピックはno23hが3ヶ月前に変更しました。
    • このトピックはno23hが3ヶ月前に変更しました。
3件の返信を表示中 - 1 - 3件目 (全3件中)
  • @no23h さま

    お世話になります。私の場合phpは一気に書いてしまうほうなのですが
    基本は下記で表示できるかと思います。

    固定ページ側のアクションが文面から読めなかったので
    コード下方の表示など、変更ください。

    私の環境で動作確認はしておりますが
    動かない場合などあるかと思いますが、ご了承ください。

    よろしくお願いいたします。

    参考:
    https://www.advancedcustomfields.com/resources/how-to-get-values-from-a-user/

    関数リファレンス/get users

    
    <?php
    
    //reset
    $profile_dp1 = array();
    $profile_dp2 = array();
    $profile_dp3 = array();
    $profile_dp1_list = '';
    $profile_dp2_list = '';
    $profile_dp3_list = '';
    
    //get
     $args = array(
    	'blog_id'      => $GLOBALS['blog_id'],
    	'role'         => '',
    	'meta_key'     => '',
    	'meta_value'   => '',
    	'meta_compare' => '',
    	'meta_query'   => array(),
    	'date_query'   => array(),
    	'include'      => array(),
    	'exclude'      => array(),
    	'orderby'      => 'ID',
    	'order'        => 'ASC',
    	'offset'       => '',
    	'search'       => '',
    	'number'       => '',
    	'count_total'  => false,
    	'fields'       => 'all',
    	'who'          => ''
     );
    
    //配列で全ユーザーを取得
    $users = get_users($args);
    
    if(!empty($users)): //ユーザーを取得したとき
    
      foreach($users as $user_array ):
        //reset
        $user_dataArray = array();
        $user_id        = '';
        $user_dspName   = '';
        $user_desc      = '';
        $user_dep       = '';
        $user_labo      = '';
        $user_thumb     = '';
      
        //get
        $user_dataArray = $user_array -> data;//USER_data_array
        $user_id        = $user_array -> ID;//USER_ID
        $user_dspName   = $user_dataArray -> display_name;//USER_data_array
        $user_desc      = $user_array -> description;//USER_Description
        $user_dep       = get_field('users_department', 'user_'.$user_id);//カスタムフィールド「配属学科名」
        $user_labo      = get_field('users_labo', 'user_'.$user_id);//カスタムフィールド「?」
        $user_thumb     = get_avatar( $user_id ,300 );
        
        if(!empty($user_dep))://「配属学科名」が未入力ならイレギュラー処理を回避
        
          if($user_dep == 'dep1' ):
          
            $profile_dp1[] = 
            
            '<div class="author-profile">'.PHP_EOL.
            '  <p class="author-thumbanil">' .$user_thumb. '</p>'.PHP_EOL.
            '  <p class="author-name">' .esc_html($user_dspName).  '</p>'.PHP_EOL.
            '  <p class="author-description">' .esc_html($user_desc).  '</p>'.PHP_EOL.
            '  <p>' .$user_labo.  '</p>'.PHP_EOL.
            '</div><!-- /.author-profile -->'.PHP_EOL.PHP_EOL;
            
          
          
          elseif($user_dep == 'dep2' ):
          
            $profile_dp2[] = 
            
            '<div class="author-profile">'.PHP_EOL.
            '  <p class="author-thumbanil">' .$user_thumb. '</p>'.PHP_EOL.
            '  <p class="author-name">' .esc_html($user_dspName).  '</p>'.PHP_EOL.
            '  <p class="author-description">' .esc_html($user_desc).  '</p>'.PHP_EOL.
            '  <p>' .$user_labo.  '</p>'.PHP_EOL.
            '</div><!-- /.author-profile -->'.PHP_EOL.PHP_EOL;
          
          
          
          elseif($user_dep == 'dep3'):
          
            $profile_dp3[] = 
            
            '<div class="author-profile">'.PHP_EOL.
            '  <p class="author-thumbanil">' .$user_thumb. '</p>'.PHP_EOL.
            '  <p class="author-name">' .esc_html($user_dspName).  '</p>'.PHP_EOL.
            '  <p class="author-description">' .esc_html($user_desc).  '</p>'.PHP_EOL.
            '  <p>' .$user_labo.  '</p>'.PHP_EOL.
            '</div><!-- /.author-profile -->'.PHP_EOL.PHP_EOL;
          
          endif;
          
        
        endif;//end $user_dep
    
      endforeach;
      
      
      if(!empty($profile_dp1)):
        $profile_dp1_list = implode('', $profile_dp1 );//「dp1」配列データを連結させる
      endif;
      
      if(!empty($profile_dp2)):
        $profile_dp2_list = implode('', $profile_dp2 );//「dp2」配列データを連結させる
      endif;
      
      if(!empty($profile_dp3)):
        $profile_dp3_list = implode('', $profile_dp3 );//「dp3」配列データを連結させる
      endif;
    
    endif;// END $users
    
    //使いかた
    //dp1を表示させたい場合
    
    echo $profile_dp1_list;
    
    //ページにカスタムフィールドを設置して照合させる場合は
    
    /*
    
    if( (get_field('field_name') == 'dp1') && (!empty($profile_dp1)) ):
    
      echo $profile_dp1_list;
    
    elseif((get_field('field_name') == 'dp2') && (!empty($profile_dp2))):
    
     echo $profile_dp2_list;
    
    elseif((get_field('field_name') == 'dp3') && (!empty($profile_dp3))):
    
     echo $profile_dp3_list;
    
    else:
    
     echo '<p>該当する教員はいません。</p>';
    
    endif;
    
    */
    
    ?>
    
    
    munyagu

    (@munyagu)

    users_departmentカスタムフィールドを固定ページでも選択できるようにし、固定ページで選択されている学科と同じ学科が選択されている教員だけを取得して表示するようにすれば良いと思います。
    フィールドグループの設定で、両方に表示できるようになると思います。
    (貼っていただいたソースを見ると、すでにそうなっている気もしますが)

    そうするとソースコード中にdep1dep2などをベタ書きせずに済み、学科の増減や変更があった場合にもカスタムフィールドの選択肢のメンテと固定ページとユーザーの教科を選択しなおすだけなので、ソースコードを変更せずに済みます。

    <div class="authors">
    
    	<?php
    	$users    = [];
    	$page_dep = get_field( 'users_department' );
    	if ( $page_dep ) {
    		$users = get_users(
    			array(
    				'orderby'    => 'ID',
    				'order'      => 'ASC',
    				'meta_key'   => 'users_department',
    				'meta_value' => $page_dep
    			)
    		);
    	}
    	?>
    	<?php if ( $users ) { ?>
    		<?php foreach ( $users as $user ) {
    			$uid = $user->ID;
    			?>
                <div class="author-profile">
                    <p class="author-thumbanil"><?php echo get_avatar( $uid, 300 ); ?></p>
                    <p class="author-name"><?php echo $user->display_name; ?></p>
                    <p class="author-description"><?php echo $user->user_description; ?></p>
                    <p><?php the_field( 'users_labo', 'user_' . $uid ); ?></p>
                </div>
    		<?php } ?>
    	<?php } else { ?>
            <p>該当する教員はいません。</p>
    	<?php } ?>
    
    </div>
    no23h

    (@no23h)

    @photographer hiro. 様
    @munyagu

    ご返答いただきまして誠にありがとうございます。

    どちらの方法もこちらの環境下で正常に動作しました。
    わかりやすく解説いただきありがとうございます。

    私自身、まだがっつりphpのコードをいじれる能力がないので、
    メンテナンスの観点からmunyagu様の方法を採用させていただきました。

    かなり困ってたので、希望通りに動作するようになり大変助かりました。
    本当に感謝申し上げます。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • このトピックに返信するにはログインが必要です。