如何自定义排序WordPress分类目录,非插件实现对WordPress分类目录的自定义排序,这似乎是一个很小的功能,但是更改需要花费很多时间。如果选择插件,则可以使用:Category Order and Taxonomy Terms Order。具体实现方案中的代码也从该插件中提取:
基本思路是在数据库中添加一个排序字段,然后在取值sql语句中按此字段排序,或者先取出数据,然后按此字段排序。
将排序字段添加到数据库
待修改表的名称为wp_terms,wp_是自定义表的前缀,可以根据实际情况进行搜索;
执行以下sql语句,只需将一个名为term_order的字段添加到wp_terms,tinyint类型,默认为0;
ALTER TABLE wp_terms ADD term_order TINYINT DEFAULT 0
字段的数据类型使用tinyint,值范围为0-255,对我来说,目录创建不会太多,这个范围就足够了;如果担心,可以使用int或integer类型
自定义表前缀可以在根目录的wp-config中找到,此变量为$table_prefix;。
wp-terms表主要用于放置分类目录和标签等数据。修改顺序时,仅修改与分类目录有关的数据即可。
添加字段后,就可以修改顺序。需要在顶部/前面显示的值较小;
修改取到数据的顺序
wp-includes/widgets/class-wp-widget-categories.php中,排序字段由默认的name改为term_order;
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”;后台中的分类目录管理也没有输出;
在主题下的functions.php的最后,添加下面的代码:
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进行重置;
这段代码的大体意思是如果$args[‘orderby’]–原始传过来的排序字段是term_order,修改之后的$orderby不是term_order,就重置为t.term_order;
第二步中修改的两个地方是相关的,2.1中的字段和2.2中的if判断,是一个值,所以也可以把term_order替换成表中的其它字段或自定义字符串都可以,只要两边统一就好;只要保证过滤器最终返回t.term_order就可以;
排序功能到这里就完成了,当然为了节省时间,建议用插件即可。