Agregue una tarifa dinámica basada en un campo seleccionado en WooCommerce Checkout

4 minutos de lectura

Agregue una tarifa dinamica basada en un campo seleccionado en
kamura

estoy usando Tarifa de actualización dinámicamente basada en botones de radio en el pago de Woocommerce solución de código de respuesta que me funcionó muy bien para agregar campos de casilla de verificación con un precio diferente para cada uno, y los cambios de precio se reflejan en el pago.

Pero necesito ayuda: Cuando selecciono un tipo de empaque con impuesto adicional, aparece en el backend en el área de pedido, pero solo muestra el precio y me gustaría mostrar el título también.

Las opciones de la casilla de verificación tienen:

'options' => array (
    'bag' => __ ('In a bag' .wc_price (3.00), $ domain),
    'box' => __ ('In a gift box' .wc_price (9.00), $ domain),
),

¿Cómo hacer que muestre el nombre en el pedido? Además, ¿si es posible cambiar las casillas de verificación para seleccionar el campo?

Agregue una tarifa dinamica basada en un campo seleccionado en
LoicTheAztec

He realizado algunos cambios en el código original que:

  • Mostrar un campo de selección personalizado (en lugar de campos de entrada de botones de radio)
  • Mostrar un aviso de error personalizado si el cliente no ha seleccionado una opción de embalaje
  • Mostrar el tipo de embalaje seleccionado en todas partes (en pedidos y notificaciones por correo electrónico)

El código:

// Add a custom select fields for packing option fee
add_action( 'woocommerce_review_order_after_shipping', 'checkout_shipping_form_packing_addition', 20 );
function checkout_shipping_form_packing_addition( ) {
    $domain = 'woocommerce';

    echo '<tr class="packing-select"><th>' . __('Packing options', $domain) . '</th><td>';

    $chosen   = WC()->session->get('chosen_packing');

    // Add a custom checkbox field
    woocommerce_form_field( 'chosen_packing', array(
        'type'      => 'select',
        'class'     => array( 'form-row-wide packing' ),
        'options'   => array(
            ''    => __("Choose a packing option ...", $domain),
            'bag' => sprintf( __("In a bag (%s)", $domain), strip_tags( wc_price(3.00) ) ),
            'box' => sprintf( __("In a gift box (%s)", $domain), strip_tags( wc_price(9.00) ) ),
        ),
        'required'  => true,
    ), $chosen );

    echo '</td></tr>';
}

// jQuery - Ajax script
add_action( 'wp_footer', 'checkout_shipping_packing_script' );
function checkout_shipping_packing_script() {
    // Only checkout page
    if ( is_checkout() && ! is_wc_endpoint_url() ) :

    WC()->session->__unset('chosen_packing');
    ?>
    <script type="text/javascript">
    jQuery( function($){
        $('form.checkout').on('change', 'select#chosen_packing', function(){
            var p = $(this).val();
            console.log(p);
            $.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'woo_get_ajax_data',
                    'packing': p,
                },
                success: function (result) {
                    $('body').trigger('update_checkout');
                    console.log('response: '+result); // just for testing | TO BE REMOVED
                },
                error: function(error){
                    console.log(error); // just for testing | TO BE REMOVED
                }
            });
        });
    });
    </script>
    <?php
    endif;
}

// Php Ajax (Receiving request and saving to WC session)
add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' );
function woo_get_ajax_data() {
    if ( isset($_POST['packing']) ){
        $packing = sanitize_key( $_POST['packing'] );
        WC()->session->set('chosen_packing', $packing );
        echo json_encode( $packing );
    }
    die(); // Alway at the end (to avoid server error 500)
}

// Add a custom dynamic packaging fee
add_action( 'woocommerce_cart_calculate_fees', 'add_packaging_fee', 20, 1 );
function add_packaging_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $domain      = "woocommerce";
    $packing_fee = WC()->session->get( 'chosen_packing' ); // Dynamic packing fee

    if ( $packing_fee === 'bag' ) {
        $label = __("Bag packing fee", $domain);
        $cost  = 3.00;
    } elseif ( $packing_fee === 'box' ) {
        $label = __("Gift box packing fee", $domain);
        $cost  = 9.00;
    }

    if ( isset($cost) )
        $cart->add_fee( $label, $cost );
}

// Field validation, as this packing field is required
add_action('woocommerce_checkout_process', 'packing_field_checkout_process');
function packing_field_checkout_process() {
    // Check if set, if its not set add an error.
    if ( isset($_POST['chosen_packing']) && empty($_POST['chosen_packing']) )
        wc_add_notice( __( "Please choose a packing option...", "woocommerce" ), 'error' );
}

El código va en el archivo functions.php de su tema secundario activo (o tema activo). Probado y funciona.

ingrese la descripción de la imagen aquí

El mensaje de error cuando el cliente no ha elegido una opción de embalaje:

ingrese la descripción de la imagen aquí

  • Genial, muchas gracias, ya lo probé y hace exactamente lo que necesito. Solo hice una modificación muy pequeña para que también permitiera restar un valor al total, ya que inicialmente si este es negativo (-) entonces no se muestra nada. Agradezco mucho su valiosa ayuda!

    – kamuran

    3 sep 2019 a las 19:14

  • @kamuran Actualicé el código para manejar las tarifas de costos negativos. sustituido if ( isset($cost) && $cost > 0 ) por if ( isset($cost) ) en add_packaging_fee() Código de función. Debería funcionar ahora.

    – LoicTheAztec

    3 sep 2019 a las 19:36


  • gracias por su código, estoy tratando de cambiar la ubicación de este fragmento de la página de pago al carrito cambiando los nombres de los enlaces… pero sin éxito a woocommerce_cart_calculate_fees… ¿qué estoy haciendo mal?

    – Alex Lee

    16 de junio de 2020 a las 13:37

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad