WordPress  
  ワードプレスで記事が所属するカテゴリーから特定のカテゴリーを除外したリンク付き一覧を作成する方法
2019
20
Jan

ワードプレスで記事が所属するカテゴリーから特定のカテゴリーを除外したリンク付き一覧を作成する方法

最終更新日: 2021年6月9日

表題の通りです。

ワードプレスで記事の属するカテゴリーから特定のカテゴリーを除外したリンク付き一覧を作成する方法

ーーーsql がわからない方は飛ばし読みしましょうーーー
今回の場合は表示する方のカテゴリーが少なかったのでINを使いました。除外するカテゴリーの方が少なければNOT IN を使います。副問い合わせをする場合はNOT INには注意が必要です。代わりにNOT EXISTの使用を検討します。

sql


$sql = "
	SELECT DISTINCT terms.name,terms.term_id
	FROM $wpdb->posts as posts
	JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
	JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
	JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
	WHERE posts.ID = %d AND tax.taxonomy = 'category' AND terms.term_id IN(5, 6, 7, 8)
	ORDER BY terms.term_id ASC
";
$categories = $wpdb->get_results($wpdb->prepare($sql, $post->ID));

カテゴリーリンク一覧


foreach ( $categories as $cat ){
	echo '<a href="'.get_category_link( $cat->term_id ).'">'.$cat->name.'</a>' ;
}

 

記事の属するカテゴリー一覧には the_catrgory() または get_the_category() を使いますが、特定のカテゴリーを除外するパラメーターは用意されていません。

以下は全体のカテゴリー一覧であり記事の属するカテゴリー一覧では使えません。


$args = array(
	'exclude' => '', //ここに除外したいカテゴリーのIDをカンマ区切りで入れる。
);
wp_list_categories( $args );

 

同じテーマで別サイトを作る場合などid で指定してしまうと何らかの手違いで id が変わってしまうかも知れません。

除外するカテゴリーを id ではなくslug で指定するとでこのような面倒にも巻き込まれなくて済みます。

以下のように書き換えます。


//WHERE posts.ID = %d AND tax.taxonomy = 'category' AND terms.term_id IN(5, 6, 7, 8)
WHERE posts.ID = %d AND tax.taxonomy = 'category' AND terms.slug IN(スラッグ, スラッグ, スラッグ, スラッグ)

 

get_the_category()を使って特定のカテゴリーを除外する方法

ワードプレスのデータベース構造が将来変更されても大丈夫なように関数を使う方法です。


//除外したいカテゴリーのスラッグを配列に
$slugs = array('apple', 'orange', 'tomato');
//'apple', 'orange', 'tomato'の部分は状況に合わせて書き換えてください。

//カテゴリーのオブジェクトの配列を取得します。
$categories = get_the_categories(); 

foreach($categories as $cat){
  //除外したいカテゴリーを確認しながらそれ以外のカテゴリーを出力
  if(in_array($cat -> category_nicename, $slugs, true)){
    return;
  }else{
    echo '<a href="'.get_category_link( $cat->term_id ).'">'.$cat->name.'</a>' ;
  }
}

 

top