Я пытаюсь разрешить пользователям обновлять позиции своих подписок на панели своей учетной записи. Я могу получить их подписку по идентификатору подписки и показать им форму обновления. Прямо сейчас я показываю их с товарными знаками в их подписке, через которые я прошел
$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. Это возможно?
Поскольку я не вижу метод удаления элемента.
Спасибо
Обычно в 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 просто сгенерирует новый заказ, инициированный этим платежным шлюзом, когда наступит запланированная подписка.
Единственный способ — отменить подписку и создать новый процесс с самого начала …
Так что я смог сделать эту работу следующим.
примечание: я использую настраиваемое поле 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) )
)
));
}
}