イベント投稿用に2つのカスタムフィールドがあります:event-start
とevent-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
値で並べ替える方法を知っている人は大歓迎です。
これが私が見つけた最良の解決策です:
$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_value
とmeta_value
を別々に追加しました。
私がこの記事を書いた時点で私が正しく思い出した場合、私はこの解決策を試してみましたが、うまくいきませんでした。私はまた、私がこの問題に関連したWordPress CoreのTracチケットに出くわしたと思いますが、私の人生のために今それを見つけることができません。
結論:元の記事の時点では、これが機能しないWordPressのバグがあったと思いますが、現在は機能しています。
カスタムフィールドの値が数値の場合は、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',
);