You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现WooCommerce商品按decimalwidth属性值升序排序?

WooCommerce商品按decimalwidth属性排序问题解决

我的WooCommerce店铺有2800个商品,每个商品都设置了decimalwidth属性,以小数形式存储商品宽度(如0.5、1.0、1.5等)。我希望商品目录页按宽度从小到大排序,但尝试了ChatGPT、Copilot、Perplexity生成的代码(需粘贴到主题functions.php文件)及其他方案均未生效。

之前尝试的无效代码

// Add custom sorting options for decimalwidth attribute
add_filter('woocommerce_get_catalog_ordering_args', 'custom_decimalwidth_orderby');

function custom_decimalwidth_orderby($args)
{
    $orderby_value = isset($_GET['orderby']) ? wc_clean(wp_unslash($_GET['orderby'])) : '';
    
    if ('decimalwidth' == $orderby_value) {
        $args['orderby'] = 'meta_value_num'; // Sorting by numeric value
        $args['order'] = 'ASC'; // Ascending order
        $args['meta_key'] = 'pa_decimalwidth'; // Meta key for decimalwidth attribute
    }
    
    return $args;
    }  


// Add custom sorting options to the dropdown
add_filter('woocommerce_catalog_orderby', 'custom_add_decimalwidth_orderby');

function custom_add_decimalwidth_orderby($sortby)
{
    $sortby['decimalwidth'] = __('Sort by Decimal Width', 'woocommerce');
    return $sortby;
}

解决方法

有用户指出需将属性转为元值而非商品属性。由于decimalwidth已作为商品属性存在,只需按以下步骤处理数据:

  • 导出所有商品
  • 在导出的表格中添加与decimalwidth属性列对应的meta列(列名设为decimalwidth)
  • 按SKU匹配更新商品数据后重新导入

之后添加以下代码到主题的functions.php文件即可实现需求:

add_filter( 'woocommerce_catalog_orderby', 'add_custom_sorting_option' );

function add_custom_sorting_option( $sortby ) {
    $sortby['decimalwidth_asc'] = 'Width: Ascending';
    $sortby['decimalwidth_desc'] = 'Width: Descending';
    return $sortby;
}

add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_sorting_query_args', 10, 3 );

function custom_sorting_query_args( $args, $orderby, $order ) {
    switch ( $orderby ) {
        case 'decimalwidth_asc':
            $args['orderby'] = 'meta_value_num';
            $args['order'] = 'ASC';
            $args['meta_key'] = 'decimalwidth';
            break;
        case 'decimalwidth_desc':
            $args['orderby'] = 'meta_value_num';
            $args['order'] = 'DESC';
            $args['meta_key'] = 'decimalwidth';
            break;
    }
    return $args;
}


add_filter( 'get_meta_sql', 'custom_sorting_float_meta_query', 10, 6 );

function custom_sorting_float_meta_query( $sql, $queries, $type, $primary_table, $primary_id_column, $context ) {
    if ( ! empty( $context->query_vars['orderby'] ) && $context->query_vars['orderby'] == 'meta_value_num' ) {
        if ( ! empty( $context->query_vars['meta_key'] ) && $context->query_vars['meta_key'] == 'decimalwidth' ) {
            $sql['orderby'] = str_replace( 'ORDER BY', 'ORDER BY CAST(' . $primary_table . '.meta_value AS DECIMAL(10,2))', $sql['orderby'] );
        }
    }
    return $sql;
}


add_filter('woocommerce_default_catalog_orderby', 'custom_default_catalog_orderby');
add_filter('woocommerce_get_catalog_ordering_args', 'custom_catalog_ordering_args');

function custom_default_catalog_orderby($default_orderby) {
    return 'decimalwidth_asc';
}

function custom_catalog_ordering_args($args) {
    $orderby_value = isset($_GET['orderby']) ? wc_clean($_GET['orderby']) : apply_filters('woocommerce_default_catalog_orderby', get_option('woocommerce_default_catalog_orderby'));
    
    if ($orderby_value == 'decimalwidth_asc') {
        $args['orderby'] = 'meta_value_num';
        $args['order'] = 'ASC';
        $args['meta_key'] = 'decimalwidth';
    }
    
    return $args;
}

add_filter('woocommerce_catalog_orderby', 'custom_catalog_orderby_options');

function custom_catalog_orderby_options($sortby) {
    unset($sortby['popularity']);
    unset($sortby['date']);
    unset($sortby['price']);
    unset($sortby['price-desc']);
    return $sortby;
}  

内容的提问来源于stack exchange,提问作者TexasCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:31:04