- ベストアンサー
WordPressのWP_Query
WordPressのWP_Queryで、"meta_key"が"yomi"の"meta_value"で昇順にソートしているのですが、"yomi"がアルファベットや数字などで始まっている場合にかなよりも上に来ます。 'meta_key' => 'yomi', 'orderby' => 'meta_value', 'order' => 'ASC', これを、かな(カナ)→アルファベット→数字 のような順に取得するにはどうすればよいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>かなASC→アルファベットASC→数字ASC~の順番に ああハイハイ、言わんとしてる事が理解出来ました…が、凄く面倒なんで質問箱の範囲を超えてますね(笑)。これ以上は有償サポートでお願いします。 P.S. 普通に考えれば 'meta_key'=>'yomi' の値を基準として3回頭から取得し直し、その毎にカナ、英文字、数字の種類別に該当部分のみを抜き出して一時的なtmp配列に格納し、最後にそれを1つに繋ぎ合わせて最終的な出力用の配列オブジェクトに代入し直す感じでしょうか? う~ん、理屈は通りますが、WP自体のクエリ検索がそれほど高速では無いので。取得記事の総件数が万を超える場合は実際の結果が表示されるまで余裕で秒単位の遅延が発生すると思われ…自分的には止めた方が良いかなと思います。 もう少し手順を簡略化し高速化するため、最初の記事投稿時点でもう1つ「検索専用のMETAデータ値をもたせる」様にした方が現実的かつ、その後の汎用性も広がるかなと思います。具体的には「カスタムフィールド」と呼ばれる機能を使い、defaultデータ以外にもUser任意のオリジナルデータ値を個別記事毎にDBとして持たせる手法です。 update_post_meta( $post_id, 'my_search_tag', $meta_value ); ~こんな感じのWP関数を記事投稿時に自動実行させれば、いちいち手動でカスタムフィールド項目を入力する必要もありませんので。問題はどの様な値($meta_value)を記録させたら、その摩訶不思議な表示並びを実践出来る様な検索値を作れるのかという事になりますが…まあこれ以上はそちらで色々と考えてみてください。実際の記事データを持ってる人でないと、具体的なソート条件のイメージがつかめないので。 1つアドバイスをするのであれば、タイトル文字列をアスキーコード化して1度数値情報化してしまい、それを元に何らかのソート条件を1発で満たせる様に再加工してカスタムフィールドに保存し、一覧表示の際にはその値を元にソート順番を決定出来る様にすれば良いのかなと思います。WPに限らずこの手のプログラム的ソート手法というモノは原則として "1つの基準でしかソート出来ない" のが基本中の基本ですので。 そもそも例文の様なソート順を考えた事も無かったので、今までにやった事も無くテンプレも無いのでもやっと漠然としていますが…恐らくはタイトル文字列を一旦、PHPの標準関数である で「」してしまいその変換後の数値でおおまかにカテゴリ分けし、カテゴリ別に通常ソートでも簡単に処理可能な判別用の符号を半角英数記号で適当に付与、その後はそのまま文字列を結合しても良いですし、より詳細に厳密にソートしたければ「1文字目、2文字目、3文字目…」という風に判別用符号の数を増やして行けばイイんじゃないかと思います。 例えば、 - カナ文字 → "_1_" +"タイトル合戦!" - 英文字列 → "_2_" +"OKAWave is the best." - 数字記号 → "_3_" +"2019-02-15." ~上記の例に従い「判別記号用接頭文字列」を元のタイトル文字列の先頭に付与して前述のカスタムフィールド値として同時に保存して置けば、表示の際にはこの値(文字列)を用いてソートする事により、通常のソート条件(ASC)であっても自動的にカテゴリ別に大まかに並び順が決定し、カテゴリ内での細かいソート順番は通常通りの 'ASC' に従う事になります。
その他の回答 (1)
- 4017B
- ベストアンサー率73% (1336/1814)
例文の… 'meta_key'=>'yomi', 'orderby'=>'meta_value', 'order'=>'ASC' ~の設定値で「数字、アルファベット、かな」の並び順なのであれば、単純にその逆の並び順に指定すれば良いのでは?つまり、 'order'=>'DESC' ~を指定してやれば 'order'=>'ASC' の時とは逆の順番になります。
補足
ご回答ありがとうございます。 それですと、かなの中でのソート順も逆(あいうえお順→おえういあ順)になるかと思うのですが、私の希望としては かなASC → アルファベットASC → 数字ASC の順に取得したいです。