TransWikia.com

Как в woocommerce изменить стоимость продукта на странице оформления заказа?

Stack Overflow на русском Asked by Stanislau Zenkin on November 29, 2021

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

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

add_action('woocommerce_before_calculate_totals', 'set_custom_price', 50);

function set_custom_price() {
  if ( is_admin() && ! defined( 'DOING_AJAX' ) )
  return;
  $getcart = WC()->cart->get_cart();
  foreach ( $getcart as $cart_item_key => $cart_item ) {
     $cart_item['data']->set_price( $price );
  }
}

Есть ли способ динамически менять стоимость используя AJAX?
Пробовал так:

    $('#my-btn').click(function(){
        $.ajax({
            url: 'https://colis.by/wp-admin/admin-ajax.php',
            type: 'POST',
            data: {
                action: 'my-action',
                sum: '120'
            }, 
            beforeSend: function( xhr ) {
                $('#my-btn').text('Загрузка, 5 сек...');    
            },
            success: function( data ) {
                $('#my-btn').text('Отправить'); 
                console.log( data );
                $(document.body).trigger("update-order-review");
            }
        });

    });


add_action( 'wp_ajax_my-action', 'test_function' ); 
add_action( 'wp_ajax_nopriv_my-action', 'test_function' );  
 
function test_function(){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
   return;
 
     $sum = $_POST['sum'];

     $getcart = WC()->cart->get_cart();
       foreach ( $getcart as $cart_item_key => $cart_item ) {
         $cart_item['data']->set_price( $sum );
         print_r($cart_item['data']);         
       }      
    die;
}

В правильном ли направлении я двигаюсь? Есть ли у кого какие-нибудь идеи как мне получить ожидаемый результат?

One Answer

Решил свою проблему добавлением переменной в сессию

add_action( 'wp_ajax_my-action', 'test_function' ); 
add_action( 'wp_ajax_nopriv_my-action', 'test_function' );  
 
function test_function(){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
 
     $sum = $_POST['sum'];

     WC()->session->set( 'fee_sum', $sum );
    
    die;
}

add_action('woocommerce_before_calculate_totals', 'set_custom_fee', 50);

function set_custom_fee( $cart ) {
  if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    
   $sum = WC()->session->get( 'fee_sum' );
     
   if ( $sum && $sum > 0) {
      $cart->add_fee( 'Дополнительная стоимость', $sum );
   }
}

Answered by Stanislau Zenkin on November 29, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP