Пользовательская цена Woocommerce не передается из корзины в кассу - PullRequest
0 голосов
/ 06 декабря 2018

Я строю магазин 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 может быть идеей, но я не могу понять, как это сделать.

Есть идеи?

1 Ответ

0 голосов
/ 07 декабря 2018

Следующий код добавит в качестве пользовательского значения для данных об элементе корзины цену выбранных вами товаров (из скрытого поля продукта) и обновит цену элемента корзины:

// Get custom field value, calculate new item price, save it as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_field_data', 20, 3 );
function add_custom_field_data( $cart_item_data, $product_id, $variation_id ) {
    if (isset($_REQUEST['price']) && !empty($_REQUEST['price'])) {
        $cart_item_data['custom_price'] = sanitize_text_field($_REQUEST['price']);
        $cart_item_data['unique_key']   = md5(microtime().rand());
    }
    return $cart_item_data;
}

// Update price
add_action( 'woocommerce_before_calculate_totals', 'update_price_in_cart', 10, 1 );
function update_price_in_cart( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach( $cart->get_cart() as $cart_item ) {
        if( isset( $cart_item['custom_price'] ) ) {
            // Add options to the product price
            $cart_item['data']->set_price( $cart_item['data']->get_price() + $cart_item['custom_price'] );
        }
    }
}

Код входит в функцию.PHP-файл вашей активной дочерней темы (или активной темы).Протестировано и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...