Изменение цены товара на основе данных пользовательской корзины в WooCommerce

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

Я создал эту форму в

woocommerce-> Стабилизаторы продукт-> добавить к cart-> simple.php

Перед изменением форма

<form class="cart" method="post" enctype='multipart/form-data'> <?php /** * @since 2.1.0. */ do_action( 'woocommerce_before_add_to_cart_button' ); /** * @since 3.0.0. */ do_action( 'woocommerce_before_add_to_cart_quantity' ); woocommerce_quantity_input( array( 'min_value' => apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ), 'max_value' => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ), 'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( $_POST['quantity'] ) : $product->get_min_purchase_quantity(), ) ); /** * @since 3.0.0. */ do_action( 'woocommerce_after_add_to_cart_quantity' ); ?> <button type="submit" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" class="single_add_to_cart_button button alt"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button> <?php /** * @since 2.1.0. */ do_action( 'woocommerce_after_add_to_cart_button' ); ?> </form> 

После формы модификации

 <form class="cart" method="post" enctype='multipart/form-data'> <p>width <input type="text" name="new-width" class="new-width"></p> <p>Height <input type="text" name="new-height" class="new-height"></p> <?php /** * @since 2.1.0. */ do_action( 'woocommerce_before_add_to_cart_button' ); /** * @since 3.0.0. */ do_action( 'woocommerce_before_add_to_cart_quantity' ); woocommerce_quantity_input( array( 'min_value' => apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ), 'max_value' => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ), 'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( $_POST['quantity'] ) : $product->get_min_purchase_quantity(), ) ); /** * @since 3.0.0. */ do_action( 'woocommerce_after_add_to_cart_quantity' ); ?> <button type="submit" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" class="single_add_to_cart_button button alt"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button> <?php /** * @since 2.1.0. */ do_action( 'woocommerce_after_add_to_cart_button' ); ?> </form> 

После этого я использовал следующий код, и для тестирования кукол я установил значение 30. Но это не работает . что я пропустил?

 add_filter( 'woocommerce_add_cart_item' , 'set_woo_prices'); function set_woo_prices( $woo_data ) { if(isset( $_POST['new-width'])) { $woo_data['new-width'] =$_POST['new-width']; } if(isset( $_POST['new-height'])) { $woo_data['new-height'] =$_POST['new-height']; } if( $_POST['new-width'] !=="" && $_POST['new-height']!=="" ){ $woo_data['data']->set_price( "30" ); } return $woo_data; } 

Пожалуйста посоветуй . Моя цель – изменить цену продукта на основе введенной пользователем ширины и высоты.

Вам нужно использовать 2 разных крючка:

  • Первый, как и ваш, не пытаясь изменить цену в нем.
  • Второй, где вы измените цену товара

Код:

 add_filter( 'woocommerce_add_cart_item', 'add_custom_cart_item_data', 10, 2 ); function add_custom_cart_item_data( $cart_item_data, $cart_item_key ) { if( isset( $_POST['new-width'] ) ) $cart_item_data['new-width'] = $_POST['new-width']; if(isset( $_POST['new-height'] ) ) $cart_item_data['new-height'] = $_POST['new-height']; return $cart_item_data; } add_action( 'woocommerce_before_calculate_totals', 'set_custom_cart_item_price', 10, 1 ); function set_custom_cart_item_price( $wc_cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // First loop to check if product 11 is in cart foreach ( $wc_cart->get_cart() as $cart_item ){ if( ! empty($cart_item['new-width']) && ! empty($cart_item['new-height']) ) $cart_item['data']->set_price( '30' ); } } 

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

Протестировано и работает