Я строю магазин woocommerce для продажи старинных карт, как оригиналов, так и цифровых отпечатков.Карты, таким образом, устанавливаются как две вариации одного и того же продукта: «Оригинал» и «Печать».«Оригинал» - это просто оригинальная античная карта, но «Печать» имеет множество параметров, таких как кадрирование, монтаж и размер печати, и они задаются пользователем на странице одного продукта с помощью jquery.
Мне удалось разрешить пользователям выбирать из ряда вариантов на одной странице продукта и, таким образом, динамически генерировать цену за продукт, который они покупают, исходя из размера, количества, комплектации и вариантов монтажа, которые онивыберите.
Это делается с помощью jquery, а опции (включая цену) передаются в корзину с использованием скрытых полей и пользовательских данных следующим образом, где isset ($ _ REQUEST ['price']) относится к скрытомуполе цены, установленное jquery (это их загрузка для кадрирования, монтажа, размера и т. д., но это дает представление:
if(isset($_REQUEST['price']) && ! empty( 'price' )) {
$order_item_price = sanitize_text_field($_REQUEST['price']);
$cart_item_data['custom_data']['order_price'] = array(
'label' => 'Total this item',
'value' => '£' . $order_item_price
);
}
... это прекрасно работает. Цена и общая цена (вместе с другимипользовательская информация о продукте) отображается в корзине, а общее количество внизу корзины совпадает с ценами на продукт. Я использую эту функцию для достижения этой цели:
function update_price_in_cart( $cart_obj ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
if( ! is_cart() ) {
return;
}
// Iterate through each cart item
foreach( $cart_obj->get_cart() as $item_key=>$cart_item ) {
if( isset( $cart_item['total_price'] ) || isset( $cart_item['total_price_original'] ) ) {
$price = $cart_item['total_price'] + $cart_item['total_price_original'];
$cart_item['data']->set_price( ( $price ) );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'update_price_in_cart', 10, 1 );
Проблема заключается в том, когда пользователь переходитк оформлению заказа. Все данные, созданные с использованием скрытых полей (тип рамы, тип крепления, размер, цена), отображаются в левой частина странице, где написано «продукт», но итоги справа рядом с каждым заказанным продуктом устанавливаются на исходную цену, установленную для варианта «Печать», установленного в продукте woocommerce в WordPress.
Я пробовалдатирование с использованием чего-то подобного (ниже приведен тест с использованием статических значений):
function update_price_in_checkout($cart_obj) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
var_dump($cart_item_data['custom_data']['order_price']);
if( isset( $cart_item['total_price'] ) || isset( $cart_item['total_price_original'] ) ) {
WC()->cart->total = 597;
} else {
WC()->cart->total = 1;
}
}
add_action( 'woocommerce_review_order_before_order_total', 'update_price_in_checkout' );
... но a.он принимает только статическое число, так как не берет скрытые поля и b.он не касается отдельных цен на товары справа от кассы.
В целом - мне нужно найти способ заменить базовую цену продукта, по которой отображается справа, на рассчитанную итоговую сумму.на ввод пользователя.Все это прекрасно работает на странице корзины, но не переносится на страницу оформления заказа.
Удаление с помощью stackoverflow Я думаю, что установка его в woocommerce_checkout_create_order_line_item может быть идеей, но я не могу понять, как это сделать.
Есть идеи?