在任何人说我没有尝试之前,让我说我为实现这一目标做了很多努力。我甚至实现了,但当我向函数添加以下代码时。php排序工作正常,但左侧的过滤器不工作。
function orderby_tax_clauses( $clauses, $wp_query ) {
global $wpdb;
$taxonomies = get_taxonomies();
foreach ($taxonomies as $taxonomy) {
if ( isset( $wp_query->query[\'orderby\'] ) && $taxonomy == $wp_query->query[\'orderby\'] ) {
$clauses[\'join\'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb- >term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses[\'where\'] .= " AND (taxonomy = \'{$taxonomy}\' OR taxonomy IS NULL)";
$clauses[\'groupby\'] = "object_id";
$clauses[\'orderby\'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses[\'orderby\'] .= ( \'ASC\' == strtoupper( $wp_query->get(\'order\') ) ) ? \'ASC\' : \'DESC\';
}
}
return $clauses;
}
add_filter(\'posts_clauses\', \'orderby_tax_clauses\', 10, 2 );
此特定代码
add_filter(\'posts_clauses\', \'orderby_tax_clauses\', 10, 2 );
我认为这是造成问题的原因,因为当我删除这条线时,它会正确过滤。我认为当我同时使用filter和soering选项时,会产生一些查询冲突并给出“找不到结果”。当我只使用orting时,它会工作;当我只使用filter时,它会工作。如何使两者协同工作?
这是网站:
http://tjdesigners.info/mooctracks/searchresults/?
请帮帮我!
非常感谢你!
提尔塔
最合适的回答,由SO网友:cybmeta 整理而成
如果您确实需要按分类术语进行排序,我认为您的应用程序中的数据结构设计很糟糕。想想看。
分类法是对事物进行分组的一种方式,比如说帖子。分类法是一组“术语”,帖子按照它们之间共享的“术语”进行分组。在我看来,如果术语按其应有的方式使用,则按术语排序根本没有用处,也没有任何意义。
让我们来看一下页面中的一个示例:您可以通过“Codecademy”平台进行过滤,这样您就可以获得分配给“Codecademy”的项目组。然后单击“platform”表头,按“Codecademy”排序,逻辑在哪里?。这就像有一群“牙医”,你想按“牙医”排序;你可能想按描述每个牙医的东西来分类,比如名字或费用,但不要按“牙医”来分类。你明白我的意思吗?If you need to sort by some posts characteristic, you should use customs post meta fields or core post fields, not taxonomies.
另一个例子是,如果您想按照“平台”分类法的字母顺序进行排序,那么您真正想要的是按照字母顺序对分类法的术语进行排序,并显示每个术语的帖子,这不是对帖子进行排序,而是对术语进行排序。
无论如何,如果你真的想按分类术语排序,你可以这样做,不是用Wordpress提供的标准方式,而是用一种自定义方式,比如你正在使用的自定义SQL中的变通方法或者this article.