2015
2
03

WordPressの検索ページを人気順などで並び替えるボタンをつける

カテゴリとタグのアーカイブページに日付順や閲覧数順の並び替えボタンを実装してあったのですが、検索ページにも追加したので方法をまとめてみました。


検索ページにも並び替えボタン

半年ほど前、このような記事を書いたのですが。

GET関数でどのボタンを押されたか判別してpre_get_posts()で並び替える(閲覧数はWP-PostViewsというプラグインを利用)、という。これが、アーカイブページなら

http://ateitexe.com/category/xxx/
 ↓
http://ateitexe.com/category/xxx/?sort=popular

このようにGET変数を付加して処理すればいけるな、という内容だったわけですが、検索ページだと

http://ateitexe.com/?s=キーワード

このようにもう既にGET変数がついているので、検索ページを並び替えたい場合は

http://ateitexe.com/?s=キーワード&sort=popular

という形にするためにもうちょっとテコ入れしないとうまくいかないなーということに気がついて、せっかくだからやってみようかな、と思ったわけです。

150203-1

このように、検索ページにも並び替えボタンがつきました。以下解説です。前記事からの派生という形で書いて行きますので、基本的な説明などは前記事と合わせて見ていってください。

先にpre_get_posts()のほうを

functions.php

並び替える条件に、$query->is_search()も追加しただけ。ほぼ前回のと一緒です。

コードの変更点

概要

前の記事では

このような形で書いたのですが、1行目で「アーカイブページのときに」という条件で括っているために、検索ページは10~12行目に別で書いています。ここにも並び替えボタンを実装したいので、この形では非効率ですよね。なので、

こういう形にしました。

詳細

ベースの形に肉付けして、こんな感じ。更にハイライト部分に書くボタンの記述を以下に説明していきます。

CSSは同じですので前の記事を参照してください。

並び替えボタンの実装

htmlのイメージ

例えば前回カテゴリアーカイブでは、このようなhtmlが出力されるようにPHPを書きました。

これがもし検索ページだった場合、

検索されたキーワードの情報も一緒に持たせます。更にaction=の遷移先をトップページにすることで、ボタンを押された時に

http://ateitexe.com/?s=キーワード&sort=newer

というURLに遷移することができます。

この形を目指して、カテゴリ・タグアーカイブの場合はこっち、検索ページのときはこっち、という分岐をさせてhtmlを出し分けるように、PHPを書いていきます。

コード

前回のコード(アーカイブページのみ)

「新しい順」に並び替えるボタンを例に、このように書いていました。

2,3行目で生成したURLを$url_strという変数に入れ、7行目の遷移先action=に指定してるので(詳細は前回の記事をご参照ください)、ここを分岐してやらなきゃいけないですね。

検索ページとアーカイブページで出し分け

検索ページの時はトップページURLを、それ以外(カテゴリ・タグアーカイブ)の場合は従来どおり生成したURLを、変数$url_strに入れます。これで遷移先が変化します。

後は12~14行目を追加で、検索ページのときだけ検索キーワードの情報を持たせます。検索文字列はthe_search_query()で表示することができます。

ただこの12~14行、これだけ見るぶんにはいいのですが、ボタンの数だけ同じことを書く羽目になるのでもうちょっと軽くしたいところ。

少コード化

検索ページだった場合のみ、4行目で予め文字列を入れておいて13行目で出力する、という形へ。出力コードの見た目を整えるためタブや改行も含めています。

あと、さっきはthe_search_query()を使っていましたが、ここでは出力せずに取得するので、get_search_query()を使っています。

テンプレートタグの出力と取得の違いについてはこちら

エスケープ処理のご注意

こちらにあるとおり、get_search_query()$escapedというパラメータがあり、カッコ内にtrueでエスケープ処理を行い、falseでエスケープ処理を行いません。空だと、デフォルトでtrueとされます。

エスケープ処理とは特殊文字を無害化することですが、とても簡単に言うとこれを行わないと危険なのです。

