検索結果をカスタムフィールド「ふりがな」毎に並べたい
-
プラグイン「Custom fields search」にてカスタムフィールドを検索対象にしています。
その検索結果をカスタムフィールド「ふりがな」毎に並べたいのですがうまくいきません。search.phpにて下記で受けると検索が効いています。
—
<?php if(have_posts()) : ?>
<?php while(have_posts()):the_post() ?>
—しかしその検索結果をカスタムフィールド「ふりがな」毎に並べたいので、
下記のコードにすると全ての記事が出てきてしまいます。
—
<?php if(have_posts()) : ?>
<?php query_posts(“&orderby=meta_value&meta_key=ふりがな&order=ASC”); ?>
<?php while(have_posts()):the_post() ?>
—どのようにすれば、検索結果をカスタムフィールド「ふりがな」でソート出来るのでしょうか?
どなたかご教授ください。
どうぞよろしくお願いいたします。
-
こんにちわ、atikuti さん。
こちらの資料が解決の糸口になると思います。
query_postsを捨てよ、pre_get_postsを使おう
http://notnil-creative.com/blog/archives/1688
関数リファレンス/WP Query | WordPress Codex 日本語版
http://goo.gl/r4xWlKUCKLUさん、早速ご教授有難うございます。
教えていただいたサイトを参考に下記のようなコードで試してみているのですが、
検索結果には影響されません。
いろいろ試してみたのですが、原因が分かりません。
もしよろしければ、ご教授いただけないでしょうか。—-
function customize_main_query($query) {
if ( is_admin() || ! $query->is_main_query() )
return;if ( $query->is_search() ) {
$query->set( ‘meta_key’, ‘ふりがな’ );
$query->set( ‘orderby’, ‘meta_value’ );
$query->set( ‘order’, ‘ASC’ );
}
}
add_action( ‘pre_get_posts’, ‘customize_main_query’ );
—-return しなければダメですよ。
if ( $query->is_search() ) { $query->set( 'meta_key', 'ふりがな' ); $query->set( 'orderby', 'meta_value' ); $query->set( 'order', 'ASC' ); return; // ここ大事! }
KUCKLUさんの提示されたリンク先のコードと見比べてみましょう
gatespaceさん
早速のご教授有難うございます。
お教えいただいたように下記のように「return;」を追記したのですが、
結果は変わらず、検索結果には影響されませんでした。—-
function customize_main_query($query) {
if ( is_admin() || ! $query->is_main_query() )
return;if ( $query->is_search() ) {
$query->set( ‘meta_key’, ‘ふりがな’ );
$query->set( ‘orderby’, ‘meta_value’ );
$query->set( ‘order’, ‘ASC’ );
return;
}
}
add_action( ‘pre_get_posts’, ‘customize_main_query’ );
—-Custom fields search をちょっと覗いてみましたが、WordPress の API を使わず、直接 $wp_query に変更を加えています。実際の出力を見ないとわからないところがあるので、search.php の冒頭に下記のコードを加えて、その出力を投稿していただけますか? 何かわかるかもしれません。
global $wp_query; echo $wp_query->request;
なお、pre_get_posts にフックした関数で使われる return は、そこで関数の実行を止めて、制御を呼び出し元に戻す、という意味しかありません。ですから、この場合、最初の return には意味がありますが、二つ目の return は、関数の最後なので、あってもなくても動作に変化がないのが正常動作です。
kjmtshさん
早速ご教授いただいたコードを入れてみました。
すると下記のような記述が書き出されました。
KUCKLUさんからご教授いただいたコードは「functions.php」に記述しているのですが、
ソートは効いていないようです。
どなたか下記の記述から、フィールド「ふりがな」でソートする記述を
ご教授いただけないでしょうか。
どうぞよろしくお願いいたします。—
SELECT SQL_CALC_FOUND_ROWS DISTINCT wp_posts.ID FROM wp_posts JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 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’) OR (wp_postmeta.meta_key IN (‘業種1’, ‘業種2’, ‘業種3’, ‘業種4’, ‘1.2.1’) AND wp_postmeta.meta_value 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
—Custom fields search にしていると、Database エラー出ていませんか?
Custom fields search を無効化してみてください。
無効化後、以下のどちらかお好みの方でお試しください。■ カスタムフィールドの値でソートするだけ
function customize_main_query( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_search() ) { $query->set( 'meta_key', 'ひらがな' ); $query->set( 'orderby', array( 'meta_value' => 'ASC' ) ); return; } } add_action( 'pre_get_posts', 'customize_main_query' );
■ カスタムフィールドの値が「あ 〜 ん」のいずれかが設定されているものだけ
function customize_main_query( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_search() ) { $query->set( 'meta_query', array( array( 'key' => 'ひらがな', 'value' => array( 'あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', 'ゆ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'を', 'ん' ), 'compare' => 'IN', 'type' => 'CHAR' ) ) ); $query->set( 'orderby', array( 'meta_value' => 'ASC' ) ); return; } } add_action( 'pre_get_posts', 'customize_main_query' );
KUCKLUさん
ご解答を有難うございます。
Custom fields search で特にDatabase エラーはでていません。
Custom fields search を無効化して、お教えいただいたコードを試したところ、
下記のような記述が表示され、検索結果の該当がなくなってしまいました。
—
Warning: urldecode() expects parameter 1 to be string, array given in /home/kousei-jinken/www/wordpress/wp-includes/query.php on line 2354
—私のブログ記事が出ていたのでやってきました。私のところではとりあえずこれで動いていますけども。
<?php /* Plugin Name: 検索結果をカスタムフィールド「ふりがな」毎に並べたい */ function forum146224_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_search() ) { remove_filter( 'posts_join', 'cstmfldssrch_join' ); // DBエラー防止(重複JOINの除去) $query->set( 'meta_key', 'ふりがな' ); $query->set( 'orderby', 'meta_value' ); $query->set( 'order', 'DESC' ); return; } } add_action( 'pre_get_posts', 'forum146224_pre_get_posts' );
データベースエラーは出ますね。出ていないと言うことが、functions.phpに記述した内容が動いていないことの証左です。ちなみに、ありがちなのですが、wp-include/functions.phpに書いてしまうと言うミスです。
Takuro Hishikawaさん
ご教授を有難うございます。
functions.phpに関しましては、管理画面より「テーマのための関数 (functions.php)」に
記述しております。
いただきましたコードを記入したところ、検索結果の該当がなくなってしまいました。
—
SELECT SQL_CALC_FOUND_ROWS DISTINCT 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’) OR (wp_postmeta.meta_key IN (‘業種1’, ‘業種2’, ‘業種3’, ‘業種4’, ‘1.2.1’) AND wp_postmeta.meta_value 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
—いただいたコードより「remove_filter( ‘posts_join’, ‘cstmfldssrch_join’ ); // DBエラー防止(重複JOINの除去)」を削除しますと検索結果は表示されますが、並び替えは行われておりません。
—
SELECT SQL_CALC_FOUND_ROWS DISTINCT wp_posts.ID FROM wp_posts JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 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’) OR (wp_postmeta.meta_key IN (‘業種1’, ‘業種2’, ‘業種3’, ‘業種4’, ‘1.2.1’) AND wp_postmeta.meta_value 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
—ページ内の下記の記述が問題あるのでしょうか。
ちなみに データベース バージョン: MySQL 5.5 です。<?php global $query_string; query_posts($query_string . "&post_type=post"); ?>
> ページ内の下記の記述が問題あるのでしょうか。
関係してそうですね。削除してください。query_postsは使わず、pre_get_postsのみで完結させるのが安全策です
Takuro Hishikawaさん
早速のご返信をありがとうございます。
「query_posts」部分を削除しまし、いただいたコードで試したところ、
検索結果の該当がなくなってしまいました。—
SELECT SQL_CALC_FOUND_ROWS DISTINCT wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 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’) AND (wp_postmeta.meta_key = ‘ふりがな’ ) 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’) AND (wp_postmeta.meta_key = ‘ふりがな’ )) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 200
—Custom fields search を無効化してみてください。
Custom fields search を有効化していると join 周りでエラーが出ている筈です。
( たぶん、エラーログに記録されれていると思います。)
Custom fields search を有効化しなくても、pre_get_posts でカスタムフィールドを強制的に指定しているので大丈夫です。
また、他の投稿で カスタムフィールドを検索対象にしなければないのであれば、Search Everything というプラグインであればエラーがなく動く事を確認しています。あー、なるほど。業種系のカスタムフィールドを検索しつつ、ふりがなのカスタムフィールドでソートしたいと言うことですか。それは、meta_queryでは無理ですねぇ。さてどうしたものか。ちょっと考えます。
- トピック「検索結果をカスタムフィールド「ふりがな」毎に並べたい」には新たに返信することはできません。