WordPress 検索にカスタムタクソノミーを含める方法
公開日
by
WordPress の検索にカスタムタクソノミーのカテゴリ名を含める方法を紹介します。
ここで紹介する方法は「WordPress 検索フォームの実装方法」で、ベースを作成していることを前提に解説しています。
検索にカスタムタクソノミーのカテゴリ名を含める方法
検索にカスタムタクソノミーのカテゴリ名を含める方法紹介します。
例えば、カスタム投稿タイプのブログ(スラッグ:blog)の各投稿のタイトルと本文(抜粋も含む)に、カスタムタクソノミーのカテゴリ(またはタグ)のカテゴリ名(例えば、お知らせやプレスリリース)の名称を検索範囲に含める場合、次のコードを search.php に追加します。
<?php
// 検索キーワードを取得
$search_query = get_search_query();
// データベースオブジェクトを取得
global $wpdb;
// 検索ワードを分割(スペース区切り対応)
$search_words = explode(' ', $search_query);
// SQL検索条件を作成
$search_sql = '';
if (!empty($search_words)) {
foreach ($search_words as $word) {
if (!empty($word)) {
$like_word = '%' . $wpdb->esc_like($word) . '%';
$search_sql .= $wpdb->prepare(
" AND (
{$wpdb->posts}.post_title LIKE %s
OR {$wpdb->posts}.post_content LIKE %s
OR {$wpdb->posts}.ID IN (
SELECT DISTINCT r.object_id
FROM {$wpdb->term_relationships} AS r
INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
WHERE (
tt.taxonomy = 'blog-tag'
AND (t.name LIKE %s OR t.slug LIKE %s OR tt.description LIKE %s)
)
)
)",
$like_word, $like_word, $like_word, $like_word, $like_word
);
}
}
}
// WP_Query用の引数を設定
$args = array(
'post_type' => 'blog', // 投稿タイプを「ブログ」に限定
's' => '', // デフォルトの検索を無効化
);
// フィルターを追加
add_filter('posts_where', function ($where) use ($search_sql) {
return $where . $search_sql;
});
// WP_Queryを実行
$custom_query = new WP_Query($args);
// 結果の出力
if ($custom_query->have_posts()) :
while ($custom_query->have_posts()) : $custom_query->the_post();
echo '<a href="'. get_the_permalink().'">'.get_the_title().'</a>';
endwhile;
// ページネーション
the_posts_pagination(array(
'total' => $custom_query->max_num_pages,
));
else :
echo '<p>該当する結果が見つかりませんでした。</p>';
endif;
// クエリをリセット
wp_reset_postdata();
// フィルターを削除
remove_filter('posts_where', '__return_null');
?>
カスタムタクソノミーのスラッグは「tt.taxonomy = ‘blog-tag’」の blog-tag を任意のスラッグに変更、
投稿タイプの指定は「’post_type’ => ‘blog’」の blog を任意のスラッグに変更してください。
ページネーションの有無などは適宜調整を加えてください。
まとめ
WordPress の検索にカスタムタクソノミーのカテゴリ名を含める方法を紹介しました。