2014-10-20 30 views
0

我正在使用以下代碼在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; 
} 

請幫我解決這個問題。

謝謝

回答

0

再次閱讀文檔和來源。 無論您在查詢中設置了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; 
相關問題