これで解決!複数のmeta_keyで並び替える方法【pre_get_posts/WordPress】

Author:

みなさん、WordPress楽しんでますか?(笑)

カスタマイズがいろいろと出来る分、悩むことも多いですよね。

今回は、WordPressの管理画面の投稿一覧についてのノウハウです。

まずは、準備として、カラムを追加する方法から説明しますね。

 

カラムを追加したい!

add_filter('manage_posts_columns', 'manage_posts_columns_title');
function manage_posts_columns_title( $columns ) {

	if ( get_post_type($post) == 'post' ) {
		$columns = array(
			'cb' => '',
			'thumbnail' => '',
			'title' => __('Title'),
			'event_datetime' => 'イベント日時',
			'categories' => __('Category'),
			'tags' => __('Tags'),
		);
	}
	return $columns;

}

これについては説明はいらないと思います。

多分、みなさんここまでは問題なく出来ている。問題はこの次です!

 

カラムを並び替えたい!

WordPressの管理画面の投稿一覧で、カスタムフィールドのカラムを追加した後に、やりたいことといえば並べ替え

これが一つだけであれば、下記のような感じで作れるのですが、複数のmeta_keyで並び替える方法となると、良い解決策を見つけることができませんでした。

一つのmeta_key

$query->set( 'meta_key','custom_field_name' );
$query->set( 'orderby','meta_value_num' );
$query->set( 'order','ASC' );

こういうやつですね。

この方法は、いろんなサイトでわかりやすく紹介されていますし、内容がシンプルなので問題ないと思います。

<参考サイト>

https://www.akecre.com/wordpress/pregetposts_cf_date/

 

複数のmeta_keyでカラムを並び替えたい!

お待たせしました。ここからが僕がやりたかったことです。

どこを探しても僕がやりたいことがバシッ!と描いてない。

仕方なく英語のサイトを漁っていたら発見することができました!

それを参考にしたのが下記のやつです。

add_filter( 'manage_edit-post_sortable_columns', 'add_sort_event_datetime');
function add_sort_event_datetime($columns){
	$columns['event_datetime'] = 'event_datetime';
	return $columns;
}
add_action( 'pre_get_posts', 'add_sort_event_datetime_orderby', 1 );
function add_sort_event_datetime_orderby( $query ) {
	if ( is_admin() && $query->is_main_query() && ( $orderby = $query->get('orderby') ) ) {
		switch( $orderby ) {
			case 'event_datetime':

				$meta_query = array(
					array(
						'event_date_clause' => array(
							'key' => 'event_date',
							'compare' => 'EXISTS'
						)
					),
					array(
						'event_time_clause' => array(
							'key' => 'event_start',
							'compare' => 'EXISTS'
						)
					)
				);
				$query->set('meta_query', $meta_query);

				$order = $query->get('order');
				$query->set('orderby', array('event_date_clause' => $order, 'event_time_clause' => $order));

			break;
		}
	}
}

これで、昇順・降順も▲▼できちんとできます。

最初のセクションで、「イベント日時」のカラムを追加しましたが、一覧のデータはカスタムフィールドの「イベント日付」+「イベント開始時間」を合わせて「m/d H:i」の形式で表示しています。

イベント日付だけでなく、イベント開始時間だけでもない。両方一緒に並び替える方法。

これを見つけるのが本当に大変だった。

あと一歩手が届きそうなサイトは見つかったんですけどね。

【WordPress】カスタム投稿タイプの記事をカスタムフィールドの値順で並び替える

 

まあ、何はともあれ、無事カラムの追加と並び替えの機能を実装することができました。

めでたしめでたし。