【WordPress】特定のカテゴリーを除外する時のID指定を自動化してみる
投稿記事ページ(single.php)で記事の最後に
「前の記事」「次の記事」のリンクを設置する場合がありますが
それぞれのカテゴリー記事内でのみリンクしたい。
ということが多いかと思います。
上の例のような単純なカテゴリーであれば
Wordpressのタグ「previous_post_link」と「next_post_link」を使用して
●single.php
1 2 3 4 |
<div> <p id="prev"><?php previous_post_link('%link','≪ 前の記事',true); ?></p> <p id="next"><?php next_post_link('%link','次の記事 ≫',true); ?></p> </div> |
でそれぞれのカテゴリーのみの記事内でリンクされますが
と
このように子カテゴリーを作って
- 新着情報はお知らせとイベントの記事内でのリンク
- ブログは日常と仕事の記事内でのリンク
- 制作実績はWEBと印刷の記事内でのリンク
となってしまうと
条件分岐と除外するカテゴリーIDを指定していかなければなりません。
●function.php
1 2 3 4 5 6 7 8 9 10 11 |
//子カテゴリーの記事を特定の親カテゴリーに属する記事かどうか判定 if ( ! function_exists( 'post_is_in_descendant_category' ) ) { function post_is_in_descendant_category( $cats, $_post = null ) { foreach ( (array) $cats as $cat ) { $descendants = get_term_children( (int) $cat, 'category' ); if ( $descendants && in_category( $descendants, $_post ) ) return true; } return false; } } |
●single.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php if (in_category(1) || post_is_in_descendant_category(1)) : //新着情報の記事の場合 $categories_num = "4,5,6,7,8,9"; //除外するカテゴリーID elseif (in_category(4) || post_is_in_descendant_category(4)) : //ブログの記事の場合 $categories_num = "1,2,3,7,8,9"; //除外するカテゴリーID else : //制作実績の記事の場合 $categories_num = "4,5,6,7,8,9"; //除外するカテゴリーID endif; ?> <div> <p id="prev"><?php previous_post_link('%link','&#8810; 前の記事',false,$categories_num); ?></p>; <p id="next"><?php next_post_link('%link','次の記事 &#8811;',false,$categories_num); ?></p>; </div> |
まだ分岐は仕方ないとしても…
除外するカテゴリーIDを1つ1つ記述しなければならず面倒…(つд)
また新たな子孫カテゴリーを作るとその度に追記しなければなりません…(つд)(つд)
仮に子孫カテゴリーが100カテゴリーとかあったとしたらもう…(つд)(つд)(つд)
…と前回と似たようなお話になりますが(前回は固定ページ)w
親カテゴリーと、その子孫カテゴリーを取得して
除外する時のID指定を自動化できないか調べてみました。
① 記事の最上層カテゴリーとその子カテゴリーのIDを取得する
1 2 3 4 5 6 7 8 9 10 11 12 |
//最上層カテゴリーのIDを取得 $cat_info = get_the_category($post->ID); $first_cat = $cat_info[0]; $this_cat = $first_cat -> cat_ID; $parent_cat_id = array_pop(get_ancestors( $this_cat, 'category' )); //子カテゴリーを取得 $categories = get_term_children($parent_cat_id, 'category'); array_push($categories,$parent_cat_id); //配列に親カテゴリー追加 array_merge($categories); //結合した配列を配列型で返す asort($categories); //配列を昇順で並び替え $categories_num = implode(",", $categories); //配列要素を文字列で連結 |
categories_numは
- 新着情報(お知らせ・イベント)の記事ならばID「1,2,3」
- ブログ(日常・仕事)の記事ならばID「4,5,6」
- 制作実績(WEB・印刷)の記事ならばID「7,8,9」
を取得します。
② ①で取得したカテゴリー以外のカテゴリーIDを文字列ですべて取得する
①のcategories_numをget_categories(カテゴリー情報を取得)の
excludeで除外してforeach文を使用してそれ以外のカテゴリーのIDをすべて取得します。
1 2 3 4 5 6 7 8 9 10 11 |
$categories = get_categories(array( 'taxonomy' => 'category', 'orderby' => 'id', 'hide_empty' => 0, 'exclude' => $categories_num )); foreach($categories as $category ): $categories_num_ex .= $category->term_id .',' ; endforeach; //最後の「,」を削除 $categories_num_ex = substr($categories_num_ex, 0, -1); |
categories_num_exは
- 新着情報(お知らせ・イベント)の記事ならばID「4,5,6,7,8,9」
- ブログ(日常・仕事)の記事ならばID「1,2,3,7,8,9」
- 制作実績(WEB・印刷)の記事ならばID「1,2,3,4,5,6」
を取得します。
除外するカテゴリーIDが取得できました。
③ 「previous_post_link」と「next_post_link」に記述する
②のcategories_num_exを「previous_post_link」と「next_post_link」に記述して除外指定の完成です。
1 2 3 4 |
<div> <p id="prev"><?php previous_post_link('%link','&#8810; 前の記事',false,$categories_num_ex); ?></p>; <p id="next"><?php next_post_link('%link','次の記事 &#8811;',false,$categories_num_ex); ?></p>; </div> |
まとめ
●single.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php //最上層カテゴリーのIDを取得 $cat_info = get_the_category($post->ID); $first_cat = $cat_info[0]; $this_cat = $first_cat -> cat_ID; $parent_cat_id = array_pop(get_ancestors( $this_cat, 'category' )); //子カテゴリーを取得 $categories = get_term_children($parent_cat_id, 'category'); array_push($categories,$parent_cat_id); //配列に親カテゴリー追加 array_merge($categories); //結合した配列を配列型で返す asort($categories); //配列を昇順で並び替え $categories_num = implode(",", $categories); //配列要素を文字列で連結 $categories = get_categories(array( 'taxonomy' => 'category', 'orderby' => 'id', 'hide_empty' => 0, 'exclude' => $categories_num )); foreach($categories as $category ): $categories_num_ex .= $category->term_id .',' ; endforeach; //最後の「,」を削除 $categories_num_ex = substr($categories_num_ex, 0, -1); ?> <div> <p id="prev"><?php previous_post_link('%link','&#8810; 前の記事',false,$categories_num_ex); ?></p>; <p id="next"><?php next_post_link('%link','次の記事 &#8811;',false,$categories_num_ex); ?></p>; </div> |
分岐の記述の必要もなくカテゴリー除外の自動化できました(`▽´)
「除外する」ではなく「(子孫を)含む」という指定ができれば良いんですけどね~(;´・ω・)
▼参考にさせていただきました。ありがとうございました。
この記事の投稿者
taka
Webサイト作ってます。
最近のモットー「決して無理をしないスタイル」
twitter: @taka_sbs