Обновление подписок WooCommerce Строка заказа Программно

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

$subscription = wcs_get_subscription($_GET['subscription']);
$subscription_items = $subscription->get_items();

Я пытаюсь разрешить пользователям обновлять количество своего продукта. Поэтому, если они обновляют количество, я хочу обновить количество позиций подписки, чтобы будущие заказы генерировались с обновленным количеством.
Я видел, что есть метод update_product в WC_Abstract_Order учебный класс. Я думаю, что это можно использовать, но я запутался в этой заметке в комментариях:

* Update a line item for the order.
*
* Note this does not update order totals.

Нужно ли пересчитывать итоги, когда я использую это?
Также мне нужно было удалить позицию, когда количество было 0. Это возможно?

Поскольку я не вижу метод удаления элемента.

Спасибо

1

Решение

Обычно в woocommerce, когда заказ создается после оплаты (я имею в виду checkout => thankyou), вы больше не можете редактировать детали заказа. Обновление количества, удаление / добавление товаров — это методы корзины WC.

С плагином подписок, с каждым начальным типом поста shop_order, существует начальный тип поста shop_subscription и тип поста запланированного действия, генерируемый одновременно (и идентификаторы постов следуют друг за другом). Например:

Initial (post type) 'shop_order' -> ID is        412
Initial (post type) 'shop_subscription' -> ID is 413  (and 'post_parent': 412)
Initial (post type) 'scheduled-action' -> ID is  414

Вы можете видеть это в своей базе данных wp_posts Таблица.

Мы могли бы обновить сумму в wp_postmeta стол для 'post_id' => '413' с соответствующим meta_key '_order_total' используя в этом случае update_post_meta() функция.

НО это не будет работать, потому что следующий запланированный платеж по подписке обрабатывается платежным шлюзом (PayPal или другие) и Вы не можете изменить любое количество этой подписки.

WooCommerce просто сгенерирует новый заказ, инициированный этим платежным шлюзом, когда наступит запланированная подписка.

Единственный способ — отменить подписку и создать новый процесс с самого начала …

3

Другие решения

Так что я смог сделать эту работу следующим.

  1. Удалить все позиции заказа из объекта подписки.
  2. Запустите $ _POST, чтобы получить измененное количество
  3. Добавить товар в подписку снова.

примечание: я использую настраиваемое поле price_level, так как оно было динамически оценено во время подписки, и мы хотели использовать его так, чтобы цена была такой же, как и при подписке.

    //remove product items
$subscription->remove_order_items('line_item');
//add product item again
foreach($_POST['quantity'] as $product_id => $qty) {
if($qty > 0) {
//we will need to set dynamic prices based on cusotm field
$price_level = get_field('coffee_price_level', $subscription->id);
//Get the product
$product = wc_get_product($product_id);
//set the price
$product->set_price(floatval($price_level));
$tax = ($product->get_price_including_tax()-$product->get_price_excluding_tax())*$qty;
//subscription item price level
$subscription->add_product($product, $qty, array(
'totals' => array(
'subtotal'     => $product->get_price(),
'subtotal_tax' => $tax,
'total'        => $product->get_price(),
'tax'          => $tax,
'tax_data'     => array( 'subtotal' => array(1=>$tax), 'total' => array(1=>$tax) )
)
));
}
}
3

По вопросам рекламы [email protected]