Intereting Posts
Неопределенный метод для mock-объекта, реализующего данный интерфейс в PHPUnit? Изменение текущего часового пояса пользователя на основе смещения UTC сервера и смещения UTC пользователя Woocommerce Добавить продукт с внешним / партнерским типом Получить идентификатор пользователя из Facebook в PHP Ошибка 502 в nginx + php5-fpm Ручка laravel 4 не найдена в Route :: model RSA Android Шифрование / RSA PHP Расшифровка Получить из ассоциативного массива только те элементы, которые указаны Как я могу перечислить те же данные ID с циклом while в PHP? DOMXpath – получить атрибут href и текстовое значение элемента a переменные сеанса и база данных Разница между интерполяцией (с использованием {} squiggly brackets) и конкатенации (., Или точки) при построении оператора SQL PHP генерирует DIVs на основе определенного числа Зашифровывает ли пароль несколько раз действительно делает его более безопасным? REGEX: как удалить комментарии из javascripts, используя PHP-код

WooCommerce Превышение цены не работает

Я создал скрытый элемент ввода, используя woocommerce_before_add_to_cart_button hook

 function add_gift_wrap_field() { ?>`<input type="hidden" id="price_val" name="added_price" value="100.34">`<?php } add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' ); 

Сохранение полей против продукта:

 function save_gift_wrap_fee( $cart_item_data, $product_id ) { if( isset( $_POST['added_price'] ) ) { $cart_item_data = array(); $cart_item_data[ "gift_wrap_fee" ] = "YES"; $cart_item_data[ "gift_wrap_price" ] = 100; } return $cart_item_data; } add_filter( 'woocommerce_add_cart_item_data', 'save_gift_wrap_fee', 99, 2 ); 

Теперь я могу повторить $_POST['added_price'] внутри этого woocommerce_before_calculate_totals .

Код, который я написал, показан ниже:

 function calculate_gift_wrap_fee( $cart_object ) { if( !WC()->session->__isset( "reload_checkout" )) { /* Gift wrap price */ $additionalPrice = number_format($_POST['added_price'], 2); $additionalPrice = floatval($additionalPrice); //echo $additionalPrice; exit(); shows the value foreach ( $cart_object->cart_contents as $key => $value ) { if( isset( $value["gift_wrap_fee"] ) ) { /* Woocommerce 3.0 + */ $orgPrice = floatval( $value['data']->get_price() ); $value['data']->set_price( $orgPrice + $additionalPrice ); //not adding the $additionalPrice here. } } } } add_action( 'woocommerce_before_calculate_totals', 'calculate_gift_wrap_fee', 99 ); 

Что я здесь делаю неправильно?

Вот полное чистое, проверенное и работающее решение на основе вашего кода.

Здесь я включил ваш собственный key / value поля в объект корзины для соответствующего элемента корзины вместо того, чтобы получать значение Post в функции calculate_gift_wrap_fee() .

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

Я прокомментировал 'gift_wrap_fee' и 'gift_wrap_price' поскольку они сейчас не нужны (но вы можете раскомментировать их, если хотите).

Вот этот код:

 // The hidden product custom field add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' ); function add_gift_wrap_field() { ?> <input type="hidden" id="price_val" name="added_price" value="100.34"> <?php } // Adding the custom field to as custom data for this cart item in the cart object 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 ) { $bool = false; $data = array(); if( ! empty( $_REQUEST['added_price'] ) ) { $cart_item_data['custom_data']['added_price'] = $_REQUEST['added_price']; // Below this 2 values are not really needed (I think) // (You can uncomment them if needed) ## $cart_item_data['custom_data']['gift_wrap_fee'] = 'YES'; ## $cart_item_data['custom_data']['gift_wrap_price'] = 100; // 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; } // Changing the cart item price based on custom field calculation add_action( 'woocommerce_before_calculate_totals', 'calculate_gift_wrap_fee', 10, 1 ); function calculate_gift_wrap_fee( $cart_object ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Iterating though cart items foreach ( $cart_object->get_cart() as $cart_item ) { // Continue if we get the custom data for the current cart item if( ! empty( $cart_item['custom_data'] ) ){ // Get the custom field "added price" value $added_price = number_format( $cart_item['custom_data']['added_price'], 2 ); // The WC_Product object $wc_product = $cart_item['data']; // Get the price (WooCommerce versions 2.5.x to 3+) $product_price = method_exists( $wc_product, 'get_price' ) ? floatval($wc_product->get_price()) : floatval($wc_product->price); // New price calculation $new_price = $product_price + $added_price; // Set the calculeted price (WooCommerce versions 2.5.x to 3+) method_exists( $wc_product, 'set_price' ) ? $wc_product->set_price( $new_price ) : $wc_product->price = $new_price; } } } 

Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Этот код проверен и работает с версиями WooCommerce с 2.5.x до 3+.