假设有一个产品属性“品牌”具有以下术语:
我们还可以这样说,在产品>属性>大小中,这些术语的菜单顺序是这样的:
如何根据属性菜单顺序对商店页面上的产品进行排序?例如:
假设每个产品只有一个品牌属性项。
到目前为止,我认为代码可能涉及使用pre_get_posts钩子修改查询,但我很难以这种方式定制顺序。
发布于 2021-10-06 08:15:05
由于get_terms()正在返回我们为属性设置的顺序,所以我们可以获取这些ids并将它们用作排序。
//Change taxonomy if you need.
$terms = get_terms( array('taxonomy' => 'pa_brand','fields' => 'ids'));从这里我们可以使用woocommerce_product_query修改我们的查询。
最后,将查询的顺序设置为term_id ASC或DESC。
这是我的解决办法
function sort_products_by_brand( $q ) {
$terms = get_terms( array('taxonomy' => 'pa_brand','fields' => 'ids'));
$tax_query = $q->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'pa_brand',
'field' => 'term_id',
'terms' => $terms,
);
$q->set( 'tax_query', $tax_query);
$q->set( 'orderby', 'term_id' );
// $q->set( 'order', 'DESC' ); // by default is ASC so uncomment if you want DESC.
}
add_action( 'woocommerce_product_query', 'sort_products_by_brand' );发布于 2021-10-06 20:06:22
洪克31的答案为我工作得很好。我只需要稍微修改一下。
add_action( 'pre_get_posts', 'jwd_modify_product_query' );
function jwd_modify_product_query($query) {
if ( !is_admin() && $query->is_main_query() && is_post_type_archive( 'product' ) ) {
$query->set( 'orderby', 'pa_brand' );
}
}
// https://wordpress.stackexchange.com/a/363654/94213
// Answer by honk31
add_filter('posts_clauses', 'jwd_orderby_tax_clauses', 10, 2 );
function jwd_orderby_tax_clauses($clauses, $wp_query) {
global $wpdb;
$orderby = isset($wp_query->query_vars['orderby']) ? $wp_query->query_vars['orderby'] : false;
if ($orderby && $orderby === 'pa_brand') {
$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 = '{$orderby}' OR taxonomy IS NULL)";
$clauses['groupby'] = "object_id";
$clauses['orderby'] = "{$wpdb->terms}.term_order ASC";
$clauses['orderby'] .= ", {$wpdb->posts}.post_name ASC";
}
return $clauses;
}另一个需要的步骤是使用简单自定义邮政定单插件。插件将一个term_order列添加到代码用于排序的terms表中。拖放以更改产品中的术语顺序>属性>品牌。实际上,我不得不移动所有的条款,以获得正确的排序顺序。
不过,WooCommerce属性已经具有拖放功能。也许没有那个插件也可以做一些类似的事情。
https://stackoverflow.com/questions/69457962
复制相似问题