wordpress - Woocommerce:按自定义分类排序

标签 wordpress woocommerce sql-order-by taxonomy

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

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

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

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

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

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

最佳答案

我找到了解决这个问题的方法: 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;
    }
}

关于wordpress - Woocommerce:按自定义分类排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39163255/

相关文章:

php - 在结帐 WooCommerce 页面上获取购物车产品 ID,以显示产品图片

php - 使用 wp_remote_post 设置内容类型

php - 根据 Woocommerce 中的购物车总额添加或删除支付网关

css - 在 Woocommerce 中将结帐字段标签移到左侧

node.js - rethinkdb orderby 不区分大小写

mysql - mySQL 如何按日期时间排序?

html - 无论屏幕大小如何,将 DIV 居中到页面中心

javascript - 水平滚动到,用wordpress acf

php - 使用 sql 通过 csv 将产品导入到 woocommerce

MySQL order by ... 奇怪的顺序