カスタムフィールドに入れた日付順に記事一覧を並べ替える方法

カスタムフィールドに入れた日付順に記事一覧を並べ替える方法

カスタムフィールドに入れた日付順に記事一覧を並べ替える方法

カスタムフィールドに入れた日付をベースに、記事一覧を並べ替える(ソートする)方法を紹介いたします。

通常記事一覧を出力する場合は、投稿日を基準に並べられます。しかし、投稿日は関係なく、カスタムフィールドに入れた日付で一覧を並び替えたい場合もあると思います。

当記事では、イベントが実施される日付をカスタムフィールドに入れたと仮定して、イベント日の順番で記事一覧を並べ替える方法を解説したいと思います。

カスタムフィールドに入れた日付順に記事一覧を並べ替える方法

カスタムフィールドの値を使って一覧の並べ替えをするには、記事を抽出する際に「meta_key」と「orderby」を指定してあげます。


'meta_key' => 'eventday',
'orderby' => 'meta_value',
'order'=> 'ASC',

eventdayの部分にカスタムフィールドのキーを入力します。orderbyで「meta_value」を指定することで、eventdayを基準に並べ替えます。「’order’=> ‘ASC’」なら昇順、「’order’=> ‘DESC’」にすれば降順になります。

さらに、本日以降のイベントのみを表示させたい場合は、以下のような指定も追加します。


'meta_compare' => '>=',
'meta_value'=> date("Y年m月d日"),
'type' => 'DATE',

meta_compareには演算子、meta_valueには比較対象の日付、つまり今日の日付が入るように指定します。

「’type’ => ‘DATE’」はこれは日付ですよー、という指定です。記事一覧を出力する際に、get_postsを使っていればこのままで大丈夫ですが、場合によっては「’meta_type’ => ‘DATE’」としないと動かない場合もあるみたいです。

meta_valueの値はカスタムフィールドの値と形式を合わせて指定します。例えば、2015/04/23という形式でカスタムフィールドに入力していたら、「date(“Y/m/d”)」とします。

上記を踏まえて、記述したループ全体が以下になります。イベント日によって一覧を並べ替え、本日以降の記事だけを出力します。


<div class="event-content">
<ul>
<?php
$args = array(
'post_type' => 'event',
'posts_per_page' => -1,
'meta_key' => 'eventday',
'orderby' => 'meta_value',
'order'=> 'ASC',
'meta_compare' => '>=',
'meta_value'=> date("Y年m月d日"),
'type' => 'DATE',
);
$domestic_post = get_posts($args);
if($domestic_post) : foreach($domestic_post as $post) : setup_postdata( $post ); ?>
<li class="event-list">
<span class="event-date"><?php echo esc_html(get_post_meta($post->ID , 'eventday' ,true)); ?></span>
<span class="event-title"><a href="<?php the_permalink(); ?>"><?php if(mb_strlen($post->post_title)>34) { $title= mb_substr($post->post_title,0,34) ; echo $title. … ;} else {echo $post->post_title;}?></a></span>
</li>
<?php endforeach; ?>
<?php else : ?><p>表示するイベントがありません。</p>
<?php endif;
wp_reset_postdata(); ?>
</ul>
</div>

上記のように記述することで、カスタムフィールドの値で一覧を並べ替えることができます。

あとがき

これは並べ替え関係ないですが、日付の箇所で「カスタムフィールドの値が入っていたらその値を、空だったら投稿日を出力」するには、以下のように条件分岐させます。


<?php $custom_fields = get_post_meta( $post->ID , 'eventday' , true );
if(empty( $custom_fields ) === false){
echo esc_html(get_post_meta($post->ID , 'eventday' ,true));
} else {
the_time('Y年m月d日');
} ?>

カスタムフィールドの値で並べ替える場合は必要ないですが、一応備忘録として残しておきます。

この記事が気に入ったら
いいね!してね♪

Twitter で

2 thoughts on “カスタムフィールドに入れた日付順に記事一覧を並べ替える方法

  1. まつたく

    とても参考になりました!meta_typeがコードの中でtypeになっちゃてますよ!プルリクしたいです笑

    自分はこちらの方法でやると年は正しくorderされましたが日付はバラバラでした。なので以下を指定したらいけました。
     ’orderby’ => ‘meta_value’,
     ’order’=> ‘DESC’,
     ’meta_type’ => ‘DATETIME’,

    もしかするとWordPressの 一般設定>日付のフォーマット の部分も関係してそうな部分ですね。

    1. himecas Post author

      コメントありがとうございます。

      「’type’ => ‘DATE’」については、実はこれはこれで合ってはいるんですよね… 改めて検証してみましたが「’type’ => ‘DATE’」でちゃんと並べ替えできました。

      ただ、記事本文中にも記載しておりますが、おっしゃる通り「meta_type」を使わないと並べ替えできない環境もあるみたいですね。私が検証した環境では、逆に「meta_type」を使うと投稿を取得できなくなります。

      WordPressの日付フォーマットも何パターンか試してみましたが、特に変化なかったので他に要因があるかもしれません。

      原因まで特定できておりませんが、コメントいただけて勉強になりました!ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です