Woocommerce价格排序不起作用

时间:2018-07-17 10:13:53

标签: php wordpress woocommerce

几乎所有在woocommerce网站上实现价格排序的指南都是相同的。我尝试了两种主要方法。 1-像这样从功能.php连接我的查询参数:

add_filter('woocommerce_get_catalog_ordering_args', 'my_custom_woocommerce_catalog_orderby');

function my_custom_woocommerce_catalog_orderby( $args ) {
    if(isset($_GET['sort'])){
      if($_GET['sort_by'] == 'by_rating'){        
        $args['meta_key'] = '_wc_average_rating';
      } else if($_GET['sort_by'] == 'by_price') {
        $args['meta_key'] = '_price';
      }
      $args['orderby']  = 'meta_value_num';
      $args['order'] = strtoupper($_GET['sort']);  
    }
    return $args;
} 

var_dump显示它已被捕获:

array(3) { ["orderby"]=> string(14) "meta_value_num" ["order"]=> string(4) "DESC" ["meta_key"]=> string(6) "_price" }

但是产品仍然按照默认的woocommerce设置(价格,升序)进行排序。

然后我实现了我的过滤器插件(效果很好),并尝试向其添加排序查询。

class My_blah_blah_filter {
  public static $instance;
  public $productquery;
  public static function init() {
    if ( is_null( self::$instance ) ) {
      self::$instance = new My_blah_blah_filter ();
    }
    return self::$instance;
  }
  private function __construct() {
    add_action( 'woocommerce_product_query', [ $this, 'filter_by_current_range' ] );
  }

  public function filter_by_current_range( $query ) {

    $this->productquery = $query;
    $query->set('tax_query', $this->get_tax_query());

    if(isset($_GET['sort'])){
      if($_GET['sort_by'] == 'by_rating'){
        $query->set('meta_key', '_wc_average_rating');
      } else if($_GET['sort_by'] == 'by_price') {
        $query->set('meta_key', '_price');
      } else {
        $query->set('meta_key', '_price');
      }
      $query->set('orderby', 'meta_value_num');
      $query->set('order', strtoupper($_GET['sort']));  
    }
  }

  public function get_tax_query() {

    // pa_space-overall
    $tax_query = [];
    if( isset( $_GET['max_so'] ) && isset( $_GET['min_so'] ) ) {
      $terms = get_terms([
        'taxonomy' => 'pa_space-overall',
      ]);
      $rlt = [];
      foreach( $terms as $term ) {
        if( (int) $term->name <= (int) $_GET['max_so'] && (int) $term->name >= (int) $_GET['min_so'] ) {
          $rlt[] = $term->term_id;
        }
      }

      $tax_query = [
        'relation' => 'AND',
        [
          'taxonomy' => 'pa_space-overall',
          'terms' => $rlt,
          'operator' => 'IN',
        ],
      ];
    }
    if( isset( $this->productquery->tax_query ) ) {
      $tax_query = array_merge( $this->productquery->query_vars['tax_query'], $tax_query );
    }

    return $tax_query;
}

这里有些东西是硬编码的,但事实并非如此,它的工作原理。但不是订购。它仍然被捕获,被添加到查询中,但是顺序仍然是默认的(价格,升序-来自woocommerce设置) 除了woocommerce之外,唯一的插件是高级自定义字段,与之无关。

无法在其他任何地方找到任何解决方案。有什么建议么?提前致谢。 对不起,英文不好或代码格式不正确

0 个答案:

没有答案