質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

カスタムフィールドを使った第2ソートがうまくいかない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 982

score 13

WordPress 5.2.1を使用しています。

やりたいこと

WP_QUERYでカスタムフィールド2つの値を使って第1、第2ソートを指定して並び替える。

name, title, year の3つがカスタムフィールドで、それぞれの記事がこのような具合です。

投稿タイトル name kana year
ABC ICHIRO いちろう 1982
TTT ICHIRO いちろう 1983
BBB JIRO じろう 1984
GGG SABURO さぶろう 1994
AAA SABURO さぶろう 1983

問題点

第1、第2ソートとも基準がカスタムフィールドである場合、ソートがうまくいきません。

うまくいくパターン(カスタムフィールドが一方のみ)
第1:投稿タイトル  第2name1name   第2:投稿タイトル

うまくいかないパターン(カスタムフィールドを1つ使用)
第1year     第2name ←うまくいかない
第1name     第2:kana ←うまくいかない
第1:kana     第2:year ←うまくいかない

やってみたこと

とりあえず、それぞれ一つだけを基準にソートしてみたのですが、うまくいったので入力データ自体は大丈夫かと思います。

↓1つだけのソートは問題なし

//投稿タイトルでソート
$param = array(
    'post_type' => array('post'),
    'orderby' => 'title',
    'order' => 'ASC',
);

//カスタムフィールドでソート
$param = array(
    'post_type' => array('post'),
    'orderby' => 'meta_value',
    'meta_key' => 'name',  //kana, yearもうまくいく
    'order' => 'DESC',
);

どちらかのみカスタムフィールドの場合も第2ソートも問題なく反映できました。
↓カスタムフィールドがどちらか一方でも問題なし

$param = array(
    'post_type' => array('post'),
    'orderby' => array('name' => 'ASC' , 'title'=>'ASC' ),
    'meta_key' => 'name'
);

↓うまくいかないです

カスタムフィールド2つの場合、うまくいかないです。

$param = array(
    'post_type' => array('post'),
    'orderby' => array('name' => 'ASC' , 'year'=>'DESC' ),
    'meta_query' => array(
        array(
            'key' => 'name',
        ),
        array(
            'key' => 'year',
        )
    )
);

そもそも条件2つともカスタムフィールドのやり方がよくわからくて、色々と調べて試行錯誤したのですが、よくわかりませんでした。

参考にした記事

1.関数リファレンス/WP Query
2.WordPress4.0から使えるようになった複雑な’oderby’を使ってみる
3.wordpress カスタムフィールドの値でソート(複数項目)


そもそも
● カスタムフィールドが複数の場合、従来使っていた'meta_key'には何かいれなければならないのか

● 'meta_query'を上記のような使い方であっているのか(meta_keyを入れない代わりに使用?)
● サイトによっては 指定キー名に「meta_」とつけているものもあり、仕様がわからない。こちらもためしてみたが、うまくいかず。。

等いまいちわからないことだらけでした。


どなたか詳しい方、ご教示&やり方を教えていただけますと幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

お騒がせ致しました。自己解決できました。

↓下記サイトに載っている一番下のコードを変更することで解決できました。
WordPress Development Stack Exchange

//第1ソートを「name」、第2ソートを「year」にした例
$param = array(
    'post_type' => array('post'),
    'meta_query' => array(
        'relation' => 'AND',
        'N' => array(
            'key' => 'name'
        ),
        'Y' => array(
            'key' => 'year',
        )
    ),
    'orderby' => array('Y' => 'ASC' , 'N'=>'DESC' )
);


meta_queryの中に更に配列を作り別名をつけ、ソートをかけるというやり方です。

▼ つまりこうです ▼

$param = array(
    'post_type' => array('post'),
    'meta_query' => array(
        'relation' => 'AND',
        '【第1ソート】' => array(
            'key' => '【対象のカスタムフィールド1】'
        ),
        '【第2ソート】' => array(
            'key' => '【対象のカスタムフィールド2】',
        )
    ),
    'orderby' => array('【第1ソート】' => 'ASC' , '【第2ソート】'=>'DESC' )

//【第1ソート】、【第2ソート】の名前は適当でOK

);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

たとえば「TTT」の「name」は「ICHIRO」で、「year」は「1983」ですよね。

なので「TTT」を取得するならこういう感じになります。

    'meta_query' => array(
        'relation'=>'AND', 
        array(
            'key' => 'name',
            'value'=>'ICHIRO',
            'compare'=>'='
        ),
        array(
            'key' => 'year',
            'value'=>'1983',
            'type'=>'NUMERIC', // 'value' が数字のときに必要
            'compare'=>'='
        )
    )


その他の指定についてもこちらを見ながらだとできると思います。

わからなければまたお聞きください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/16 15:35

    すみません、質問の意図がよく伝わっていないみたいです。
    任意のデータを取り出すのはできるんです。問題はその後のソート(並び替えの話)です。
    SQLでいうと最後のORDER BYですね。

    例えば、
    複数の取得結果を取得したあと(上記のテーブルのようになったとする)

    【name】で並び替えた場合、【name】に同じ値をもつ行があった場合、その中で【投稿日】順に並びますよね?そこを【投稿日】ではなく【year】で更に並び替えたいわけです。(いわゆる2重ソート)。

    -----
    わざわざ丁寧にURLまで付けてのご回答ありがとうございます。
    もう少し調べてみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る