表題の通りです。
ワードプレスで記事の属するカテゴリーから特定のカテゴリーを除外したリンク付き一覧を作成する方法
ーーー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>' ;
}
}