对自定义分类进行排序导致菜单错误

时间:2016-08-22 作者:dingo_d

我有一个名为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

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

当前您的代码正在修改all 前端和后端的术语查询。

每个导航菜单在nav_menu 分类法,因此当您访问后端处理菜单时,这些查询也会被您的代码片段修改。

例如,我没有看到任何! is_admin() 签入代码。

您应该只针对相关的术语查询,例如,在术语查询之前添加过滤器,然后再将其删除。另一种方法是使用自定义输入参数来激活过滤器。

ps:即使每个导航菜单都注册为nav_menu, 每个菜单项都是nav_menu_item 自定义post类型和树结构存储在_menu_item_menu_item_parent 每个帖子的元键。我只想提到这一点,因为从我上面写的内容可以理解,菜单只是分类结构的一部分