【问题标题】:Sort products by brand and price in Woocommerce在 Woocommerce 中按品牌和价格对产品进行排序
【发布时间】:2021-04-21 20:04:27
【问题描述】:

在尝试通过修改来重现此处 (Sort products by brand and title in Woocommerce) 找到的解决方案时,我遇到了一根骨头……

第一种按品牌排序就像一个魅力,但我找不到通过增加或降低价格来进行第二种排序的方法。

add_filter('posts_clauses', 'posts_clauses_with_tax', 10, 2);
function posts_clauses_with_tax( $clauses, $wp_query ) {
global $wpdb;

$taxonomies = array('pwb-brand');

$orderBy['field'] = "pwb-brand";
$orderBy['direction'] = "ASC";

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}.slug ORDER BY slug ASC) ";
    $clauses['orderby'] .= ", {$wpdb->posts}.post_title ASC";
    return $clauses;
}
else {
    return $clauses;
}
}

我已经找到了这些行,但是我很难在上面的查询中添加这些行来用价格 ASC 替换 orderby 标题

$clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} price ON( {$wpdb->posts }.ID = price.post_id AND price.meta_key = 'price') ";
$clauses['orderby'] = " CONVERT( REPLACE(price.meta_value, '$', ''), DECIMAL(13,2) ) " . $order;

你知道解决办法吗?

【问题讨论】:

    标签: php sorting woocommerce product price


    【解决方案1】:

    好吧,总是在我们写下问题并提出答案时...

    这是使用插件 Perfect Brands for WooCommerce 在您的 WooCommerce 中添加自定义过滤器品牌和价格 ASC 的完整解决方案

    首先,添加自定义过滤器:

    add_filter( 'woocommerce_catalog_orderby', 'my_add_custom_sorting_options' );
    add_filter( 'woocommerce_default_catalog_orderby_options',  'my_add_custom_sorting_options' );
    function my_add_custom_sorting_options( $options ){
        $options['brands'] = __("Tri par marque / prix croissant", "yourdomain");
        return $options;
    }
    

    比添加

    add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' );
    function custom_woocommerce_get_catalog_ordering_args( $args ) {
        $orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
        if ( 'brands' == $orderby_value ) {
            add_filter('posts_clauses', 'posts_clauses_brands_price', 10, 2);
        }
        return $args;
    }
    

    终于

    function posts_clauses_brands_price( $clauses, $wp_query ) {
        global $wpdb;
            
        $taxonomies = array('pwb-brand');
            
        $orderBy['field'] = "pwb-brand";
        $orderBy['direction'] = "ASC";
            
        if( in_array($orderBy['field'], $taxonomies) ) {
            $clauses['join'] .= " LEFT JOIN {$wpdb->wc_product_meta_lookup} wc_product_meta_lookup ON $wpdb->posts.ID = wc_product_meta_lookup.product_id ";
            $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}.slug ORDER BY slug ASC) ";
            $clauses['orderby'] .= ', wc_product_meta_lookup.min_price ASC, wc_product_meta_lookup.product_id ASC ';
    
            return $clauses;
        }
        else {
            return $clauses;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2020-12-28
      相关资源
      最近更新 更多