在WordPress管理中按自定义字段对类别进行排序

时间:2021-08-18 作者:Meghan Prestemon

我知道有很多关于类似问题的帖子,但我不明白为什么我的自定义排序在类别管理页面中不起作用。下面是我的代码,用于将ACF字段作为列添加到类别页面,并注册排序功能。由于某种原因add_action( \'pre_get_posts\', \'category_custom_orderby\' ); 钩子坏了。有什么是我忽略的吗?或者是否有其他方法使排序功能正常工作?

add_filter( \'manage_edit-category_columns\', \'set_custom_category_columns\' );
function set_custom_category_columns( $columns ) {
  $columns[\'sort_order\'] = __( \'Sort Order\' );
  return $columns;
}

add_action( \'manage_category_custom_column\' , \'custom_category_column\', 10, 3 );
function custom_category_column( $string, $column, $term_id ) {
  if ( $column == \'sort_order\' ) {
    $category = get_category( $term_id );
    echo get_field(\'sort_order\', $category);
  }
}

function add_sortable_columns( $columns ) {
  $columns[\'sort_order\'] = \'sort_order\';
  return $columns;
}
add_filter( \'manage_edit-category_sortable_columns\', \'add_sortable_columns\');

function category_custom_orderby( $query ) {
  if ( ! is_admin() )
    return;

  $orderby = $query->get( \'orderby\');

  if ( \'sort_order\' == $orderby ) {
    $query->set( \'meta_key\', \'sort_order\' );
    $query->set( \'orderby\', \'meta_value\' );    
  } 
}
add_action( \'pre_get_posts\', \'category_custom_orderby\' );

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

由于某种原因add_action( \'pre_get_posts\', \'category_custom_orderby\' ); 钩子坏了。

是的,这是因为在Categories admin页面(您可以看到Categories列表),列表使用WP_Term_Query 而不是WP_Query, 因此,上述挂钩(pre_get_posts) 未激发。

因此,与上述内容不同add_action(), 尝试使用parse_term_query hook 像这样:

如果all 您的类别中有sort_order 元,

add_action( \'parse_term_query\', \'my_parse_term_query\' );
function my_parse_term_query( $query ) {
    $args =& $query->query_vars;

    if ( is_admin() && \'sort_order\' === $args[\'orderby\'] ) {
        $args[\'meta_key\'] = \'sort_order\';
        $args[\'orderby\']  = \'meta_value_num\';
    }
}
do not have 这个sort_order 元,

add_action( \'parse_term_query\', \'my_parse_term_query\' );
function my_parse_term_query( $query ) {
    $args =& $query->query_vars;

    if ( is_admin() && \'sort_order\' === $args[\'orderby\'] ) {
        $args[\'meta_query\'] = isset( $args[\'meta_query\'] ) ?
            (array) $args[\'meta_query\'] : array();

        $args[\'meta_query\'][] = array(
            \'relation\'      => \'OR\',
            \'sort_order\'    => array( // include categories that have the meta
                \'key\'  => \'sort_order\',
                \'type\' => \'NUMERIC\',
            ),
            \'no_sort_order\' => array( // and categories that don\'t have the meta
                \'key\'     => \'sort_order\',
                \'compare\' => \'NOT EXISTS\',
            ),
        );
    }
}
$args[\'orderby\'] = \'meta_value_num\' 和\'type\' => \'NUMERIC\' 因为我假设元值是一个数字?

此外=& 如中所示$args =& $query->query_vars 意味着我们引用的是原文$query_vars 中的属性WP_Term_Query 班所以如果我们修改$args 变量,这意味着我们实际上在修改原始$query_vars 所有物

相关推荐

使用wp_get_Object_Terms返回多个分类

我有一个循环来显示自定义帖子类型“workshop”的帖子。在循环中,我使用wp_get_object_terms().它工作得很好。然而,我很难控制分类法在显示时的顺序。它应该总是在第一个“区域”,然后是“组”。显示相关分类的代码:<?php $workshop_terms = wp_get_object_terms( $post->ID, array( \'area\', \'group\' ) ); if ( ! empty( $workshop_terms ) ) {