首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按属性项菜单顺序订购WooCommerce产品

如何按属性项菜单顺序订购WooCommerce产品
EN

Stack Overflow用户
提问于 2021-10-05 22:36:31
回答 2查看 869关注 0票数 0

假设有一个产品属性“品牌”具有以下术语:

  • 品牌A
  • 品牌B
  • C品牌

我们还可以这样说,在产品>属性>大小中,这些术语的菜单顺序是这样的:

  • C品牌
  • 品牌A
  • 品牌B

如何根据属性菜单顺序对商店页面上的产品进行排序?例如:

  • C品牌产品
  • A品牌产品
  • B品牌产品

假设每个产品只有一个品牌属性项。

到目前为止,我认为代码可能涉及使用pre_get_posts钩子修改查询,但我很难以这种方式定制顺序。

EN

回答 2

Stack Overflow用户

发布于 2021-10-06 08:15:05

由于get_terms()正在返回我们为属性设置的顺序,所以我们可以获取这些ids并将它们用作排序。

代码语言:javascript
复制
//Change taxonomy if you need.
$terms = get_terms( array('taxonomy' => 'pa_brand','fields' => 'ids'));

从这里我们可以使用woocommerce_product_query修改我们的查询。

最后,将查询的顺序设置为term_id ASC或DESC。

这是我的解决办法

代码语言:javascript
复制
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' );
票数 0
EN

Stack Overflow用户

发布于 2021-10-06 20:06:22

洪克31的答案为我工作得很好。我只需要稍微修改一下。

代码语言:javascript
复制
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属性已经具有拖放功能。也许没有那个插件也可以做一些类似的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69457962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档