WordPressの管理画面ターム一覧でmeta_keyで並べ替える際にカウントでバグ発生

作成日:

WordPressで各タクソノミーに「term_order」というカスタムフィールドを追加して、ここに入力した数値で並べ替え表示していました。

これが単にWP_Term_Queryを使う際であれば、

PHP
$args = array(
	'orderby'    => 'meta_value_num',
	'order'      => 'ASC',
	'meta_key'   => 'term_order',
);

としておけば問題無いのですが、管理画面のターム一覧表示した際の設定に苦労しました。

こちらのコードを参考に、

favicon
A working sort for taxonomy terms + numeric meta data https://gist.github.com/joelstransky/bbfa426b6e122c773b21bddd14e20ec1

A working sort for taxonomy terms + numeric meta data - functions::taxonomies.php

PHP
function admin_term_orderby( $term_query ) {
	global $pagenow;
	if( ! is_admin() ) {
		return $term_query;
	}
	$orderby = filter_input( INPUT_GET, 'orderby', FILTER_SANITIZE_STRING );
	$order   = filter_input( INPUT_GET, 'order', FILTER_SANITIZE_STRING );
	if ( is_admin() && $pagenow == 'edit-tags.php' && ! $orderby ) {
		$term_query->query_vars['orderby'] = 'order_clause';
		$term_query->query_vars['order']   = isset( $order ) ? $order : "ASC";
		$args                              = array(
			'relation'     => 'OR',
			'order_clause' => array(
				'key'  => 'term_order',
				'type' => 'NUMERIC'
			),
			array(
				'key'     => 'term_order',
				'compare' => 'NOT EXISTS'
			)
		);
		$term_query->meta_query = new WP_Meta_Query( $args );
	}
	return $term_query;
}
add_filter( 'pre_get_terms', 'admin_term_orderby' );

とすれば並べ替えは可能です。

しかし、何故か表示されるターム数が4倍で計上されてしまいます。

class-wp-terms-list-table.php内で処理される際にwp_count_termsが正しく計算出来ていないようでした。

原因はわかりませんが、表示されている画面上で実行されているクエリ分加算されているようでした。

なので、無理やり

PHP
function admin_term_orderby( $term_query ) {
	global $pagenow, $admin_term_counter;
	if( ! is_admin() ) {
		return $term_query;
	}
	if ( ! $admin_term_counter) {
		$admin_term_counter= 1;
	} else {
		$admin_term_counter++;
	}
	$orderby = filter_input( INPUT_GET, 'orderby', FILTER_SANITIZE_STRING );
	$order   = filter_input( INPUT_GET, 'order', FILTER_SANITIZE_STRING );
	if ( is_admin() && $pagenow == 'edit-tags.php' && ! $orderby && 3 === $admin_term_counter ) {
		$term_query->query_vars['orderby'] = 'order_clause';
		$term_query->query_vars['order']   = isset( $order ) ? $order : "ASC";
		$args                              = array(
			'relation'     => 'OR',
			'order_clause' => array(
				'key'  => 'term_order',
				'type' => 'NUMERIC'
			),
			array(
				'key'     => 'term_order',
				'compare' => 'NOT EXISTS'
			)
		);
		$term_query->meta_query = new WP_Meta_Query( $args );
	}
	return $term_query;
}
add_filter( 'pre_get_terms', 'admin_term_orderby' );

のように、グローバル変数でカウンターをつけて、3番目のみ並べ替えが実行されるようにしました。

しかしこれだと親カテゴリー選択時に並べ替えが処理されないのも問題。

さて、どうしたものか。

物草 灸太郎
物草 灸太郎

WordPressでホームページを制作しつつ、休日は畑を耕したりDIYを楽しんでいます。

Loading...

コメントをどうぞ

  • メールアドレスが公開されることはありません。
  • コメント欄にURLは入力できません。
  • このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。