web-dev-qa-db-ja.com

Order by field valueを使用して複雑なカスタムフィールドクエリを実行しようとしています

イベント投稿用に2つのカスタムフィールドがあります:event-startevent-end。現在の予定について問い合わせているときに、event-start OR the event-endが今日の日付以上である投稿を表示したいのですが、それらをevent-startで並べたいのですがデフォルトのpost_date).

以下のパラメータでクエリを作成しました。

$args = array(
  'post_type' => 'post',
  'posts_per_page' => $number,          
  'meta_query' => array(
    'relation' => 'OR',
    array(
      'key' => 'event-start',
      'value' => $today_is,
      'type' => 'NUMERIC',
      'compare' => '>='
    ),
    array(
      'key' => 'event-end',
      'value' => $today_is,
      'type' => 'NUMERIC',
      'compare' => '>='
    )
  ),
  'orderby' => 'meta_value',
  'order' => 'ASC',
);

クエリは正しい投稿を取得しますが、問題は私が注文を受け取ることができないことです。この一連の引数は、次のクエリを実行します。

SELECT SQL_CALC_FOUND_ROWS wp_18_posts.ID FROM wp_18_posts INNER JOIN wp_18_postmeta ON (wp_18_posts.ID = wp_18_postmeta.post_id)
INNER JOIN wp_18_postmeta AS mt1 ON (wp_18_posts.ID = mt1.post_id) WHERE 1=1 AND wp_18_posts.post_type = 'post' AND (wp_18_posts.post_status = 'publish' OR wp_18_posts.post_status = 'private') AND ( (wp_18_postmeta.meta_key = 'event-start' AND CAST(wp_18_postmeta.meta_value AS SIGNED) >= '1344289896')
OR (mt1.meta_key = 'event-end' AND CAST(mt1.meta_value AS SIGNED) >= '1344289896') ) GROUP BY wp_18_posts.ID **ORDER BY wp_18_posts.post_date** ASC LIMIT 0, 3

ORDER BY句がまだpost_dateに設定されていることに注意してください。次のように新しいスタイルのmeta_queryと共にorderby meta_valueと同様に古いスタイルのmeta_keyを使用するようにクエリの引数を変更したとします。

$args = array(
  'post_type' => 'post',
  'posts_per_page' => $number,      
  'meta_query' => array(
    'relation' => 'OR',
    array(
      'key' => 'event-start',
      'value' => $today_is,
      'type' => 'NUMERIC',
      'compare' => '>='
    ),
    array(
      'key' => 'event-end',
      'value' => $today_is,
      'type' => 'NUMERIC',
      'compare' => '>='
    )
  ),
  'orderby' => 'meta_value',
  'meta_key' => 'event-start',
  'order' => 'ASC',
);

私は次のような問い合わせになります。

SELECT SQL_CALC_FOUND_ROWS wp_18_posts.ID FROM wp_18_posts INNER JOIN wp_18_postmeta ON (wp_18_posts.ID = wp_18_postmeta.post_id)
INNER JOIN wp_18_postmeta AS mt1 ON (wp_18_posts.ID = mt1.post_id)
INNER JOIN wp_18_postmeta AS mt2 ON (wp_18_posts.ID = mt2.post_id) WHERE 1=1 AND wp_18_posts.post_type = 'post' AND (wp_18_posts.post_status = 'publish' OR wp_18_posts.post_status = 'private') AND (wp_18_postmeta.meta_key = 'event-start'
OR (mt1.meta_key = 'event-start' AND CAST(mt1.meta_value AS SIGNED) >= '1344289518')
OR (mt2.meta_key = 'event-end' AND CAST(mt2.meta_value AS SIGNED) >= '1344289518') ) GROUP BY wp_18_posts.ID ORDER BY wp_18_postmeta.meta_value ASC LIMIT 0, 3

これは、そのキーに設定された日付に関係なく、すべての投稿をevent-startメタキーで取得します。

複雑なカスタムフィールドクエリを設定してevent-start値で並べ替える方法を知っている人は大歓迎です。

3
DaveE

これが私が見つけた最良の解決策です:

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => $number,
    'meta_key'       => 'event-start',
    'meta_value'     => $today_is,
    'meta_query'     => array(
        'relation' => 'OR',
        array(
            'key'     => 'event-start',
            'value'   => $today_is,
            'type'    => 'NUMERIC',
            'compare' => '>=',
        ),
        array(
            'key'     => 'event-end',
            'value'   => $today_is,
            'type'    => 'NUMERIC',
            'compare' => '>=',
        )
    ),
    'orderby' => 'meta_value',
    'order'   => 'ASC',
);

これは同じ複雑なmeta_queryを使用しますが、meta_keyのorderbyをトリガーするためにmeta_valuemeta_valueを別々に追加しました。

私がこの記事を書いた時点で私が正しく思い出した場合、私はこの解決策を試してみましたが、うまくいきませんでした。私はまた、私がこの問題に関連したWordPress CoreのTracチケットに出くわしたと思いますが、私の人生のために今それを見つけることができません。

結論:元の記事の時点では、これが機能しないWordPressのバグがあったと思いますが、現在は機能しています。

1
DaveE

カスタムフィールドの値が数値の場合は、meta_value_numを使って順序付けを試すことができます。また、meta_valueとmeta_value_numの両方とも、ここで説明されているように 、クエリにmeta_keyが必要です

$args = array(
  'post_type' => 'post',
  'posts_per_page' => $number,          
  'meta_query' => array(
    'relation' => 'OR',
    array(
      'meta_key' => 'event-start',
      'value' => $today_is,
      'type' => 'NUMERIC',
      'compare' => '>='
    ),
    array(
      'meta_key' => 'event-end',
      'value' => $today_is,
      'type' => 'NUMERIC',
      'compare' => '>='
    )
  ),
  'orderby' => 'meta_value_num',
  'order' => 'ASC',
);
1
unifiedac