こんにちは、プログラマーの山本です。
今回は「Wordpressの検索機能が正常に動いていないので改善してほしい」というご依頼をいただきました。
この記事ではこのご依頼に関して、以下のことをまとめました。
- お客様のWordpressにおいて検索機能が思い通りの動作をしていなかった理由
- WordPressの検索機能の仕様に関する解説
- 改善するために行ったコードの変更点(BeforeとAfter)
WordPressの検索機能が思い通りに動いていない方、自分好みにカスタマイズしたい方は参考になると思います。
目次
今回のご依頼内容
ご依頼内容の詳細をまとめると以下の2点になります。
- 依頼1.「楽器」で検索しても表示させたい記事が表示されないので改善してほしい。
- 依頼2.「楽器 ギター」で検索すると1記事も表示されないので改善してほしい。
単一キーワードで表示させたい記事が表示されない理由
内部のコードを確認したところ、
「検索結果が5件しか表示されないようになっており、
希望の記事が6件目以降に位置していたため、
記事はヒットしているのに結果に表示されない。」
という状況でした。
これは表示件数を増やしたり、無制限にすることで解決出来ます。
具体的な変更点は後ほどご紹介します。
複数キーワード(空白区切り)で検索して記事が1つも表示されない理由
WordPressの検索機能の仕様が、空白区切りではなくカンマ区切りであることが理由です。
つまり、
「楽器」と「ギター」両方のキーワードが含まれる記事を表示したい場合、Wordpressでは「楽器 ギター」で検索するのではなく、「楽器,ギター」で検索する必要があるのです。
検索ボックスに「複数キーワードで検索する時はカンマで区切ってください」のような注意書きを書いておくという解決策もありますが、あまりユーザビリティが良いとは言えないですね。
今回は、空白区切りでも複数キーワード検索が出来るように、空白区切りを自動でカンマ区切りに変更するコードを書いて対応しました。
こちらも具体的な変更点は後ほどご紹介します。
【補足】Wordpressの検索機能の仕様
WordPressの投稿はデータベースに格納されていて、検索機能はデータベースから指定した検索キーワードを含む投稿を抽出するという仕様になっています。
そして、Wordpressにはデータベースの扱いを簡単にするための方法が4つ存在します。
1.query_posts
2.pre_get_posts
3.WP_Query
4.get_posts
の4つです。
どの方法を使っているかはそのWordpressで使用しているテーマによります。
今回のお客様がお使いのテーマでは、query_posts が使用されていました。
この部分を編集することで、検索機能をカスタマイズすることができます。
検索機能カスタマイズの変更点
依頼1の改善方法:表示件数を無制限にする。
変更前(Before)
query_posts([
"s" => get_search_query(),
"post_type" => "post",
"orderby" => "date",
"post_status" => "publish",
"order" => "DESC"
]);
変更後(After)
query_posts([
"s" => get_search_query(),
"post_type" => "post",
"orderby" => "date",
"post_status" => "publish",
"order" => "DESC",
"posts_per_page" => -1
]);
posts_per_pageは表示件数を指定するパラメータです。
これが指定されていなかったため、Wordpressのデフォルト設定である5件になっていました。
これを変更することで表示数を変えることが出来ます。値を-1にすると検索にヒットした記事を全て表示することが出来ます。
今回はお客様のご希望で、全ての記事を表示するようにしました。
依頼2の改善方法:空白区切りをカンマ区切りに自動変換する。
変更前(Before)
query_posts([
"s" => get_search_query(),
"post_type" => "post",
"orderby" => "date",
"post_status" => "publish",
"order" => "DESC",
"posts_per_page" => -1
]);
変更後(After)
query_posts([
$keyword = preg_replace("/( | )/",",",get_search_query());
query_posts([
"s" => $keyword,
"post_type" => "post",
"orderby" => "date",
"post_status" => "publish",
"order" => "DESC",
"posts_per_page" => -1
]);
preg_replaceは正規表現を用いて文字列を置換することが出来ます。
1つ目の引数:正規表現
2つ目の引数:置換後の文字列
2つ目の引数:置換前の文字列
変更後のコードのように書くことで、検索キーワードの全半角スペースをカンマに置き換えることが出来ます。
その他:検索機能のカスタマイズ例
query_posts のパラメータを変更することで様々な検索に対応することが出来ます。
具体例を以下に挙げます。
catパラメータ → 値にカテゴリーIDを指定すると、そのカテゴリーの記事だけ表示される。
tagパラメータ → 値にタグのスラッグを指定すると、そのタグを持つ記事だけ表示される。
authorパラメータ → 値に投稿者IDを指定すると、その投稿者の記事だけ表示される。
orderbyパラメータ
・data → 日付順に検索結果を並べる
・category → カテゴリー順に検索結果を並べる
・title → タイトル順に検索結果を並べる
など、この他にも様々なカスタマイズが可能です。
カスタマイズの格安依頼を受付中
WordPressの検索について、思い通りの機能を実装できない場合は弊社におまかせください。
簡単なシステムなら、1件¥3,000(税別)から承っております。
相場よりも費用を抑えて対応させていただくことが可能ですので、
以下のフォームから相談内容を記入して気軽にご連絡ください。