自定义排序WordPress 分类目录

如何自定义排序WordPress 分类目录,非插件实现对WordPress分类目录的自定义排序,这似乎是一个很小的功能,但是更改需要花费很多时间。 如果选择插件,则可以使用:Category Order and Taxonomy Terms Order。 具体实现方案中的代码也从该插件中提取:
自定义排序WordPress 分类目录

基本思路是在数据库中添加一个排序字段,然后在取值sql语句中按此字段排序,或者先取出数据,然后按此字段排序;

将排序字段添加到数据库

待修改表的名称为wp_terms,wp_是自定义表的前缀,可以根据实际情况进行搜索;
执行以下sql语句,只需将一个名为term_order的字段添加到wp_terms,tinyint类型,默认为0;

1
ALTER TABLE wp_terms ADD term_order TINYINT DEFAULT 0
  1. 字段的数据类型使用tinyint,值范围为0-255,对我来说,目录创建不会太多,这个范围就足够了; 如果你担心,可以使用int或integer类型
  2. 自定义表前缀可以在根目录的wp-config中找到,此变量为$ table_prefix;。
  3. wp-terms表主要用于放置分类目录和标签等数据。 修改顺序时,仅修改与分类目录有关的数据即可。
    添加字段后,就可以修改顺序。 需要在顶部/前面显示的值较小;

修改取到数据的顺序

1.wp-includes/widgets/class-wp-widget-categories.php 中,排序字段由默认的 name 改为 term_order;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function widget($args, $instance){
// …… 省略的其他代码
if ($title) {
echo $args['before_title'] . $title . $args['after_title'];
}

$cat_args = array(
'orderby' => 'term_order', // name 改为 term_order
'show_count' => $c,
'hierarchical' => $h,
);
echo 'orderby-000';
// …… 省略的其他代码
}

此处的代码不能保证一定是只有目录组件用到了,但至少从现在的页面布局下,只有分类目录这个地方输出了 “orderby-000”;后台中的分类目录管理也没有输出;
2.在主题下的 functions.php 的最后,添加下面的代码:

1
2
3
4
5
6
7
8
9
10
11
function hook_get_terms_orderby($orderby, $args)
{
if ( apply_filters('to/get_terms_orderby/ignore', FALSE, $orderby, $args) )
return $orderby;

if (isset($args['orderby']) && $args['orderby'] == "term_order" && $orderby != "term_order")
return "t.term_order";

return $orderby;
}
add_filter('get_terms_orderby', 'hook_get_terms_orderby', 1, 2);

这段代码加了一个 get_term_orderby 过滤器,对 sql 语句中的 orderby 进行重置;

  1. 这段代码的大体意思是如果 $args[‘orderby’] – 原始传过来的排序字段是 term_order,修改之后的 $orderby 不是 term_order,就重置为 t.term_order;
  2. 第二步中修改的两个地方是相关的,2.1 中的字段和 2.2 中的 if 判断,是一个值,所以也可以把 term_order 替换成表中的其他字段或自定义字符串都可以,只要两边统一就好;只要保证过滤器最终返回 t.term_order 就可以;

排序功能到这里就完成了!!当然为了节省时间,建议小白用插件。