WordPress+Welcartで検索できなくなる問題

WordPressにWelcartプラグインをインストールしてECサイトとして動かしている環境で、急に検索が出来なくなってしまいました。wp-configほかWordPressの設定をいじったことはないし、子テーマを編集したぐらいで検索機能に影響があるとは思えず解決は難航を極めましたが、ローカル環境でソースコードを検索したところなんとか解決に至りました。そのメモ






表示されたエラー

WordPress データベースエラー: [COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'utf8mb4']
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND wp_posts.ID NOT IN (5,6) AND ( wp_term_relationships.term_taxonomy_id IN (2,3,4,5,10,12,13,14,15,16) )AND post_type = 'post' AND ( wp_posts.post_title COLLATE utf8_unicode_ci LIKE '%テスト%' OR wp_posts.post_content COLLATE utf8_unicode_ci LIKE '%テスト%' OR wp_posts.ID IN ( SELECT distinct post_id FROM wp_postmeta WHERE meta_value LIKE '%テスト%' ) ) AND ((wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')) OR (wp_posts.post_type = 'page' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')) OR (wp_posts.post_type = 'attachment' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private'))) GROUP BY wp_posts.ID ORDER BY wp_posts.post_title LIKE '%テスト%' DESC, wp_posts.post_date DESC LIMIT 0, 10



原因は「Friendly Functions for Welcart」プラグイン

Welcartの関連プラグインとして紹介されている「Friendly Functions for Welcart」。これに含まれる機能「検索結果の拡張」を「利用する」にすると、以下の処理が行われます。


$where = str_replace(".post_title", ".post_title COLLATE utf8_unicode_ci", $where);
$where = str_replace(".post_content", ".post_content COLLATE utf8_unicode_ci", $where);


検索クエリにCOLLATEを付与することで柔軟な検索が出来るようにしてくれるんですけど、そのCOLLATEが「utf8_unicode_ci」に決め打ちされちゃってるんですね。

エラー内容をもう一回振り返ってみると、


COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'utf8mb4'


となっていて、文字コードが「utf8mb4」なのに照合順序に「utf8_unicode_ci」を指定してるのは間違いといっているわけで……


これかーーーー


文字コードを確認してそれに応じて設定する照合順序を調整してくれれば良いのに、そこんとこ手を抜いてるのでこんなことになってるんですね。マジかよ、ふざけんな。



解決方法

「Friendly Functions for Welcart」プラグインをアンインストールするか、「検索結果の拡張」を「利用しない」にしましょう。



……あっさり書いてますけど、原因判明するまでにwp-configをあれこれ設定したり外したり、MySQLの照合順序を変えてみたり全部で3時間ぐらい掛かってます。まさかたったひとつのプラグインがこんな悪さすると思わんもんよ。



ちなみに:文字コードが「utf8mb4」になる環境は

WordPress4.2以降、MySQL5.5.3以上の環境では文字コードは「utf8mb4」になるようです。この環境では「Friendly Functions for Welcart」プラグインの「検索結果の拡張」を「利用する」にしてはいけません。つまり最近の環境ではまず間違いなく「utf8mb4」になるので、「Friendly Functions for Welcart」プラグインの「検索結果の拡張」機能は使ってはいけません。

このプラグインがリリースされたのは2021年4月だそうですが、その時既に文字コードは「utf8mb4」が主流になっていたはず。その状況でなんで決め打ちしようとしたのか謎です。「UTF-8」以外の文字コードが使われる可能性があるということに思い至らなかったんですかね。それもどうなのよ。