我有一个名为knowledgebase的自定义分类法,我修改了自定义分类法,使其具有“类别顺序”字段。这样就可以在前端根据它进行订购。
现在我已经设置好可以对该列进行排序(我已经在category表中添加了该列)。对于排序,我必须使用
/**
* Custom column sortable query
*
* @param array $pieces Terms query SQL clauses.
* @param array $taxonomies An array of taxonomies.
* @param array $args An array of terms query arguments.
* @return array Modified query array
* @since 1.0.0
*/
add_filter( \'terms_clauses\', \'mytheme_filter_custom_terms\', 10, 3 );
if ( ! function_exists( \'mytheme_filter_custom_terms\' ) ) {
function mytheme_filter_custom_terms( $pieces, $taxonomies, $args ) {
global $wpdb;
$orderby = isset( $_REQUEST[\'orderby\'] ) ? trim( wp_unslash( $_REQUEST[\'orderby\'] ) ) : \'cat_order\';
if ( \'cat_order\' === $orderby ) {
$pieces[\'fields\'] .= \', tm.*\';
$pieces[\'join\'] .= \' INNER JOIN \'.$wpdb->termmeta.\' AS tm ON tt.term_id = tm.term_id\';
$pieces[\'orderby\'] = \'ORDER BY ABS(tm.meta_value)\';
}
return $pieces ;
}
}
虽然这起作用,但它导致菜单不起作用。我没有看到管理位置,无法将菜单分配给我的主题中可用的任何主题位置。
知道为什么会这样吗?菜单是否使用terms_clauses
钩
最合适的回答,由SO网友:birgire 整理而成
当前您的代码正在修改all 前端和后端的术语查询。
每个导航菜单在nav_menu
分类法,因此当您访问后端处理菜单时,这些查询也会被您的代码片段修改。
例如,我没有看到任何! is_admin()
签入代码。
您应该只针对相关的术语查询,例如,在术语查询之前添加过滤器,然后再将其删除。另一种方法是使用自定义输入参数来激活过滤器。
ps:即使每个导航菜单都注册为nav_menu
, 每个菜单项都是nav_menu_item
自定义post类型和树结构存储在_menu_item_menu_item_parent
每个帖子的元键。我只想提到这一点,因为从我上面写的内容可以理解,菜单只是分类结构的一部分