tax_queryでタームごとに分類し投稿記事の一覧を実装する方法
この記事では、タームごとに分類してカスタム投稿の記事一覧の作り方を紹介します。
まずタームごとsection
タグで分類し、記事一覧を表示させます。
タームごとに分類して記事一覧を表示するPHPコード
とりあえずはコピペでも動作するはずなので、テーマの好きなところへ貼り付けてみましょう。
必ずバックアップはしてくださいね!
<?php
$taxonomy_name = 'tax_category'; // タクソノミーのスラッグ名を入れる
$post_type = 'custom_post'; // カスタム投稿のスラッグ名を入れる
$args = array(
'orderby' => 'name',
'hierarchical' => false
);
$taxonomys = get_terms( $taxonomy_name, $args);
if(!is_wp_error($taxonomys) && count($taxonomys)):
foreach($taxonomys as $taxonomy):
$url = get_term_link($taxonomy->slug, $taxonomy_name);
$tax_posts = get_posts( array(
'post_type' => $post_type,
'posts_per_page' => 5, // 表示させたい記事数
'tax_query' => array(
array(
'taxonomy' => $taxonomy_name,
'terms' => array( $taxonomy->slug ),
'field' => 'slug',
'include_children' => true,
'operator' => 'IN'
)
)
));
if( $tax_posts ) {
?>
<section>
<h3 id="<?php echo esc_html($taxonomy->slug); ?>"><a href="<?php echo $url; ?>"><?php echo esc_html($taxonomy->name); ?></a></h3>
<ul>
<?php foreach($tax_posts as $tax_post): ?>
<li><a href="<?php echo get_permalink($tax_post->ID); ?>"><?php echo get_the_title($tax_post->ID); ?></a></li>
<?php endforeach; wp_reset_postdata(); ?>
</ul>
</section>
<?php
}
endforeach;
endif;
?>
タームを取得してループする
タームの取得にはget_terms()
関数を使います。
タームの数だけsection
タグで括られた部分をforeach($taxonomys as $taxonomy):
でループします。
ループ内でそのタームに属する記事を取得・表示する
記事の取得にはget_posts()
関数を使い、オプションのtax_query
で各タームに属する記事を取得しています。
取得した個別の記事は、foreach($tax_posts as $tax_post):
でループし<li>
タグで括られてタイトルが表示されます。
tax_queryが便利
get_posts()
で記事を呼び出す際に、tax_query
を使うところが今回のポイント。
tax_query
は、記事の取得条件を細かく絞り込むことができる便利なパラメータです。
変数$taxonomy_name
で定義したタクソノミーに関連付けされた記事に絞り込み、各個別の記事を取得しています。
'terms' => array( $taxonomy->slug )
のように配列のarray()で指定するパラメータも必要です。
tax_queryのパラメータや詳しい使い方は下記を参考にしてください。
WP Query – WordPress Codex 日本語版
タクソノミーのパラメータ
こんにちわ。
複数のtarmを含む記事一覧の中で
アドバンスカスタムフィールドで入力した値を表示したいのですが、うまく行きません。
ご教授頂けないでしょうか(;;)
アドバンスドカスタムフィールドの独自関数だと、記事ページでしか取得できないっぽいので、
WP関数のget_post_meta()を使ってみてください。
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_post_meta
$meta_values = get_post_meta($tax_post->ID, ‘ACFのkey’, true);
echo $meta_values;
これで行けそうな気がしますー
ナオユ様天才ですね!これで行けました!ありがとうございます!!!!!(;;)
早速にご返信ありがとうございます。
>termを取得するWP関数にpaged(ページ送り)のパラメータが無いため、ご希望の形での実装は厳しいかなと思います。
なるほどそうなのですね。別の考え方で解決を図らないと駄目そうだということですね。
>JSでスライダーやカルーセル等のかたちで表示する
代替案をご紹介くださり、大変ありがとうございます。
なるほどそういう考えもありますね。
現在termには年をあてており(例えば以下のような感じ)、
termに含まれる記事の数は一定ではなくまちまちになりそうなのですが、
スライダーにした場合、ボックスの高さをコントロールするのが難しいでしょうか???
2018年のおすすめ映画
・タイトル(個別ページへのリンクあり)
・タイトル(個別ページへのリンクあり)
・タイトル(個別ページへのリンクあり)
2017年のおすすめ映画
・タイトル(個別ページへのリンクあり)
・タイトル(個別ページへのリンクあり)
・タイトル(個別ページへのリンクあり)
・タイトル(個別ページへのリンクあり)
・タイトル(個別ページへのリンクあり)
・タイトル(個別ページへのリンクあり)
おすすめなのは「bxslider」か「sliderpro」ですねー。
https://bxslider.com/
http://bqworks.com/slider-pro/
どちらもスライドさせる要素の高さが違っても自動で調整する機能がありますよ!
ご親切にアドバイスをくださり、大変ありがとうございましたm (_ _) m
また試せていないのですが、うまくできましたら、またコメントさせていただきます!
色々な方のサイトを参考にさせていただきながら勉強中のWP初心者です。
実現したい形に大変近く、参考にさせていただいております。
上記のように、タームで分類した記事一覧を作成したいのですが、
タームが1〜20数件と複数(沢山)あり、今後も増える予定なので、ターム10〜12件ごとにページネーションでページを送って表示したいと考えております。
方法がわからずこちらのコメント欄に質問させていただきました。
ご教授いただけましたら大変ありがたいです。
どうぞ宜しくお願い申し上げます。
コメントありがとうございます!
僕もすごい詳しいワケでもないのですが、持てる知識をフルに使ってご質問について返信させて頂きます。
まず、termを取得するWP関数にpaged(ページ送り)のパラメータが無いため、ご希望の形での実装は厳しいかなと思います。
PHPでガンガンにカスタマイズすれば、もしかしたらそれに近いことがサーバーサイドで出来るのかもですが、そこまでの技術力がありません…。
しかし本稿のやり方だと全部のタームは出力されるので、将来タームが増えた時とても長くなってしまいますね。
代替案で申し訳ないですが、JSでスライダーやカルーセル等のかたちで表示するのはどうでしょうか?
jQueryプラグイン等で比較的カンタンに実装できます。