【问题标题】:Add meta_type in custom sorting using woocommerce使用 woocommerce 在自定义排序中添加 meta_type
【发布时间】:2014-10-20 05:56:30
【问题描述】:

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

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;
}

请在这个问题上帮助我。

谢谢

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    再次阅读文档和来源。 无论您在查询中将meta_type 设置为什么(实际上已被忽略,文档中没有此类参数),实际数据仍存储在wp_postmeta 表中,meta_value 具有LONGTEXT 类型的列中. 在LONGTEXT 列上排序应该会给你这些结果。这就是lexicographic order 的工作方式。

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

    orderby (string | array) - 按参数排序检索到的帖子

    'meta_value_num' - 按数字元值排序(可用于 2.8 版)。另请注意,还必须存在“meta_key=keyname” 在查询中。该值允许如上所述的数字排序 在“元值”中。

    幸运的是,woocommerce 通过设置$args['orderby'] = "meta_value_num"; 准确地公开了这一点,因为$args 直接发送到WP_Query

    这个 tells WP_Querycast meta_value 到数字类型(使用 +0):

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

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多