WordPressの検索機能に条件を追加したいんだけどどうすればいいんだろう……
今回はこうしたお悩みをお持ちの方へ向けて
WordPressの検索機能の条件に
タグ・カテゴリー・カスタムフィールドを追加する方法
をご紹介します。
WordPressの検索機能はデフォルトだと「タイトル」と「本文」しか検索対象になっていません。
しかし、この記事をご覧いただくことでタグ・カテゴリー・カスタムフィールドも検索対象にする方法やそのソースコードがわかります。
- 検索機能に「タグ」、「カテゴリー」、「カスタムフィールド」を追加する方法
- すべてではなく「特定のカスタムフィールド」のみ検索条件として追加する方法
また、タグやカテゴリーの名前だけでなく、タグ・カテゴリーの「スラッグ」や「説明」を検索条件に追加する方法もあわせてご紹介します。
プラグイン「SEO SIMPLE PACK」の設定情報を含める方法は以下の記事でご紹介しています。
ソースコード
以下よりご紹介するソースコードをfunctions.phpに追加するだけで検索機能に各条件を含めることが可能です。
「タグ名」、「カテゴリー名」を検索条件に追加
/**
* サイト内検索のカスタマイズ
*/
function custom_search( $search, $wp_query ) {
global $wpdb;
//検索ページ以外だったら終了
if ( ! $wp_query->is_search )
return $search;
// 検索キーワードが未入力ならデフォルトの検索機能を呼び出す
if ( ! isset( $wp_query->query_vars ) )
return $search;
// タグ名・カテゴリ名も検索対象にする
$search_words = explode( ' ', isset( $wp_query->query_vars['s'] ) ? $wp_query->query_vars['s'] : '' );
if ( count( $search_words ) > 0 ) {
$search = '';
foreach ( $search_words as $word ) {
if ( ! empty( $word ) ) {
$search_word = $wpdb->prepare( "%{$word}%" );
$search .= " AND (
-- 投稿タイトル
{$wpdb->posts}.post_title LIKE '{$search_word}'
-- 投稿コンテンツ
OR {$wpdb->posts}.post_content LIKE '{$search_word}'
-- タグ・カテゴリー名
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 t.name LIKE '{$search_word}'
)
) ";
}
}
}
return $search;
}
add_filter( 'posts_search','custom_search', 10, 2 );
タグ・カテゴリーの「スラッグ」や「説明」を検索条件に追加
ハイライト行が追加されています。
/**
* サイト内検索のカスタマイズ
*/
function custom_search( $search, $wp_query ) {
global $wpdb;
//検索ページ以外だったら終了
if ( ! $wp_query->is_search )
return $search;
// 検索キーワードが未入力ならデフォルトの検索機能を呼び出す
if ( ! isset( $wp_query->query_vars ) )
return $search;
// タグ名・カテゴリ名やタグ・カテゴリーの「スラッグ」、「説明」も検索対象にする
$search_words = explode( ' ', isset( $wp_query->query_vars['s'] ) ? $wp_query->query_vars['s'] : '' );
if ( count( $search_words ) > 0 ) {
$search = '';
foreach ( $search_words as $word ) {
if ( ! empty( $word ) ) {
$search_word = $wpdb->prepare( "%{$word}%" );
$search .= " AND (
-- 投稿タイトル
{$wpdb->posts}.post_title LIKE '{$search_word}'
-- 投稿コンテンツ
OR {$wpdb->posts}.post_content LIKE '{$search_word}'
-- 「タグ・カテゴリー名」と「タグ・カテゴリー説明欄」
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 t.name LIKE '{$search_word}'
-- タグ・カテゴリースラッグ
OR t.slug LIKE '{$search_word}'
-- デフォルト項目の「説明」
OR tt.description LIKE '{$search_word}'
)
) ";
}
}
}
return $search;
}
add_filter( 'posts_search','custom_search', 10, 2 );
「すべてのカスタムフィールド」を検索条件に追加
ハイライト行が追加されています。
/**
* サイト内検索のカスタマイズ
*/
function custom_search( $search, $wp_query ) {
global $wpdb;
//検索ページ以外だったら終了
if ( ! $wp_query->is_search )
return $search;
// 検索キーワードが未入力ならデフォルトの検索機能を呼び出す
if ( ! isset( $wp_query->query_vars ) )
return $search;
// タグ名・カテゴリ名・カスタムフィールド「説明」も検索対象にする
$search_words = explode( ' ', isset( $wp_query->query_vars['s'] ) ? $wp_query->query_vars['s'] : '' );
if ( count( $search_words ) > 0 ) {
$search = '';
foreach ( $search_words as $word ) {
if ( ! empty( $word ) ) {
$search_word = $wpdb->prepare( "%{$word}%" );
$search .= " AND (
-- 投稿タイトル
{$wpdb->posts}.post_title LIKE '{$search_word}'
-- 投稿コンテンツ
OR {$wpdb->posts}.post_content LIKE '{$search_word}'
-- 「タグ・カテゴリー名」と「タグ・カテゴリー説明欄」
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 t.name LIKE '{$search_word}'
-- タグ・カテゴリースラッグ
OR t.slug LIKE '{$search_word}'
-- デフォルト項目の「説明」
OR tt.description LIKE '{$search_word}'
)
-- すべてのカスタムフィールド
OR {$wpdb->posts}.ID IN (
SELECT distinct post_id
FROM {$wpdb->postmeta}
WHERE meta_value LIKE '{$search_word}'
)
) ";
}
}
}
return $search;
}
add_filter( 'posts_search','custom_search', 10, 2 );
「特定のカスタムフィールド」を検索条件に追加
ハイライト行が追加されています。
/**
* サイト内検索のカスタマイズ
*/
function custom_search( $search, $wp_query ) {
global $wpdb;
//検索ページ以外だったら終了
if ( ! $wp_query->is_search )
return $search;
// 検索キーワードが未入力ならデフォルトの検索機能を呼び出す
if ( ! isset( $wp_query->query_vars ) )
return $search;
// タグ名・カテゴリ名・カスタムフィールド「説明」も検索対象にする
$search_words = explode( ' ', isset( $wp_query->query_vars['s'] ) ? $wp_query->query_vars['s'] : '' );
if ( count( $search_words ) > 0 ) {
$search = '';
foreach ( $search_words as $word ) {
if ( ! empty( $word ) ) {
$search_word = $wpdb->prepare( "%{$word}%" );
$search .= " AND (
-- 投稿タイトル
{$wpdb->posts}.post_title LIKE '{$search_word}'
-- 投稿コンテンツ
OR {$wpdb->posts}.post_content LIKE '{$search_word}'
-- 「タグ・カテゴリー名」と「タグ・カテゴリー説明欄」
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 t.name LIKE '{$search_word}'
-- タグ・カテゴリースラッグ
OR t.slug LIKE '{$search_word}'
-- デフォルト項目の「説明」
OR tt.description LIKE '{$search_word}'
)
-- カスタムフィールド
OR {$wpdb->posts}.ID IN (
SELECT distinct post_id
FROM {$wpdb->postmeta}
WHERE meta_value LIKE '{$search_word}'
-- カスタムフィールド「my_custom_key01」と「my_custom_key02」
AND meta_key IN ( 'my_custom_key01', 'my_custom_key02' )
)
) ";
}
}
}
return $search;
}
add_filter( 'posts_search','custom_search', 10, 2 );
「特定のカスタムフィールド」を条件にするときは、以下のように配列形式でカスタムフィールドの「キー名」を指定します。
meta_key IN ( ‘my_custom_key01‘, ‘my_custom_key02‘ )
プラグイン「Advanced Custom Fields」を使用している場合は
フィールド名が「キー名」に該当します。
まとめ
以上がWordPressの検索機能の条件にタグ・カテゴリー・カスタムフィールドを追加する方法でした。
ご覧いただくとお分かりのように、デフォルトの検索機能をカスタマイズするためにはWordPressのデータベース構造を理解した上でSQL文を組み立てる必要があります。
逆に言えば、SQLをある程度知っていてWordPressのデータベース構造も理解できれば検索機能の複雑なカスタマイズも可能になるということでもあります。
(そこのハードルがそれなりに高いのではないかと思いますが……)
僕も最初はWordPressのデータベースとphpMyAdmin経由でにらめっこしたり、あれこれ試行錯誤することで少しずつ理解を進めることができました。
この記事が読者の方にとっての学習のきっかけや、その一助になったなら幸いです。
それでは、最後までご覧いただきありがとうございました!
今回参考になった書籍
コメント