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

  • 解決済 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() ?>

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

10件の返信を表示中 - 16 - 25件目 (全25件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    こんな感じですかねぇ。ちょっと力技ですが

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

    (@hissy)

    ややこしいと思いますが、KUCKLUさんはCustom fields searchを無効化した方が良い、私はしなくても良いと言う立場で書いています。

    トピック投稿者 atikuti

    (@atikuti)

    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

    モデレーター Takuro Hishikawa

    (@hissy)

    query_postsは削除済み、pre_get_postsのコードも不要になったので削除済み、コードはテーマのfunctions.phpに記載、でよろしいですか?であれば、WordPressのバージョンが古いと思います。posts_search_orderbyフィルターが3.7以降の機能ですので、それ以前なのかも。

    トピック投稿者 atikuti

    (@atikuti)

    Takuro Hishikawaさん
    ご指摘の通りWordPressのバージョン 3.5.2でした。
    お客様制作による運用中のサイトであるため、バージョンアップは先方判断となってしまいます。
    ご教授いただいておきながら申し訳ありません。

    モデレーター Takuro Hishikawa

    (@hissy)

    では、代わりにこちらで。

    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以降、検索結果の表示順のロジックが変わりますので、そこでちょっと書き方が変わります。

    トピック投稿者 atikuti

    (@atikuti)

    Takuro Hishikawaさん
    有難うございます!!!
    思い通り、業種系のカスタムフィールドを検索しつつ、ふりがなのカスタムフィールドでソート
    が実現できました。
    本当に何度にもわたりご教授いただき有難うございます。
    今回お教えいただいた内容を振り返り、勉強してまいります。
    m(_ _)m

    KUCKLUさん
    後ほど、ご教授いただいた方法でも行ってみます。

    モデレーター Takuro Hishikawa

    (@hissy)

    今後のために、でいうと、業種はカスタムフィールドではなく、カスタムタクソノミーで登録した方が良かったでしょう。カスタムフィールドは基本的に設計として検索を想定されていませんので、このSQLは件数が増えるとパフォーマンス上のボトルネックになります。

    トピック投稿者 atikuti

    (@atikuti)

    Takuro Hishikawaさん
    かしこまりました。最後まで有益な情報を有難うございます。
    時間がある時にカスタムタクソノミーでの設計も試し、
    うまくいけば本サイトに置き換えたいと思います。
    本当に有難うございました。

    トピック投稿者 atikuti

    (@atikuti)

    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

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