WordPressでイベント開催情報を作るにあたり、開催日順にソートしたいが、開催日がきまっていないイベントは「未定」とし開催日が決まっているものより上に表示したかった時の覚書。
▼表示イメージ
・未定 イベント名
・2022/05/04 イベント名
・2022/05/03 イベント名
・2022/05/02 イベント名
・2022/05/01 イベント名
■仕様
・WordPressにカスタム投稿タイプ「event」を作る
・Advanced Custom Fieldsで「開催日」のフィールド名『event-day』を作る
・固定ページでイベント開催情報のページを作り、専用テンプレートでゴニョゴニョ書く
1.functions.phpでソートを指定
・開催日が未入力のものが上
・開催日が入力されているものが下(日付が新しいものが上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php function sort_order( $query, $wp_query ) { if ( $query === 'wp_postmeta.meta_value+0 DESC' ) { $query = 'wp_postmeta.meta_value+0 > 0 ASC, ' . $query; } remove_filter( 'posts_orderby', 'sort_order' ); return $query; } function my_posts_control( $query ) { if ( $query->is_post_type_archive( 'event' ) ) {//カスタム投稿タイプを指定 $query->set( 'order', 'DESC' ); $query->set( 'orderby', 'meta_value_num' ); $query->set( 'meta_key', 'event-day' ); //カスタムフィールドのキーを指定 add_filter( 'posts_orderby', 'sort_order', 10, 2 ); } } add_action( 'pre_get_posts', 'my_posts_control' ); ?> |
2.固定ページ専用テンプレートに書く内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php $paged = get_query_var('paged') ?: 1; //ページネーションを使いたいなら指定 $args = array( 'paged' => $paged, //ページネーションを使いたいなら指定 'posts_per_page' => 20, //1ページあたりの記事数設定 'post_status' => 'publish', //公開の記事だけ 'post_type' => 'event', //カスタム投稿slag ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : ?> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <?php //繰り返し表示したい内容、ここでは記事タイトル echo get_the_title(); ?> <?php endwhile; ?> <?php //プラグイン「wp pagenavi」を設置 wp_pagenavi(array('query' => $the_query)); ?> <?php wp_reset_postdata(); endif; ?> |
MySQLで数値の昇順の後に空値のレコードが並ぶようにする