如何实现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
相关产品推荐
相关产品推荐

