WordPressの管理画面ターム一覧でmeta_keyで並べ替える際にカウントでバグ発生
作成日:
2021年1月20日
WordPressで各タクソノミーに「term_order」というカスタムフィールドを追加して、ここに入力した数値で並べ替え表示していました。
これが単にWP_Term_Query
を使う際であれば、
PHP
$args = array(
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_key' => 'term_order',
);
としておけば問題無いのですが、管理画面のターム一覧表示した際の設定に苦労しました。
こちらのコードを参考に、
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...
コメントをどうぞ