Fügen Sie eine dynamische Gebühr basierend auf einem ausgewählten Feld in WooCommerce Checkout hinzu

Lesezeit: 4 Minuten

Fugen Sie eine dynamische Gebuhr basierend auf einem ausgewahlten Feld
kamuran

ich benutze Aktualisieren Sie die Gebühr dynamisch basierend auf Optionsfeldern in der Woocommerce-Kaufabwicklung Antwortcodelösung, die für mich sehr gut funktioniert hat, um Kontrollkästchenfelder mit jeweils unterschiedlichen Preisen hinzuzufügen, und die Preisänderungen werden in der Kasse widergespiegelt.

Aber ich brauche Hilfe: Wenn ich eine Verpackungsart mit Mehrwertsteuer auswähle, erscheint diese im Backend im Bestellbereich, zeigt aber nur den Preis an und ich möchte auch den Titel anzeigen.

Die Checkbox-Optionen haben:

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

Wie kann der Name auf der Bestellung angezeigt werden? Auch wenn es möglich ist, die Kontrollkästchen zu ändern, um stattdessen das Feld auszuwählen?

Fugen Sie eine dynamische Gebuhr basierend auf einem ausgewahlten Feld
LoicTheAztec

Ich habe einige Änderungen am ursprünglichen Code vorgenommen, die Folgendes bewirken:

  • Zeigen Sie ein benutzerdefiniertes Auswahlfeld an (anstelle von Optionsfeld-Eingabefeldern)
  • Zeigen Sie einen benutzerdefinierten Fehlerhinweis an, wenn der Kunde keine Verpackungsoption ausgewählt hat
  • Zeigen Sie die ausgewählte Verpackungsart überall an (auf Bestellungen und E-Mail-Benachrichtigungen)

Der Code:

// 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' );
}

Code geht in die functions.php-Datei deines aktiven Child-Themes (oder aktiven Themes). Getestet und funktioniert.

Geben Sie hier die Bildbeschreibung ein

Die Fehlermeldung, wenn der Kunde keine Verpackungsoption gewählt hat:

Geben Sie hier die Bildbeschreibung ein

  • Toll, vielen Dank, ich habe es bereits ausprobiert und es macht genau das, was ich brauche. Ich habe nur eine sehr kleine Änderung vorgenommen, damit es auch möglich ist, einen Wert von der Summe abzuziehen, denn wenn dieser negativ (-) ist, wird zunächst nichts angezeigt. Ich weiß Ihre wertvolle Hilfe sehr zu schätzen!

    – kamuran

    3. September 2019 um 19:14 Uhr

  • @kamuran Ich habe den Code aktualisiert, um Gebühren für negative Kosten zu behandeln. ersetzt if ( isset($cost) && $cost > 0 ) durch if ( isset($cost) ) in add_packaging_fee() Funktionscode. Es sollte jetzt funktionieren.

    – LoicTheAztec

    3. September 2019 um 19:36 Uhr


  • Vielen Dank für Ihren Code. Ich versuche, die Position dieses Snippets von der Checkout-Seite in den Warenkorb zu ändern, indem ich die Hook-Namen ändere. Aber ohne Erfolg in woocommerce_cart_calculate_fees. Was mache ich falsch?

    – Alex Lee

    16. Juni 2020 um 13:37 Uhr

1004970cookie-checkFügen Sie eine dynamische Gebühr basierend auf einem ausgewählten Feld in WooCommerce Checkout hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy