【问题标题】:Sorting order items via a hooked function in WooCommerce通过 WooCommerce 中的挂钩功能对订单项目进行排序
【发布时间】:2019-09-15 07:27:51
【问题描述】:

在 WooCommerce 中,我有一个用于“位置”的产品属性 pa_location,用于对我的订单商品进行排序。当订单商品的位置相同时,我想按 SKU 对它们进行排序。因此,首先按位置排序,然后按 SKU。

我查看了 "PHP usort sorting multiple fields",但我无法弄清楚它是如何应用的以及如何适用于我的功能。

我有这个自定义函数可以按pa_location 排序,但不能让它也按_sku 排序。

我尝试实现参考文章中关于排序的一些示例。

add_filter( 'woocommerce_order_get_items', function( $items, $order ) {

    uasort( $items,
        function( $a, $b ) {
            return strnatcmp( $a['pa_location'], $b['pa_location'] );
        }
    );

    return $items;
}, 10, 2 );

我希望使用此功能按位置然后按 SKU 进行排序。现在它只是按位置排序。

【问题讨论】:

    标签: php wordpress sorting woocommerce orders


    【解决方案1】:

    根据 "PHP usort sorting multiple fields" 回答线程尝试以下操作:

    add_filter( 'woocommerce_order_get_items', 'filter_order_get_items_callback', 10, 2 );
    function filter_order_get_items_callback( $items, $order ) {
        uasort( $items,
            function( $a, $b ) {
                if( $a['pa_location'] == $b['pa_location'] ) {
                    return strcmp( $a['_sku'], $b['_sku'] );
                }
                return strnatcmp( $a['pa_location'], $b['pa_location'] );
            }
        );
    
      return $items;
    
    }
    

    测试:

    $items = array (
        0 => array ( 'pa_location' => 'Marseille',
            '_sku' => '27458C' ),
        1 => array ( 'pa_location' => 'Nice',
            '_sku' => '32458A' ),
        2 => array ('pa_location' => 'Cannes',
            '_sku' => '35C7L5' ),
        3 => array ('pa_location' => 'Marseille',
            '_sku' => '387B85'),
        4 => array ( 'pa_location' => 'Cannes',
            '_sku' => '25A587' )
    );
    
    uasort( $items, function( $a, $b ) {
        if( $a['pa_location'] == $b['pa_location'] ) {
            return strcmp( $a['_sku'], $b['_sku'] );
        }
        return strnatcmp( $a['pa_location'], $b['pa_location'] );
    } );
    // Raw output
    echo '<pre>'; print_r( $items ); echo '<pre>';
    

    我们得到这个输出:

    Array
    (
        [2] => Array
            (
                [pa_location] => Cannes
                [_sku] => 25A587
            )
        [4] => Array
            (
                [pa_location] => Cannes
                [_sku] => 35C7L5
            )
        [0] => Array
            (
                [pa_location] => Marseille
                [_sku] => 27458C
            )
        [3] => Array
            (
                [pa_location] => Marseille
                [_sku] => 387B85
            )
        [1] => Array
            (
                [pa_location] => Nice
                [_sku] => 32458A
            )
    )
    

    这是我们所期望的,首先排序pa_location,然后排序_sku。

    【讨论】:

      【解决方案2】:

      试试这个:

      add_filter( 'woocommerce_order_get_items', function( $items, $order ) {
      
          uasort( $items,
              function( $a, $b ) {
                  return strnatcmp( $a['pa_location'], $b['pa_location'] );
              }
          );
      
          uasort( $items,
              function( $a, $b ) {
                  return strnatcmp( $a['_sku'], $b['_sku'] );
              }
          );
      
          return $items;
      }, 10, 2 );
      

      我已为_sku 重新运行uasort()。我没有测试过代码,但我希望它可以为你完成这项工作。

      【讨论】:

        猜你喜欢
        • 2021-04-21
        • 1970-01-01
        • 2018-05-09
        • 2017-06-10
        • 2020-08-17
        • 2017-09-17
        • 2018-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多