development_creative

この記事は1年以上経過しています。

【WordPress】wp_queryで特定のカテゴリーをslug名で除外したい・・・!

こんなこと、ありませんか?開発者あるある

WordPressのwp_queryを使用して、データベースに登録した情報を呼び出すことってありますよね。
今回は、特定のカテゴリーのみを除外するコードです。

検索すると、カテゴリーのIDで除外する方法が一般的な方法として出てきます。
しかしながら、wordpressテーマを自作している方はわかるかもしれないのですが、
開発環境(local環境)と、本番環境、さらにはテスト環境で、
カテゴリータグのIDがそれぞれ違うってことないでしょうか?

IDでの指定は非常に限定的かつ明確ですので、十分理解できるのですが、
環境ごとにIDを変えねばならないのは面倒すぎます・・。

そこで、スラッグ名で指定して除外するコードを作成しました。

// press記事を除外するためにIDをスラッグから取得する
$exclude_category_slug = 'press';

// カテゴリーのスラッグからカテゴリーのIDを取得
$exclude_category = get_term_by('slug', $exclude_category_slug, 'category');

// カテゴリーが存在する場合、IDを配列に追加
if ($exclude_category) {
    $exclude_category_id = $exclude_category->term_id;
} else {
    $exclude_category_id = 0;
}

/* ループによる投稿取得(新着記事) */
$args = [
    'post_type' => 'post',  // すべての記事
    'category__not_in' => array($exclude_category_id),
    'order' => 'DESC',  // 降順
    'orderby' => 'date',  // ソート条件を日付
    'posts_per_page' => 6,  // 1ページ内の記事数
    'ignore_sticky_posts' => 1, //先頭固定の記事は除外
];
$newPosts = new WP_Query($args);

今回はスラッグ名「press」を除外するケースで想定しています。

理屈や解説など・・・

理屈としては、get_term_by(‘slug’, $exclude_category_slug, ‘category’);の部分で、
変数$exclude_category_slugに、除外したいスラッグ名が入るようになっています。

get_term_by関数でスラッグ「press」に関しての情報をデータベースから引っ張ってきてる感じですね。

配列形式で「press」に関する情報を引っ張ってきています。
その中に’slug’という項目があるので、そちらだけを抽出している形になります。

get_term_by関数の基本形

get_term_by()関数は、指定した条件に合致する最初のタームを返します。
もし該当するタームが見つからない場合、falseを返します。

$term = get_term_by( $field, $value, $taxonomy );
  • $fieldは、タームを検索するためのフィールドを指定します。
    例えば、ターム名を使用する場合は ‘name’ を指定します。他にも ‘slug’(スラッグ)、’id’(ID)などが使えます。
  • $valueは、指定したフィールドの値を指定します。
    例えば、$fieldが ‘name’であれば、$valueにはタームの名前を指定します。
  • $taxonomyは、タームが属するタクソノミー(カテゴリーまたはタグなど)を指定します。

あとがき

皆さんもwordpressの案件を結構受けているかもしれませんが、
カスタマイズしようと思えば、果てしなくできてしまいますよね。

私も大変刺激的なクライアントに恵まれておりまして、
日々日々調べ、ChatGPT先生に教えを乞う日々です。

少しでも皆さんのスキルアップに貢献できれば幸いです!

Related ariticle

関連記事

TOP