使用自定义字段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

在用户 Select 他的汽车插件的YearMakeModel后,将两个值:Min_Diameter,Max_Diameter写入Cookie...

现在,我需要根据这两个值对轮子进行排序.假设用户 Select Car,值为Min:19,Max:21,则应按19-21和其他值筛选sort个轮子(不过滤).

根据文档:WP_Query这应该能起到作用.但由于某些原因不起作用.try 使用Better和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;
}

推荐答案

我想你已经在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
        ) );
    }
}

应该能行得通.

Php相关问答推荐

Postgrid Webhook不叫laravel

如何优化-PHP 7.3.14+Laravel 6

将带有值的属性添加到WooCommerce产品,保留现有属性

在特定日期之间使用特定的元密钥销售产品

闭包绑定$This和垃圾收集器

PHP -多维数组到一维数组

PHP从响应应用程序json获取文件代码和URL

是否重新排序多维数组元素以将所有子数组中的子数组移动到元素列表的底部?

在Symfony 6.4中将工作流动态添加到服务

在个人资料页面上显示个人资料图像

使用随机生成器在MYSQL中创建唯一ID-定义一个数组来存储已知ID是否安全

PHP按另一个二维数组的排序顺序对二维数组进行排序

shell_exec运行大型数据处理

是否有条件判断是否发布了另一个Wordpress页面?

从WooCommerce订单项目获取Dokan卖家详细信息

为什么从一个页面到另一个页面都找不到 JQuery,因为它们使用相同的 twig 模板?

invalid_grant 和无效的 JWT 签名

如何在 PHP 中对具有相同数组值的值求和

带有分类术语数组的 WordPress Elementor 自定义查询 - 如何要求所有术语都在返回的帖子中

Laravel Eloquent(where 子句)