Как изменить товар (или количество) на странице оформления заказа в woocommerce - PullRequest
0 голосов
/ 17 мая 2019

здесь нужна помощь

, поэтому я планирую иметь возможность поменять товар на странице оформления заказа с помощью некоторых переключателей. что-то похожее на это

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

/**
 * @snippet       Dynamic Radio Buttons Fees - WooCommerce Checkout
 * @how-to        Watch tutorial @ https://businessbloomer.com/?p=19055
 * @sourcecode    https://businessbloomer.com/?p=79316
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 3.5.1
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

// Part 1 
// Display Radio Buttons
// Uses woocommerce_form_field()

add_action( 'woocommerce_review_order_before_payment', 'bbloomer_checkout_radio_choice' );

function bbloomer_checkout_radio_choice() {

   $chosen = WC()->session->get('radio_chosen');
   $chosen = empty( $chosen ) ? WC()->checkout->get_value('radio_choice') : $chosen;
   $chosen = empty( $chosen ) ? 'no_option' : $chosen;

   $args = array(
   'type' => 'radio',
   'class' => array( 'form-row-wide' ),
   'options' => array(
      'no_option' => 'No Option',
      'option_1' => 'Option 1 ($10)',
      'option_2' => 'Option 2 ($30)',
   ),
   'default' => $chosen
   );

   echo '<div id="checkout-radio">';
   echo '<h3>Customize Your Order!</h3>';
   woocommerce_form_field( 'radio_choice', $args, $chosen );
   echo '</div>';

}

// Part 2 
// Add Fee and Calculate Total
// Based on session's "radio_chosen"

#2 Calculate New Total

add_action( 'woocommerce_cart_calculate_fees', 'bbloomer_checkout_radio_choice_fee', 20, 1 );

function bbloomer_checkout_radio_choice_fee( $cart ) {

  if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

  $radio = WC()->session->get( 'radio_chosen' );

  if ( "option_1" == $radio ) {
   $fee = 10;
  } elseif ( "option_2" == $radio ) {
   $fee = 30;
  }

  $cart->add_fee( __('Option Fee', 'woocommerce'), $fee );

}

// Part 3 
// Refresh Checkout if Radio Changes
// Uses jQuery

add_action( 'wp_footer', 'bbloomer_checkout_radio_choice_refresh' );

function bbloomer_checkout_radio_choice_refresh() {
if ( ! is_checkout() ) return;
    ?>
    <script type="text/javascript">
    jQuery( function($){
        $('form.checkout').on('change', 'input[name=radio_choice]', function(e){
            e.preventDefault();
            var p = $(this).val();
            $.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'woo_get_ajax_data',
                    'radio': p,
                },
                success: function (result) {
                    $('body').trigger('update_checkout');
                }
            });
        });
    });
    </script>
    <?php
}

// Part 4 
// Add Radio Choice to Session
// Uses Ajax

add_action( 'wp_ajax_woo_get_ajax_data', 'bbloomer_checkout_radio_choice_set_session' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'bbloomer_checkout_radio_choice_set_session' );

function bbloomer_checkout_radio_choice_set_session() {
    if ( isset($_POST['radio']) ){
        $radio = sanitize_key( $_POST['radio'] );
        WC()->session->set('radio_chosen', $radio );
        echo json_encode( $radio );
    }
    die();
}

код источника

1 Ответ

0 голосов
/ 17 мая 2019

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

Таким образом, допущение no_option означает (1:по умолчанию), option_1 изменит количество на 10, а option_2 изменит количество на 20, вы бы изменили функцию bbloomer_checkout_radio_choice_set_session(), чтобы она выглядела примерно так:

function bbloomer_checkout_radio_choice_set_session() {
    if ( isset($_POST['radio']) ){
        $radio = sanitize_key( $_POST['radio'] );
        $cart = WC()->cart;
        $cart_content = $cart->cart_contents;
        foreach ( $cart_content as $cart_item_key => $cart_item ) {
            if( 'no_option' === $radio ){
                $cart->set_quantity($cart_item_key, 1);
            }elseif( 'option_1' === $radio ){
                $cart->set_quantity($cart_item_key, 10);
            }elseif( 'option_2' === $radio ){
                $cart->set_quantity($cart_item_key, 20);
            }
        }
    }
    echo json_encode( $_POST['radio'] ) ;
    die();
}

Выше простопример того, как манипулировать количеством товаров в корзине, вам нужно изменить параметры и функцию в соответствии с вашими потребностями.

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