使用woocommerce在自定义排序中添加meta_type

问题描述:

我正在使用以下代码在woocommerce中进行自定义排序。这工作正常。唯一的是我必须根据数字进行排序。我已经使用meta_type = UNSIGNED但这不起作用。使用woocommerce在自定义排序中添加meta_type

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']) ? woocommerce_clean($_GET['orderby']) : apply_filters('woocommerce_default_catalog_orderby', get_option('woocommerce_default_catalog_orderby')); 

if ('timer' == $orderby_value) { 
    $args['meta_key'] = '_auction_dates_to_time'; 
    $args['meta_type'] = 'UNSIGNED'; 
    $args['orderby'] = "meta_value"; 
    $args['order']  = 'ASC'; 
    $args['paged']  = $paged; 
} 
if ('timer-desc' == $orderby_value) { 
    $args['meta_key'] = '_auction_dates_to_time'; 
    $args['meta_type'] = 'UNSIGNED'; 
    $args['orderby'] = "meta_value"; 
    $args['order']  = 'DESC'; 
    $args['paged']  = $paged; 
} 
return $args; 
} 

add_filter('woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby'); 
add_filter('woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby'); 

function custom_woocommerce_catalog_orderby($sortby) { 
    $sortby['timer'] = 'Sort by Bid End Time: low to high'; 
    $sortby['timer-desc'] = 'Sort by Bid End Time: high to low'; 
    return $sortby; 
} 

请帮我解决这个问题。

谢谢

再次阅读文档和来源。 无论您在查询中设置了meta_type(它实际上被忽略,文档中没有这样的参数),实际数据仍存储在wp_postmetameta_value列中,该列的类型为LONGTEXT。 排序在LONGTEXT列应该给你的结果。这就是lexicographic order的作品。

仅限于您可以做的事情是将CAST列转换为数字类型,从而告诉数据库它应该进行数字排序。 你做到这一点与自定义SQL查询,使用this内置WP_Query功能:

排序依据(字符串|数组) - 排序检索到的帖子由参数

“meta_value_num” - 订购数字元值(可用于 版本2.8)。还要注意,查询中还必须存在'meta_key = keyname' 。该值允许在'meta_value'中如上所述 进行数字排序。

幸运的是woocommerce暴露出正是通过设置:$args['orderby'] = "meta_value_num";因为$args直接发送到WP_Query

tellsWP_Querymeta_value为数值类型(使用+0):

case 'meta_value_num': 
    $orderby = "$wpdb->postmeta.meta_value+0"; 
    break;