こんな感じですかねぇ。ちょっと力技ですが
add_filter( 'posts_join_request', function($join) {
global $wpdb;
$join .= " LEFT JOIN $wpdb->postmeta furigana ON $wpdb->posts.ID = furigana.post_id AND furigana.meta_key LIKE '%ふりがな%'";
return $join;
});
add_filter( 'posts_search_orderby', function($posts_search_orderby) {
$posts_search_orderby = 'furigana.meta_value ASC';
return $posts_search_orderby;
});
ややこしいと思いますが、KUCKLUさんはCustom fields searchを無効化した方が良い、私はしなくても良いと言う立場で書いています。
KUCKLUさん Takuro Hishikawaさん
有難うございます。
取り急ぎ、Takuro Hishikawaさんのコードを試してみました。
すると検索結果が出てくるようになりましたが、カスタムフィールド「ふりがな」の
並び替えは効いておりませんでした。
下記のような記述が書き出されております。
—
SELECT SQL_CALC_FOUND_ROWS DISTINCT wp_posts.ID FROM wp_posts JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id LEFT JOIN wp_postmeta furigana ON wp_posts.ID = furigana.post_id AND furigana.meta_key LIKE ‘%ふりがな%’ WHERE 1=1 AND (((wp_posts.post_title LIKE ‘%サービス業(他に分類されないもの)%’) OR (wp_posts.post_content LIKE ‘%サービス業(他に分類されないもの)%’))) AND wp_posts.post_type IN (‘post’, ‘page’, ‘attachment’) AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_author = 1 AND wp_posts.post_status = ‘private’) OR (wp_postmeta.meta_key IN (‘業種1’, ‘業種2’, ‘業種3’, ‘業種4’, ‘1.2.1’) AND wp_postmeta.meta_value LIKE ‘%サービス業(他に分類されないもの)%’ AND wp_posts.post_type IN (‘post’, ‘page’, ‘attachment’) AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_author = 1 AND wp_posts.post_status = ‘private’)) ORDER BY wp_posts.post_date DESC LIMIT 0, 200
—
query_postsは削除済み、pre_get_postsのコードも不要になったので削除済み、コードはテーマのfunctions.phpに記載、でよろしいですか?であれば、WordPressのバージョンが古いと思います。posts_search_orderbyフィルターが3.7以降の機能ですので、それ以前なのかも。
Takuro Hishikawaさん
ご指摘の通りWordPressのバージョン 3.5.2でした。
お客様制作による運用中のサイトであるため、バージョンアップは先方判断となってしまいます。
ご教授いただいておきながら申し訳ありません。
では、代わりにこちらで。
add_filter( 'posts_join_request', function($join) {
global $wpdb;
$join .= " LEFT JOIN $wpdb->postmeta furigana ON $wpdb->posts.ID = furigana.post_id AND furigana.meta_key LIKE '%ふりがな%'";
return $join;
});
add_filter( 'posts_orderby', function($posts_orderby) {
$posts_orderby = 'furigana.meta_value ASC, ' . $posts_orderby;
return $posts_orderby;
});
3.7以降、検索結果の表示順のロジックが変わりますので、そこでちょっと書き方が変わります。
Takuro Hishikawaさん
有難うございます!!!
思い通り、業種系のカスタムフィールドを検索しつつ、ふりがなのカスタムフィールドでソート
が実現できました。
本当に何度にもわたりご教授いただき有難うございます。
今回お教えいただいた内容を振り返り、勉強してまいります。
m(_ _)m
KUCKLUさん
後ほど、ご教授いただいた方法でも行ってみます。
今後のために、でいうと、業種はカスタムフィールドではなく、カスタムタクソノミーで登録した方が良かったでしょう。カスタムフィールドは基本的に設計として検索を想定されていませんので、このSQLは件数が増えるとパフォーマンス上のボトルネックになります。
Takuro Hishikawaさん
かしこまりました。最後まで有益な情報を有難うございます。
時間がある時にカスタムタクソノミーでの設計も試し、
うまくいけば本サイトに置き換えたいと思います。
本当に有難うございました。
KUCKLUさん
ご解答を有難うございました。
Custom fields search を無効化して、お教えいただいたコードを試したところ、
やはり下記のようなエラーの記述が表示され、検索結果の該当がなくなってしまいました。
ご指摘いただいたことを把握できぬままで申し訳ありません。
今回は「Takuro Hishikawaさん」で何とかなりましたので、
この度の皆様からのご教授を振り返り、検証してまいります。
本当に何度にもわたりご教授いただき有難うございます。
—
Warning: urldecode() expects parameter 1 to be string, array given in /home/kousei-jinken/www/wordpress/wp-includes/query.php on line 2354
—
またコメントは下記の通りです。
—
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (((wp_posts.post_title LIKE ‘%サービス業(他に分類されないもの)%’) OR (wp_posts.post_content LIKE ‘%サービス業(他に分類されないもの)%’))) AND wp_posts.post_type = ‘post’ AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘private’) ORDER BY wp_posts.post_date DESC LIMIT 0, 200
—