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