Измените статус заказа на «отменен» для предыдущих заказов, если пользователь покупает определенный продукт - PullRequest
0 голосов
/ 18 октября 2018

Я хочу изменить статус заказа на отмененный для более ранних покупок, если пользователь покупает определенный продукт (массив идентификаторов продуктов)

Я использую пользовательскую функцию get_order_ids_from_bought_items() из этой ветки ответов, которые позволяют мне получить идентификаторы заказов для конкретного клиента, которые соответствуют указанным идентификаторам продукта.

// The defined product IDs
product_ids = array(183,153);

$linked_order_ids = get_order_ids_from_bought_items(product_ids); //output : array(12,13);

, если клиент покупает какой-либо из этих продуктов ===> $special products = array(1788,123);

Я хочу изменить статус $linked_order_ids на отмененный

Поскольку get_order_ids_from_bought_items() также будет иметь последний порядок, я удаляю последний элемент из выводаэта функция использует array_pop($linked_order_ids );

Полный код

add_action('woocommerce_order_status_changed', 'woo_order_status_change_custom', 10, 3);
function changestatus()
{
    $product_ids = $newcustomer->wpprolister_array_intersect();

    $orderidstoremove = get_order_ids_from_bought_items($product_ids );
    $removed          = array_pop($orderidstoremove);

    foreach ($removed as $remove) {
        $order = wc_get_order( $remove );
        $order->update_status('cancelled', 'As you have brought new package this package has been cancelled');
    }

}

Но, например, не работает.

1 Ответ

0 голосов
/ 18 октября 2018

При использовании этого хука вы не можете использовать идентификатор текущего пользователя , вместо этого вам нужно извлечь идентификатор пользователя из объекта WC_Order… Тогда $newcustomer->wpprolister_array_intersect() can 't work.

Вам придется изменить весь связанный код существующих функций, чтобы иметь возможность обрабатывать определенный идентификатор пользователя

Кроме того, имя вашей функции не совпадает с подключаемым слагом обратного вызова.add_action())

Таким образом, ваш код должен выглядеть примерно так:

add_action('woocommerce_order_status_changed', 'wc_order_uppdate_to_cancelled_status', 20, 4 );
function wc_order_uppdate_to_cancelled_status( $order_id, $old_status, $new_status, $order ){
    // Targetting "processing" and "completed" orders status.
    if ( in_array( $new_status, array('processing', 'completed') ) ) {
        // Get the user ID
        $user_id  = $order->get_customer_id();

        $product_ids = wpprolister_array_intersect($user_id); // <== Changes in this function will be needed

        $matching_orders_ids    = get_order_ids_from_bought_items( $product_ids, $user_id );
        $orders_to_be_cancelled = array_pop( $orders_to_remove );

        foreach ( array_pop( $matching_orders_ids ) as $cancelled_order_id ) {
            $cancelled_order = wc_get_order( $cancelled_order_id );
            $$cancelled_order->update_status('cancelled', 'As you have brought new package this package has been cancelled');
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...