【问题标题】:Woocommerce: order by custom taxonomyWoocommerce:按自定义分类排序
【发布时间】:2016-09-07 05:08:10
【问题描述】:

我遇到以下问题。我已经使用 WooCommerce 建立了一个 Wordpress 网站,为一个只有书籍的网上商店提供服务。

我创建了一些基于分类法的产品属性,例如“publisher”和“author”(因为多个产品可以共享一个作者或一个出版商)

我希望能够不仅在 Woocommerce 默认字段(如“标题”和“价格”)上对我的产品进行排序,而且还可以在这些分类字段上对我的产品进行排序。 比如说: 按作者 ASC 订购按出版商 DESC 订购

据我所知,Wordpress 核心功能无法做到这一点。有人说这是因为按分类字段排序没有意义,但是对于上面的示例,我无法理解为什么您不想按例如作者排序。

我玩过 sortby meta_value,但这只是查询直接的 postmeta,而不是分类。

我了解 php,因此任何涉及我的 functions.php 文件中的附加代码的解决方案都可以。

【问题讨论】:

    标签: wordpress woocommerce sql-order-by taxonomy


    【解决方案1】:

    我找到了解决这个问题的方法: https://gist.github.com/jayarnielsen/12f3a586900aa6759639

    我稍微修改了代码,使其与 Woocommerce 用于按系统字段“title”和“price”排序的方式相同,它添加了一个名为“sortby”的 url 查询参数,其结构如下:“field”- “方向” 因此,要按名为“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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2021-07-30
      • 2014-02-06
      相关资源
      最近更新 更多