どのバージョンからget_search_query()にエスケープ処理がデフォルトで実装されたのか特定できなかったのですが、WordPressの過去のバージョンではこの関数にエスケープ処理がなされていなかった、という経緯があるようです。(2008年くらいまで…?)

お使いのWPのバージョンにはくれぐれもお気をつけて、自己責任でお願いいたします。

最終コード

それでは、今までの流れでボタンを4つつけて、それぞれの区切りに「|」を入れてみると、

このような感じに。16行目は「日付が新しい順」をデフォルトとする、という意味で書いていますので、こちらも前回の記事をご参照ください。

以上です! どなたかのご参考になれたら幸いですー!

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2015/02/03


6件のコメント

  • まきあやや
    2016年2月9日 10:26 AM

    「WordPressのアーカイブページを人気順などで並び替えるボタンをつける」に続いてこちらの検索も参考にさせて頂きました。
    でも、これを実行するとキーワードのヒット率というのでしょうか、それが全く無視され、単にキーワードが出現したページの「新規」「投稿」「人気ありなし」の順序で表示されるだけになってしまいました。
    できれば、検索結果の初期ページは「新規」「投稿」「人気ありなし」ではない、WordPress初期の検索結果が出るようになったら、もっと素敵かなと思います。
    よろしくお願いします。

    • *you
      2016年2月9日 11:39 AM

      まきあややさん、コメントありがとうございます。

      すみません、検索結果のデフォルトは日付の新しい順だと思ってました…! 調べてみたらWP3.7から「関連度」順になってたらしいですね! functions.phpのソート部分をこのハイライト部のように直してもらえれば、検索結果の初期画面はWPデフォルトの並び順になるはずです。

      ボタン部分の表示は、記事内の「最終コード」のハイライトされている16行目を

      こちらに差し替えれば、検索ページでデフォルトの場合はカレントが外れるようになります。こんな長いのをワンライナーで書くのはどうかと思いますが一応同じ形式で…(;´Д`)

      関連度、というのがイマイチピンとこないのでこのブログでは従来通り新しい日付順で並ぶようにしておりますが、用途によりますもんね。お試しください。

  • まきあやや
    2016年2月12日 10:05 AM

    *youさんへ

    わざわざコードを書いていただき、大変ありがとうございます。
    早速、「関連度順」というリンクを追加して使わして頂きました。

    • *you
      2016年2月13日 8:04 PM

      こちらこそお返事ありがとうございます! お役に立てましたら光栄です(●´ω`●)

  • tanaka
    2016年8月1日 12:19 PM

    *youさんはじめまして。tanakaと申します。

    現在wordpressの勉強をしており、絞り込み検索の実装をしております。

    http://kotori-blog.com/wordpress/refinement_search/
    のサイトを参考にカスタムフィールドで絞り込み検索を実装することはできたのですが、絞り込んだ検索結果をさらに価格の安い順・高い順などをこの記事のように並び替えボタンで並び替えたいと思っています。

    query_postsを削除しこちらの記事を参考に(全てコピペですが。笑)function.php(meta_valueはカスタムフィールドのキーに変更。)とsearch.phpを全くそのままの状態で書き加えたのですが、絞り込み検索はできてもさらに並び替えることができませんでした。

    どうすればカスタムフィールドで絞り込んだ検索結果をさらにカスタムフィールドの値で昇順降順のように並び替えることができるでしょうか?

    まだまだ知識不足ですので、何かアドバイスいただけると幸いです。

    よろしくお願いします。

    tanaka

    • *you
      2016年8月1日 5:04 PM

      tanakaさん、はじめまして。コメントありがとうございます。

      実際のコードと挙動を見てみないとなんとも言えないのですが、以下の形だと仮定して返信いたします。

      • カスタムフィールドの価格は、meta_keyがpriceという名称で格納されている
      • ソートに使うGET変数は、価格の高い順はhigher、低い順はlowerとする

      カスタムフィールドをキーワードにして、更にカスタムフィールドでソートするということなので、pre_get_postで価格の低い順を例にすると

      このような形にすれば良いんじゃないかなーと思います。きちんと検証したわけではないので確実性がなくて申し訳ないですが、ご参考になれば幸いです。

コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top