Установите цену товара в корзине из пользовательской цены скрытого поля ввода в Woocommerce 3

avatar
logos_164
12 сентября 2018 в 21:36
3089
1
4

В Woocommerce я использовал jQuery для расчета пользовательской цены на страницах одного продукта, и теперь мне нужно передать это значение в корзину.

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

Вот мой настоящий код:

// Hidden input field in single product page
add_action( 'woocommerce_before_add_to_cart_button', 'custom_hidden_product_field', 11, 0 );
function custom_hidden_product_field() {
    echo '<input type="hidden" id="hidden_field" name="custom_price" class="custom_price" value="">';
}


// The code to pass this data to the cart:
add_action( 'woocommerce_add_cart_item_data', 'save_custom_fields_data_to_cart', 10, 2 );
function save_custom_fields_data_to_cart( $cart_item_data, $product_id ) {

    if( ! empty( $_REQUEST['custom_price'] ) ) {
        // Set the custom data in the cart item
        $cart_item_data['custom_data']['custom_price'] = $_REQUEST['custom_price'];
        $data = array( 'custom_price' => $_REQUEST['custom_price'] );
        
        // below statement make sure every add to cart action as unique line item
        $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() );
        WC()->session->set( 'custom_data', $data );
    }
    return $cart_item_data;
}

И проверьте оба $data и $cart_item_data, чтобы убедиться, что они оба возвращают custom_price данные, вычисляемые на странице.

Однако я перехожу к просмотру корзины, а значение позиции по-прежнему равно 0.

Я установил var Равный WC()->session->set( 'custom_data', $data ); а затем var_dump Чтобы проверить его, но это возвращает NULL, что может быть просто то, что он возвращается, я не совсем уверен, потому что я никогда не использовал это.

Я также должен добавить, что у меня regular_price в бэкенде продукта установлено значение 0. Когда я стираю это (и оставляю его пустым), я возвращаю ошибку:

Предупреждение. Нечисловое значение обнаружено в C: \ xampp \ htdocs \ my-transfer-source \ wp-content \ plugins \ Woocommerce \ Включает \ Class-WC-Scores.php на линии 85

Мне интересно, не пропустил ли я что-то здесь, и может ли кто-нибудь пролить свет на это? Спасибо

Источник
logos_164
12 сентября 2018 в 22:23
0

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

logos_164
12 сентября 2018 в 22:24
0

Желаемое поведение — передать новую цену, полученную из скрытого поля, в цену корзины Woocommerce. Имеет ли это смысл? Я добавлю это к вопросу.

Ответы (1)

avatar
LoicTheAztec
12 сентября 2018 в 22:38
6

Обновление 2021 - Обработка товара с индивидуальной ценой в мини-корзине

Сначала в целях тестирования мы добавляем цену в скрытое поле ввода, так как вы не даете код для расчета цены:

// Add a hidden input field (With a value of 20 for testing purpose)
add_action( 'woocommerce_before_add_to_cart_button', 'custom_hidden_product_field', 11 );
function custom_hidden_product_field() {
    echo '<input type="hidden" id="hidden_field" name="custom_price" class="custom_price" value="20">'; // Price is 20 for testing
}

Затем вы будете использовать следующее, чтобы изменить цену товара в корзине (WC_Session не требуется):

// Save custom calculated price as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'save_custom_fields_data_to_cart', 10, 2 );
function save_custom_fields_data_to_cart( $cart_item_data, $product_id ) {

    if( isset( $_POST['custom_price'] ) && ! empty( $_POST['custom_price'] )  ) {
        // Set the custom data in the cart item
        $cart_item_data['custom_price'] = (float) sanitize_text_field( $_POST['custom_price'] );

        // Make each item as a unique separated cart item
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}

// For mini cart
add_action( 'woocommerce_cart_item_price', 'filter_cart_item_price', 10, 2 );
function filter_cart_item_price( $price, $cart_item ) {
    if ( isset($cart_item['custom_price']) ) {
        $args = array( 'price' => floatval( $cart_item['custom_price'] ) );

        if ( WC()->cart->display_prices_including_tax() ) {
            $product_price = wc_get_price_including_tax( $cart_item['data'], $args );
        } else {
            $product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );
        }
        return wc_price( $product_price );
    }
    return $price;
}

// Updating cart item price
add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price', 30, 1 );
function change_cart_item_price( $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 ) {
        // Set the new price
        if( isset($cart_item['custom_price']) ){
            $cart_item['data']->set_price($cart_item['custom_price']);
        }
    }
}

Код находится в файле functions.php вашей активной дочерней темы (или активной темы). Проверено и работает.

logos_164
12 сентября 2018 в 22:45
0

Это сделало это. Почему не требуется установка сеанса WC()->?

LoicTheAztec
12 сентября 2018 в 22:49
1

Я сделал небольшое обновление… Данные WC_Session не нужны, поскольку у нас есть необходимые данные в виде пользовательских данных элемента корзины… если вы попробуете: print_r($cart_item); внутри цикла foreach элементов корзины, вы поймете, что я имею в виду.

LoicTheAztec
12 сентября 2018 в 23:01
1

@logos_164 В этом самом недавнем ответе вы видите почти то же самое… WC_Session тоже не используется. WC_session в основном используется, когда вам нужно установить значение вне элементов корзины, чтобы иметь возможность получить его, например, в коде на базе Ajax. Например, Woocommerce использует WC_Session для хранения параметров, выбранных клиентом.

musa baltaci
29 марта 2021 в 10:59
0

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

LoicTheAztec
29 марта 2021 в 11:12
1

@musabaltaci Вы можете использовать что-то вроде coderhelper.com/a/48128915/3730754, внеся некоторые изменения, где вы замените скрытое поле ввода текстовым полем… Попробуйте что-нибудь сами и задайте новый вопрос, если вам нужна помощь…

musa baltaci
29 марта 2021 в 12:22
0

Хорошо, я попытаюсь. Спасибо