新着記事の並び順をカスタムフィールドの日付とワードプレスの投稿日時の2つの条件で対応したかった時に結構ハマったのでメモ。
get_posts()とメインループでの書き方っす!
複数のカスタムフィールドにある日付での並び順は、ググるとでてくるんだけど…
カスタムフィールド日付&ワードプレス投稿日時だと全然でてこなくて困ったです。
最終的には海外サイトを参照しますた。
並び順の条件
▼第1条件
カスタムフィールドにある日付順にソート
▼第2条件
上記、カスタムフィールドが同じ日付の場合は投稿日時を参照してソート
get_posts()の記述方法
1 2 3 4 5 |
'meta_key' => 'カスタムフィールドのメタキーを指定', 'orderby' => [ 'meta_value_num' => 'DESA', 'post_date' => 'DESC', ] |
1行目でどのカスタムフィールドを参照するのかを指定。
3行目、4行目で並び順を指定。
3行目、4行目を入れ替えると条件も変えられるみたい♪
get_posts()のサンプルコード
▼条件
・公開済みの記事
・新着10件表示
・投稿タイプは「投稿(post)」
・並び順の第1条件→カスタムフィールドにある日付
・並び順の第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 |
<?php $args = array( 'post_status' => 'publish', 'posts_per_page' =>10, 'post_type' => 'post', // ↓↓ここからがソート指定 'meta_key' => 'カスタムフィールドのメタキーを指定', 'orderby' => [ 'meta_value_num' => 'DESA', 'post_date' => 'DESC', ] // ↑↑ここまで ); ?> <?php $posts = get_posts( $args ); foreach ( $posts as $post ): setup_postdata( $post ); ?> <?php //ここにループの中身 ?> <?php endforeach; wp_reset_postdata(); ?> |
メインループのサンプルコード
メインループの場合はfunctions.phpに記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php function change_posts_per_page($query) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_archive() ) { // アーカイブページの時 $query->set( 'posts_per_page', '20' ); //表示件数は20件 $query->set('meta_key', 'last-updated'); //カスタムフィールドのメタキーを指定 $query -> set('orderby', array('meta_value_num' => 'DESC', 'date' => 'DESC') ); //カスタムフィールドと投稿日時の並び順を指定 } } add_action( 'pre_get_posts', 'change_posts_per_page' ); ?> |
6行目のis_archive()を変更することで、検索結果ページやポストアーカイブへ対応させることも出来ます。
is_archive()は、カテゴリ一覧ページやタグ一覧ページが対応されることとなります。
条件分岐については↓↓を参照
https://wpdocs.osdn.jp/%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E3%82%BF%E3%82%B0