使用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_postmeta
表meta_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_Query
到投meta_value
为数值类型(使用+0
):
case 'meta_value_num':
$orderby = "$wpdb->postmeta.meta_value+0";
break;