Установите значение цены пользовательской корзины из переменной GET В Woocommerce 3 - PullRequest
0 голосов
/ 09 мая 2018

У меня есть функция на моем веб-сайте Woocommerce, которая позволяет клиентам устанавливать индивидуальную сумму для оплаты определенного продукта, основываясь на значении, которое я передаю через URL.

Я использую крюк woocommerce_before_calculate_totals, и до тех пор, пока я не обновил до WC 3.3.5, он работал нормально. Теперь, когда я запускаю код, на кассе изначально отображается заказная сумма.

Однако после того, как загрузчик завершил обновление, он сбрасывает цену на «0» (т. Е. Отображает £ 0,00 на полях страницы оформления заказа).

Вот этот код:

add_action( 'woocommerce_before_calculate_totals', 'pay_custom_amount', 99);

function pay_custom_amount() {
    $payment_value = $_GET['amount'];

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

        if($cart_item['data']->id == 21 ){
            $cart_item['data']->set_price($payment_value);
        }
    }
}

Ну, цвет меня расстроил. Я просмотрел Stack Overflow для решений, но не вижу подобных проблем. Я вижу, что крюк запускается несколько раз, но это нормально.

Если кто-нибудь знает, что здесь может происходить, было бы здорово, если бы вы могли поделиться.

1 Ответ

0 голосов
/ 09 мая 2018

Невозможно получить цену с URL-адреса и установить ее в woocommerce_before_calculate_totals action hook. Это должно быть сделано по-другому.

В следующем коде:

  • первая подключенная функция получит эту «сумму» из URl и установит ее (зарегистрирует) в объекте корзины как пользовательские данные.
  • 2-я подключенная функция будет считывать эту сумму из пользовательских данных корзины и будет устанавливать ее как новую цену.

Теперь ваш целевой идентификатор продукта в вашем коде должен совпадать с идентификатором, добавленным в корзину.

код:

// Get the custom "amount" from URL and save it as custom data to the cart item
add_filter( 'woocommerce_add_cart_item_data', 'add_pack_data_to_cart_item_data', 20, 2 );
function add_pack_data_to_cart_item_data( $cart_item_data, $product_id ){
    if( ! isset($_GET['amount']) )
        return $cart_item_data;

    $amount = esc_attr( $_GET['amount'] );
    if( empty($amount) )
        return $cart_item_data;

    // Set the custom amount in cart object
    $cart_item_data['custom_price'] = (float) $amount;
    $cart_item_data['unique_key'] = md5( microtime() . rand() ); // Make each item unique

    return $cart_item_data;
}

// Alter conditionally cart item price based on product ID and custom registered "amount"
add_action( 'woocommerce_before_calculate_totals', 'change_conditionally_cart_item_price', 30, 1 );
function change_conditionally_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    // HERE set your targeted product ID
    $targeted_product_id = 21;

    foreach ( $cart->get_cart() as $cart_item ) {
        // Checking for the targeted product ID and the registered "amount" cart item custom data to set the new price
        if($cart_item['data']->get_id() == $targeted_product_id && isset($cart_item['custom_price']) )
            $cart_item['data']->set_price($cart_item['custom_price']);
    }
}

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

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