首页 > 解决方案 > 按 SKU 数字对 WooCommerce 产品进行排序 (1.2.3.4.5.6.......)

问题描述

在管理产品列表上的 WooCommerce 版本 4.2.2 中,当我尝试按 SKU(列)对产品进行排序时,结果是:1 10 100 101 102 103 104 ...
相反,我希望它按自然顺序排列,例如:1 2 3 4 5 ... 9 10 11 ... 99 ... 100 101 ...

当我使用 WooCommerce 产品搜索(版本 2.21.0)时,也会发生同样的事情。

试图了解正在发生的事情,我注意到如果我在管理面板中搜索产品,它会返回太多结果,而且并非所有产品都会发生这种情况,有些工作它只会给我带来 1 个单一产品,而其他产品会带来更多。

我尝试重新安装所有 Wordpress、WooCommerce 和 WooCommerce 产品搜索,没有任何更改。我用相同的结果测试了其他搜索插件。

请问有什么帮助吗?

标签: phpsqlwordpresswoocommercehook-woocommerce

解决方案


StackOverFlow 中的规则当时是一个问题……所以我正在回答管理产品列表。

以下挂钩函数将允许按自然排序顺序按数字 sku 对产品进行排序,更改相关 SQL 查询中的ORDER BYABS()使用:

add_filter( 'posts_clauses', 'admin_products_list_orderby_sku_as_int', 999, 1 );
function admin_products_list_orderby_sku_as_int( $posts_clauses ){
    global $pagenow, $typenow, $wp_query;

    $query_vars = $wp_query->query_vars;

    if ( $pagenow == 'edit.php' && 'product' === $typenow && isset( $_GET['post_type'] )
    && isset( $query_vars['orderby'] ) && 'sku' === $query_vars['orderby'] ) {
        $orderby   = strtolower( $query_vars['orderby'] );
        $order     = isset( $query_vars['order'] ) ? strtoupper( $query_vars['order'] ) : 'DESC';

        if ( 'DESC' === $order ) {
            $posts_clauses['orderby'] = ' ABS( wc_product_meta_lookup.sku ) DESC, wc_product_meta_lookup.sku DESC, wc_product_meta_lookup.product_id DESC ';
        } else {
            $posts_clauses['orderby'] = ' ABS( wc_product_meta_lookup.sku ) ASC, wc_product_meta_lookup.sku ASC, wc_product_meta_lookup.product_id ASC ';
        }
    }
    return $posts_clauses;
}

代码在您的活动子主题(或活动主题)的functions.php 文件中。测试和工作。

请参阅:SQL ORDER chars numeric


推荐阅读