こんなこと、ありませんか?開発者あるある
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先生に教えを乞う日々です。
少しでも皆さんのスキルアップに貢献できれば幸いです!