前提・実現したいこと
pre_get_postsで定義した記事を一覧として出力しています。
その記事をAdvanced Custom Fieldsのカスタムフィールドで設定した日時で並び替えたいですが、うまく並び替わりません。
カスタムフィールドは下記のように3つに分かれています。
- 開催日(例:2019/1/1)
- 開始グループの時間(例:9)
- 開始グループの分(例:30)
※上記の場合、2019/1/1 9時30分
function.php
function twpp_change_sort_order( $query ) { if(is_admin() || ! $query->is_main_query()){ return; } if($query->is_tax('seminar-category')) { $query->set('order', 'DESC' ); $query->set('orderby', array( '開催日' => 'DESC', '開始_時' => 'DESC', '開始_分' => 'DESC', )); $query->set('posts_per_page', 5); ); } } add_action('pre_get_posts', 'twpp_change_sort_order');
記事一覧を出力している箇所
<?php if(have_posts()): while(have_posts()): the_post(); ?> // タイトルなど <?php endwhile; endif; ?>
追記(7/24 11:01)
下記コードに修正したら思うどおりに動いたのですが、、、
function twpp_change_sort_order( $query ) { if(is_admin() || ! $query->is_main_query()){ return; } if($query->is_tax('seminar-category')) { $query->set('posts_per_page', 5); $query->set('meta_query', array( 'relation' => 'AND', 'my_custom_filed_date' => array( 'key' => '開催日' ), 'my_custom_filed_hour' => array( 'key' => '開始_時', ), 'my_custom_filed_min' => array( 'key' => '開始_分', ), ) ); $query->set('orderby', array( 'my_custom_filed_date' => 'ASC', 'my_custom_filed_hour'=>'ASC', 'my_custom_filed_min'=>'ASC', ) ); } } add_action('pre_get_posts', 'twpp_change_sort_order');
ここにさらに、「開催日時より後の記事(今が7/24 13:00の場合、7/24 13:10以降の開催日の記事)は出力しない」という処理を追加したいので下記のようにコードを変えたら、開催日以降の記事は出力されないのですが、開始時間と分の条件が効きませんでした。
どうすればいいでしょうか。
function twpp_change_sort_order( $query ) { if(is_admin() || ! $query->is_main_query()){ return; } if($query->is_tax('seminar-category')) { $query->set('posts_per_page', 5); $query->set('meta_query', array( 'relation' => 'AND', 'my_custom_filed_date' => array( 'key' => '開催日' ), 'my_custom_filed_hour' => array( 'key' => '開始_時', ), 'my_custom_filed_min' => array( 'key' => '開始_分', ), array( 'key' => '開催日', 'value' => date_i18n('Ymd'), 'compare' => '<=', array( 'key' => '開始_時', 'value' => date_i18n('G'), 'compare' => '<=', array( 'key' => '開始_分', 'value' => date_i18n('i'), 'compare' => '<=' ), ), ), ) ); $query->set('orderby', array( 'my_custom_filed_date' => 'ASC', 'my_custom_filed_hour'=>'ASC', 'my_custom_filed_min'=>'ASC', ) ); } } add_action('pre_get_posts', 'twpp_change_sort_order');
こちらはご確認されましたでしょうか?
https://teratail.com/questions/201285
https://teratail.com/questions/195188
ありがとうございます。ご教授頂いた記事を参考に並び替えの処理はうまくいきました。
しかし、並び替えと当時に、開催日時以降の記事は出力しないという処理を加えたら思うように動きませんでした。
質問を追記したので再度アドバイス頂けないでしょうか?
array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
/* OR でつなげたい条件1 */
),
array(
/* OR でつなげたい条件2 */
),
array(
/* OR でつなげたい条件3 */
),
),
array(
/* AND でつなげたい条件 */
)
)
という形にすると、ANDとORを両方とも使えるので、最後に「開催日時以降の記事は出力しない」の条件を入れてあげればOK
(https://codex.wordpress.org/Class_Reference/WP_Meta_Query#Initializing_WP_Meta_Query)
回答1件
あなたの回答
tips
プレビュー