【发布时间】:2020-06-25 15:00:55
【问题描述】:
我正在努力找出这段代码有什么问题。我已经在 StackOverflow 上阅读并尝试了关于这个主题的每一个问题 - 我希望有人能发现一个小错误并解决它。
我有一个名为“books”的自定义帖子类型,带有自定义分类“book-series”。 “book-series”分类有一个与之关联的自定义元值“series-index-number”(用于按特定顺序显示系列)。
我想将“series-index-number”显示为主分类页面上的列之一,并使其可排序。
显示值是有效的。
按列排序不起作用。
这是完整的代码:
更新:我找到了解决方案 - 使用 pre_get_terms 添加一个操作,该操作将附加一个元类作为术语查询。下面的代码已更新以反映工作版本。
...
// display the series index numbers on the main series list page
add_filter('manage_edit-book-series_columns', 'add_series_index_column' );
add_filter('manage_book-series_custom_column', 'add_series_index_column_content', 10, 3 );
add_filter('manage_edit-book-series_sortable_columns', 'add_series_index_column_sortable' );
add_action( 'pre_get_terms', 'series_orderby' );
// add series index column to series page
function add_series_index_column( $columns ){
$columns['series_index'] = 'Order Number';
return $columns;
}
// add actual series index values to the table
function add_series_index_column_content( $content, $column_name, $term_id ){
if( $column_name !== 'series_index' ){
return $content;
}
$term_id = absint( $term_id );
$display_index = get_term_meta( $term_id, 'series-index-number', true );
if( !empty( $display_index ) ){
$content .= esc_attr( $display_index );
}
return $content;
}
// make series index column sortable
function add_series_index_column_sortable( $sortable ){
$sortable[ 'series_index' ] = 'series_index';
return $sortable;
}
function series_orderby( $query ) {
global $pagenow;
if(!is_admin()) {
return $term_query;
}
// WP_Term_Query does not define a get() or a set() method so the query_vars member must
// be manipulated directly
if(is_admin() && $pagenow == 'edit-tags.php' && $term_query->query_vars['taxonomy'][0] == 'book-series' && (isset($_GET['orderby']) || $_GET['orderby'] == 'series_index')) {
// set orderby to the named clause in the meta_query
$term_query->query_vars['orderby'] = 'order_clause';
$term_query->query_vars['order'] = isset($_GET['order']) ? $_GET['order'] : "DESC";
// the OR relation and the NOT EXISTS clause allow for terms without a meta_value at all
$args = array('relation' => 'OR',
'order_clause' => array(
'key' => 'series-index-number',
'type' => 'NUMERIC'
),
array(
'key' => 'series-index-number',
'compare' => 'NOT EXISTS'
)
);
$term_query->meta_query = new WP_Meta_Query( $args );
}
return $term_query;
}
...
【问题讨论】:
-
嗨!所以我认为你需要使用类似于本文的文件管理器
posts_orderby。显然,您需要对其进行编辑以使用您的税收元值,但这应该会让您朝着正确的方向前进:lab21.gr/blog/wordpress-wp_query-order-posts-by-taxonomy -
更新:我很确定使用“pre_get_posts”操作是错误的,因为这是自定义分类的显示,而不是帖子。我想我需要使用“pre_get_terms”或可能的“get_terms_orderby”,但我仍然无法让其中任何一个工作。有人用过吗?
-
嗯。来自 WordPress 开发人员的此链接似乎暗示我遇到了一个错误。显然,“pre_get_terms”操作不允许您重新设置 orderby 参数。该链接提出了一种解决方法 - 添加单独的“get_terms_orderby”操作以明确重新设置 orderby 参数。但是我已经尝试过了,它仍然无法正常工作。如果有人想看看,这里是链接:core.trac.wordpress.org/ticket/40335