特定のタクソノミーに所属するカスタム投稿タイプの一覧を表示してみた
必要は発明の母である。
発明というほど大したことではないが、必要に迫られて、頼る人もなく(予算もしかり、細かすぎてSEに頼むのがはばかられる案件)自力でなんとかせねば という状況に追い込まれて、なんとか ゴリゴリ ガツガツ やってみた。
何がしたかったかというと・・・
Aという施設の紹介ページ(投稿)がある。
一方で イベントのページ(カスタム投稿)があり、これはEvent Organiser プラグインを使って作成。
(このプラグイン イベント情報サイトには便利。)
Aのページの中に「イベント情報」という枠があり、そこにはAで開催されるイベントのタイトルが表示され、クリックすると各イベントページに飛ぶ という仕組み。
イベントのカスタム投稿で記事を作成したら自動的にこの枠に表示されるので、クライアントさんはイベントの情報だけを管理していれば良い という仕組み。
まず
イベント というカスタム投稿から5件を取得してみる
<ul> <?php $args = array( 'numberposts' => 5, //表示(取得)する記事の数 'post_type' => 'event' //投稿タイプの指定 ); $posts = get_posts( $args ); if( $posts ) : foreach( $posts as $post ) : setup_postdata( $post ); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; ?> <?php else : //記事が無い場合 ?> <li><p>記事はまだありません。</p></li> <?php endif; wp_reset_postdata(); //クエリのリセット ?> </ul>
特定の会場の記事一覧を表示させてみる
こちらの記事を参考に tax_queryとやらを使ってみました
https://memorandums.3ki3ki.com/wp-querypost/
わかりやすい説明をありがとうございます。
$args = array( 'post_type' => 'event', 'post_status' => 'publish', // 非公開の記事も取得してしまったので、これを足しました。 'tax_query' => array( array( 'event-venue' => 'A', // Aは会場名 ), ), ); $the_query = new WP_Query( $args );
結果・・・うまく行かず。 あれこれと調べてみたら
event-venue はカスタムフィールド名ではなくタクソノミーだと。
またまた上記記事を参考に(ありがとございます)
タクソノミーとして設定し直し
$args = array( 'post_type' => 'event', 'tax_query' => array( array( 'taxonomy' => 'event-venue', //タクソノミー名を指定 'field' => 'slug', //'term_id'、'slug'などのフィールド名を指定 'terms' => 'hogehoge', //タクソノミーの値を指定 'operator' => 'IN' //'AND'、'IN'、'NOT IN'の何れかを指定 ) ), 'post_status' => 'publish',
今度は 会場名A(スラッグはhogehoge)のイベントのタイトルが表示されました。
2件登録していたので2件とも表示されリンクもバッチリ
でも、これだと どの会場のページにも Aのイベントだけ表示されるという事態に・・・・
ターム(タクソノミーの値)を変数にして渡してやればいいわけですよね。
$target_terms = the_title( '', '', false );
こんなのじゃダメかしら
スラッグを引数にしようと思ったのですが Aという親記事のスラッグと、会場名タクソノミーのスラッグを
設定しないといけないし、それが一致しないとダメなわけで それってクライアントさんには結構ハードル高いんですよね。
なので、 記事のタイトルとタクソノミーのname を取得するようにしてみました。
<ul> <?php $target_terms = the_title( '', '', false ); $args = array( 'post_type' => 'event', 'tax_query' => array( array( 'taxonomy' => 'event-venue', //タクソノミー名を指定 'field' => 'name', //'term_id'、'slug'などのフィールド名を指定 'terms' => $target_terms, //タクソノミーの値を指定 'operator' => 'IN' //'AND'、'IN'、'NOT IN'の何れかを指定 ) ), 'post_status' => 'publish', ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> <?php else: ?> <p>記事がありません</p> <?php endif; ?> <?php wp_reset_postdata(); ?> </ul>
出来上がり!! イベント登録がないB会場のページは「記事がありません」と表示されました。
ちなみに
operator というパラメーターの説明は、こちらのページを読んで納得しました、ありがとうございます。
この記事へのコメントはありません。