Добавить способ доставки программно после оформления заказа - WooCommerce - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь внедрить способ доставки сразу после оформления заказа.К сожалению, это не очень хорошо работает, и я не уверен, почему.Я попробовал все хуки после оформления заказа, но ...

Вот мой код:

add_action('woocommerce_checkout_create_order', 'action_checkout_order_processed', 10, 1);
function action_checkout_order_processed( $order ) {

    $item = new WC_Order_Item_Shipping();

    $item->set_method_title( "Безплатна Доставка - Speedy" );
    $item->set_method_id( "speedy_shipping_method" ); // set an existing Shipping method rate ID
    $item->calculate_taxes("0");

    $shipping_item_id = $order->add_item( $item );

    wc_add_order_item_meta($shipping_item_id, "method_id", "speedy_shipping_method");
    wc_add_order_item_meta($shipping_item_id, "instance_id", "0");
    wc_add_order_item_meta($shipping_item_id, "cost", "0");
    wc_add_order_item_meta($shipping_item_id, "total_tax", maybe_unserialize('a:1:{s:5:"total";a:0:{}}'));

    $order->calculate_totals();

    $order->update_status('on-hold');

    $order->save();

}

Это рабочий код в другой функции, поэтому у меня должно быть что-то ещенеправильно, но не уверен, что.

Заранее спасибо, если кто-нибудь может дать мне подсказку!

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Я не очень понимаю, чего вы пытаетесь достичь ... Но вы можете попробовать использовать другой хук?

add_action( 'woocommerce_thankyou', 'action_checkout_order_processed', 10, 1 );

Это запустит ваш код, когда клиент достигнет страницы благодарности. OR

add_action( 'woocommerce_order_status_processing', 'action_woocommerce_order_status_processing', 10, 1 ); 

Запустит ваш код, когда статус заказа изменится на обработку.

0 голосов
/ 11 июля 2019

Я нашел решение, если у кого-то возникли проблемы с этим. Я изменил вывод заказа администратора в include / admin / meta-boxes / html-order-shipping.php, и там я принудительно загружал свой пользовательский метод при каждом заказе, поэтому в этом случае пользователь видит правильный метод во внешнем интерфейсе, и затем я успешно обновляю метод только в бэкэнде, и это именно то, чего я пытался достичь.

0 голосов
/ 11 июля 2019

Вам нужно увеличить приоритет add_action.

add_action('woocommerce_checkout_create_order', 'action_checkout_order_processed', 10, 1);

Подробнее см. По следующей ссылке.

https://developer.wordpress.org/reference/functions/add_action/

do_action ('woocommerce_after_checkout_shipping_form', $ wccs_custom_checkout_field_pro);

...