Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Woocommerce中按SKU对订单项进行排序_Php_Sorting_Woocommerce_Orders_Email Notifications - Fatal编程技术网

Php 在Woocommerce中按SKU对订单项进行排序

Php 在Woocommerce中按SKU对订单项进行排序,php,sorting,woocommerce,orders,email-notifications,Php,Sorting,Woocommerce,Orders,Email Notifications,我试图在Woocommerce中通过电子邮件在订单中按sku订购产品 我对以下代码没有任何运气 要帮忙吗?从现在开始谢谢你 add_filter( 'woocommerce_order_get_items', function( $items, $order ) { uasort( $items, function( $a, $b ) { return strnatcmp( $a['_sku'], $b['_sku'] ); }

我试图在Woocommerce中通过电子邮件在订单中按sku订购产品

我对以下代码没有任何运气

要帮忙吗?从现在开始谢谢你

add_filter( 'woocommerce_order_get_items', function( $items, $order ) {
    uasort( $items,
        function( $a, $b ) {
            return strnatcmp( $a['_sku'], $b['_sku'] );
        }
    );
    return $items;
}, 10, 2 );
样本排序结果:

  • INFI
  • 松饼
  • 花序
  • 英夫塔弗洛尔
  • 注入墨水
  • CTEPINK4
  • CTECAKE4
  • INFCHOCO
  • 乌库托马

于2020年7月更新

以下是实现这一目标的方法:

add_filter( 'woocommerce_order_get_items', 'filter_order_get_items_by_sku', 10, 3 );
function filter_order_get_items_by_sku( $items, $order, $types ) {
    if( count($items) > 1 ) {
        $item_skus = $sorted_items = array();

        // Loop through order line items
        foreach( $items as $items_id => $item ){
            // Check items type: for versions before Woocommerce 3.3
            if( $item->is_type('line_item') && method_exists( $item, 'get_product' ) ){
                $product = $item->get_product(); // Get the product Object
                if( is_a( $product, 'WC_Product' ) ) {
                    $item_skus[$product->get_sku()] = $items_id;
                }
            }
        }

        // Only for line items when our sku array is not empty
        if( ! empty($item_skus) ) {
            // Sorting in ASC order based on SKUs;
            ksort($item_skus); // or use krsort() for DESC order

            // Loop through sorted $item_skus array
            foreach( $item_skus as $sku => $item_id ){
                // Set items in the correct order
                $sorted_items[$item_id] = $items[$item_id];
            }
            $items = $sorted_items;
        }
    }
    return $items;
}
代码进入活动子主题(或活动主题)的function.php文件。测试和工作

这将按sku订单ASC对后端和前端订单以及电子邮件通知中的项目进行排序



此外,在将数据保存到数据库之前下单后对项目进行排序可能是一种更好的方法。

除了@LoicTheAztec之外,我在代码中添加了以下检查:

if ($product instanceof WC_Product) {
                    $item_skus[$product->get_sku()] = $items_id;
                }
这样可以防止前端客户订单页面出现错误

add_filter( 'woocommerce_order_get_items', 'filter_order_get_items_by_sku', 10, 3 );
function filter_order_get_items_by_sku( $items, $order, $types ) {
    if( count($items) > 1 ) {
        $item_skus = $sorted_items = array();

        // Loop through order line items
        foreach( $items as $items_id => $item ){
            // Check items type: for versions before Woocommerce 3.3
            if( $item->is_type('line_item') ){
                $product = $item->get_product(); // Get the product Object
                
                if ($product instanceof WC_Product) {
                    $item_skus[$product->get_sku()] = $items_id;
                }
            }
        }

        // Only for line items when our sku array is not empty
        if( ! empty($item_skus) ) {
            // Sorting in ASC order based on SKUs;
            ksort($item_skus); // or use krsort() for DESC order

            // Loop through sorted $item_skus array
            foreach( $item_skus as $sku => $item_id ){
                // Set items in the correct order
                $sorted_items[$item_id] = $items[$item_id];
            }
            $items = $sorted_items;
        }
    }
    return $items;
}

“我没有任何运气”不是一个问题的描述。为什么不呢?发生了什么,而不是你想发生什么?很抱歉没有解释清楚。我添加了一个关于它们如何排列的详细信息……我在一些旧的顺序中遇到了这个错误:在布尔值上调用成员函数get_sku(),有什么想法吗?Thanks@jpussacq这意味着您的数据库没有在旧订单上正确更新WC版本3+。我能做什么???@jpussacq我还没有遇到这个问题,所以我现在没有答案。这些订单有多久了?有件很奇怪的事。该错误不会在测试环境中生成,测试环境是生产过程的副本。