WooCommerce 目录订单基于元数据的自定义范围

问题描述 投票:0回答:1

使用自定义字段 ID:_diameter

woocommerce_wp_text_input(
    array(
        'id' => '_diameter',
        'label' => __('Diameter', 'woocommerce'),
        'placeholder' => __('Enter diameter...', 'woocommerce'),
        'desc_tip' => 'true',
        'description' => __('Enter the diameter for this product.', 'woocommerce'),
        'type' => 'number',
        'custom_attributes' => array(
            'step' => 'any',
            'min' => '0'
        )
    )
);

它存储了车轮的值。 15-28

用户选择汽车插件的 YearMakeModel 后,将两个值:Min_Diameter、Max_Diameter 写入 Cookie...

现在我需要根据这两个值对我的轮子进行排序。假设用户选择汽车并且值为最小值:19,最大值:21,那么它应该按 19-21 中的值以及其他值对车轮进行排序(不是筛选)。

根据文档:WP_Query这应该可以解决问题。但由于某种原因不工作。尝试使用 Between 和 IN

function custom_sort_by_recommended( $sort_args ) {
    if ( isset( $_GET['orderby'] ) && $_GET['orderby'] == 'recommended' ) {
        // Read cookie values
        $min_diameter = isset( $_COOKIE['Min_Diameter'] ) ? intval( $_COOKIE['Min_Diameter'] ) : 0;
        $max_diameter = isset( $_COOKIE['Max_Diameter'] ) ? intval( $_COOKIE['Max_Diameter'] ) : PHP_FLOAT_MAX;

        // Modify the query args
        $sort_args['meta_query'] = array(
            'relation' => 'AND',
            array(
                'key'     => '_diameter',
                'value'   => array( $min_diameter, $max_diameter ),
                'compare' => 'BETWEEN',
            )
            
        ); 
                // Custom sorting order
        $sort_args['orderby'] = array(
            'meta_value_num' => 'ASC', // Sort by diameter ascending
        );
      
    }
    return $sort_args;
}
php wordpress sorting woocommerce product
1个回答
0
投票

我想你已经将你的函数挂在了

woocommerce_get_catalog_ordering_args
钩子中。

我还假设您添加了自定义“推荐”排序选项,例如:

add_filter( 'woocommerce_catalog_orderby', 'add_catalog_orderby_recommended' );
function add_catalog_orderby_recommended( $orderby ) {
    $orderby['recommended'] = __('Sort by recommended', 'woocommerce');
    return $orderby;
}

现在,请注意

$sort_args
仅处理“orderby”和“order”,但不处理“meta_query”。

然后您将用以下内容替换现有的挂钩函数:

add_filter( 'woocommerce_get_catalog_ordering_args', 'catalog_ordering_by_recommended', 10, 3 );
function catalog_ordering_by_recommended( $args, $orderby, $order ) {
    if ( isset( $_GET['orderby'] ) && $_GET['orderby'] === 'recommended' ) {
        // Custom sorting order
        $args['orderby'] = array(
            'meta_value_num' => 'ASC', // Sort by diameter ascending
        );
    }
    return $args;
}

add_filter( 'woocommerce_product_query', 'product_query_by_recommended', 10, 1 );
function product_query_by_recommended( $q ) {
    if ( isset($_GET['orderby']) && $_GET['orderby'] === 'recommended' ) {
        // Read cookie values
        $min_diameter = isset( $_COOKIE['Min_Diameter'] ) ? intval( $_COOKIE['Min_Diameter'] ) : 0;
        $max_diameter = isset( $_COOKIE['Max_Diameter'] ) ? intval( $_COOKIE['Max_Diameter'] ) : PHP_FLOAT_MAX;

        $meta_query = $q->get('meta_query');

        $meta_query['relation'] = 'AND';
        $meta_query[] = array(
            'key'     => '_diameter',
            'value'   => array( $min_diameter, $max_diameter ),
            'compare' => 'BETWEEN',
            'type'    => 'NUMERIC',
        ); 
        $q->set('meta_query', $meta_query);
        $q->set('orderby', array(
            'meta_value_num' => 'ASC', // Sort by diameter ascending
        ) );
    }
}

应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.