Woocommerce:按自定义分类排序
Woocommerce: order by custom taxonomy
我遇到了以下问题。我已经使用 WooCommerce 建立了一个 Wordpress 网站来为只有书籍的网上商店提供服务。
我创建了一些基于分类法的产品属性,例如“publisher”和“author”(因为多个产品可以共享作者或出版商)
我希望不仅可以在 'title' 和 'price' 等 Woocommerce 默认字段上,而且可以在这些分类字段上对我的产品进行排序。
比如说:
按作者 ASC 排序 或按出版商 DESC 排序
据我所知,使用 Wordpress 核心功能无法做到这一点。有人说这是因为按分类法字段排序没有意义,但是对于上面的示例,我无法理解为什么您不想按例如作者排序。
我玩过 sortby meta_value,但这只是查询直接后元,而不是分类法。
我了解 php,因此任何涉及我的 functions.php 文件中附加代码的解决方案都可以。
我找到了解决这个问题的方法:
https://gist.github.com/jayarnielsen/12f3a586900aa6759639
我稍微修改了代码,使其与 Woocommerce 用于按系统字段 "title" 和 "price" 排序的方式相同,它添加了一个名为 [=18] 的 url 查询参数=] 结构如下的值:"field"-"direction"
因此,要按名为 "pa_tax1" 的产品 属性 升序排序,您需要添加到 url:sortby=pa_tax1-asc
add_filter('posts_clauses', 'posts_clauses_with_tax', 10, 2);
function posts_clauses_with_tax( $clauses, $wp_query ) {
global $wpdb;
// Array of taxonomies you want to sort on
// in case of Woocommerce Properties, be sure to add the pa_ prefix
$taxonomies = array('pa_tax1', 'pa_tax2', 'pa_tax3');
// If no orderby query param is found, do nothing
if( !isset($wp_query->query['orderby']) ) {
return $clauses;
}
// Explode the orderby query-param
$orderQuery = explode('-', $wp_query->query['orderby']);
$orderBy = [];
$orderBy['field'] = $orderQuery[0];
$orderBy['direction'] = (isset($orderQuery[1])) ? strtoupper($orderQuery[1]) : 'ASC';
// Only add clauses, if the sortby field is in our array
if( in_array($orderBy['field'], $taxonomies) ) {
$clauses['join'] .= "
LEFT OUTER JOIN {$wpdb->term_relationships} AS rel2 ON {$wpdb->posts}.ID = rel2.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} AS tax2 ON rel2.term_taxonomy_id = tax2.term_taxonomy_id
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
";
$clauses['where'] .= " AND (taxonomy = '".$orderBy['field']."' OR taxonomy IS NULL)";
$clauses['groupby'] = "rel2.object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $orderBy['direction'] ) ) ? 'ASC' : 'DESC';
return $clauses;
}
else {
return $clauses;
}
}
我遇到了以下问题。我已经使用 WooCommerce 建立了一个 Wordpress 网站来为只有书籍的网上商店提供服务。
我创建了一些基于分类法的产品属性,例如“publisher”和“author”(因为多个产品可以共享作者或出版商)
我希望不仅可以在 'title' 和 'price' 等 Woocommerce 默认字段上,而且可以在这些分类字段上对我的产品进行排序。 比如说: 按作者 ASC 排序 或按出版商 DESC 排序
据我所知,使用 Wordpress 核心功能无法做到这一点。有人说这是因为按分类法字段排序没有意义,但是对于上面的示例,我无法理解为什么您不想按例如作者排序。
我玩过 sortby meta_value,但这只是查询直接后元,而不是分类法。
我了解 php,因此任何涉及我的 functions.php 文件中附加代码的解决方案都可以。
我找到了解决这个问题的方法: https://gist.github.com/jayarnielsen/12f3a586900aa6759639
我稍微修改了代码,使其与 Woocommerce 用于按系统字段 "title" 和 "price" 排序的方式相同,它添加了一个名为 [=18] 的 url 查询参数=] 结构如下的值:"field"-"direction" 因此,要按名为 "pa_tax1" 的产品 属性 升序排序,您需要添加到 url:sortby=pa_tax1-asc
add_filter('posts_clauses', 'posts_clauses_with_tax', 10, 2);
function posts_clauses_with_tax( $clauses, $wp_query ) {
global $wpdb;
// Array of taxonomies you want to sort on
// in case of Woocommerce Properties, be sure to add the pa_ prefix
$taxonomies = array('pa_tax1', 'pa_tax2', 'pa_tax3');
// If no orderby query param is found, do nothing
if( !isset($wp_query->query['orderby']) ) {
return $clauses;
}
// Explode the orderby query-param
$orderQuery = explode('-', $wp_query->query['orderby']);
$orderBy = [];
$orderBy['field'] = $orderQuery[0];
$orderBy['direction'] = (isset($orderQuery[1])) ? strtoupper($orderQuery[1]) : 'ASC';
// Only add clauses, if the sortby field is in our array
if( in_array($orderBy['field'], $taxonomies) ) {
$clauses['join'] .= "
LEFT OUTER JOIN {$wpdb->term_relationships} AS rel2 ON {$wpdb->posts}.ID = rel2.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} AS tax2 ON rel2.term_taxonomy_id = tax2.term_taxonomy_id
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
";
$clauses['where'] .= " AND (taxonomy = '".$orderBy['field']."' OR taxonomy IS NULL)";
$clauses['groupby'] = "rel2.object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $orderBy['direction'] ) ) ? 'ASC' : 'DESC';
return $clauses;
}
else {
return $clauses;
}
}