サポート » 使い方全般 » 検索結果をカスタムフィールド「ふりがな」毎に並べたい

  • 解決済 atikuti

    (@atikuti)


    プラグイン「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() ?>

    どのようにすれば、検索結果をカスタムフィールド「ふりがな」でソート出来るのでしょうか?
    どなたかご教授ください。
    どうぞよろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全25件中)
  • こんにちわ、atikuti さん。

    こちらの資料が解決の糸口になると思います。

    query_postsを捨てよ、pre_get_postsを使おう
    http://notnil-creative.com/blog/archives/1688
    関数リファレンス/WP Query | WordPress Codex 日本語版
    http://goo.gl/r4xWl

    トピック投稿者 atikuti

    (@atikuti)

    KUCKLUさん、早速ご教授有難うございます。
    教えていただいたサイトを参考に下記のようなコードで試してみているのですが、
    検索結果には影響されません。
    いろいろ試してみたのですが、原因が分かりません。
    もしよろしければ、ご教授いただけないでしょうか。

    —-
    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’ );
    —-

    モデレーター gatespace

    (@gatespace)

    return しなければダメですよ。

    if ( $query->is_search() ) {
        $query->set( 'meta_key', 'ふりがな' );
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'ASC' );
        return; // ここ大事!
    }

    KUCKLUさんの提示されたリンク先のコードと見比べてみましょう

    トピック投稿者 atikuti

    (@atikuti)

    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 は、関数の最後なので、あってもなくても動作に変化がないのが正常動作です。

    トピック投稿者 atikuti

    (@atikuti)

    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' );

    トピック投稿者 atikuti

    (@atikuti)

    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

    モデレーター Takuro Hishikawa

    (@hissy)

    私のブログ記事が出ていたのでやってきました。私のところではとりあえずこれで動いていますけども。

    <?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' );
    モデレーター Takuro Hishikawa

    (@hissy)

    データベースエラーは出ますね。出ていないと言うことが、functions.phpに記述した内容が動いていないことの証左です。ちなみに、ありがちなのですが、wp-include/functions.phpに書いてしまうと言うミスです。

    トピック投稿者 atikuti

    (@atikuti)

    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");
    ?>

    モデレーター Takuro Hishikawa

    (@hissy)

    > ページ内の下記の記述が問題あるのでしょうか。

    関係してそうですね。削除してください。query_postsは使わず、pre_get_postsのみで完結させるのが安全策です

    トピック投稿者 atikuti

    (@atikuti)

    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 というプラグインであればエラーがなく動く事を確認しています。

    モデレーター Takuro Hishikawa

    (@hissy)

    あー、なるほど。業種系のカスタムフィールドを検索しつつ、ふりがなのカスタムフィールドでソートしたいと言うことですか。それは、meta_queryでは無理ですねぇ。さてどうしたものか。ちょっと考えます。

15件の返信を表示中 - 1 - 15件目 (全25件中)
  • トピック「検索結果をカスタムフィールド「ふりがな」毎に並べたい」には新たに返信することはできません。