Сортировка позиций заказа через подключенную функцию в WooCommerce - PullRequest
1 голос
/ 25 апреля 2019

В WooCommerce у меня есть атрибут продукта pa_location для "местоположения", с помощью которого я сортирую элементы своего заказа.Когда элементы заказа имеют одинаковое расположение, я бы хотел отсортировать их по артикулу.Итак, сортировка сначала по местоположению, а затем по SKU.

Я посмотрел на " PHP, сортирующий несколько полей " , но я не могу понять, как это применяется ибудет работать для моей функции.

У меня есть эта пользовательская функция, которая работает для сортировки по 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, используя эту функцию.Сейчас это только сортировка по местоположению.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Попробуйте следующее на основе " PHP usort сортировка нескольких полей " поток ответов:

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.

0 голосов
/ 25 апреля 2019

Попробуйте:

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 );

Я перезапустил uasort() для _sku.Я не проверял код, но я надеюсь, что он может помочь вам.

...