Deaktivieren Sie die Schaltfläche „Bestellung aufgeben“ und zeigen Sie eine Nachricht an, wenn XX Land NICHT ausgewählt ist und der Warenkorb auf der Checkout-Seite ein bestimmtes Produkt in WooCommerce enthält

Lesezeit: 4 Minuten

Deaktivieren Sie die Schaltflache „Bestellung aufgeben und zeigen Sie eine
Marmelade

Hat jemand eine Idee, wie man mit einem solchen Szenario umgeht? Ich möchte eine Benachrichtigung anzeigen und die Schaltfläche „Bestellung aufgeben“ auf der Checkout-Seite deaktivieren, wenn ein Land außerhalb von XX ausgewählt wurde und der Warenkorb ein bestimmtes Produkt enthält (nicht ins Ausland lieferbar).

Ich könnte Jquery gebrauchen, kann aber nicht auf die Schaltfläche „Bestellung aufgeben“ zugreifen, da das Formular jedes Mal über AJAX aktualisiert wird, wenn ich die Rechnungsadresse ändere. So bin ich bisher gekommen:

add_action( 'woocommerce_checkout_before_customer_details', 'display_shipping_notice' );
function display_shipping_notice() {
    echo '<div class="shipping-notice woocommerce-error" role="alert" style="display:none">We cannot ship this product to your country. Please remove it from the cart to continue!</div>';
    
}


add_action( 'woocommerce_after_checkout_form', 'show_shipping_notice_js' );
function show_shipping_notice_js(){
    ?>
    <script>
        jQuery(function($){
            var countryCode="LV", // Set the country code (That will display the message)
                countryField = 'select#billing_country'; // The Field selector to target
            
            function showHideShippingNotice( countryCode, countryField ){
                if( $(countryField).val() !== countryCode && $('.shop_table tr').hasClass('id-27733')){
                    $('.shipping-notice').show();                   
                    $('.woocommerce-checkout-payment').hide();
                    
                }
                else {
                    $('.shipping-notice').hide();
                    $('.woocommerce-checkout-payment').show();
                }
            }

            // On Ready (after DOM is loaded)
            showHideShippingNotice( countryCode, countryField );

            // On billing country change (Live event)
            $('form.checkout').on('change', countryField, function() {
                showHideShippingNotice( countryCode, countryField );
            });
        });
    </script>
    <?php
}

function cart_item_class( $class, $values, $values_key ) {
    if ( isset( $values[ 'product_id' ] ) ) {
        $class .= ' id-' . $values[ 'product_id' ];
    }
    return $class;
}
add_filter( 'woocommerce_cart_item_class', 'cart_item_class', 10, 3 );

1647179345 818 Deaktivieren Sie die Schaltflache „Bestellung aufgeben und zeigen Sie eine
7uc1f3r

Es ist nicht erforderlich, jQuery oder AJAX zu verwenden, auch das Anzeigen einer benutzerdefinierten Nachricht über ein HTML-Div ist nicht erforderlich, da dies über erfolgen kann wc_add_notice() und WooCommerce-Hook(s).

Mit anderen Worten, nutzen Sie die WooCommerce-Funktionalitäten gegenüber, um es selbst zu erstellen.


Wenn Sie diese Prüfung nur auf der Checkout-Seite durchführen möchten, können Sie die verwenden woocommerce_order_button_html Haken:

function filter_woocommerce_order_button_text( $button ) {        
    // The targeted product ids
    $targeted_ids = array( 30, 815 );

    // Flag
    $found = false;

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( array_intersect( $targeted_ids, array( $cart_item['product_id'], $cart_item['variation_id'] ) ) ) {
            $found = true;
            break;
        }
    }

    // True
    if ( $found ) {
        // Get billing country
        $billing_country = WC()->customer->get_billing_country();
    
        // Multiple country codes can be added, separated by a comma
        $countries = array( 'BE', 'LV' );
    
        // Checks if a value NOT exists in an array
        if ( ! in_array( $billing_country, $countries ) ) {
            $style="style="background:Silver !important; color:white !important; cursor: not-allowed !important; text-align:center;"";
            $text   = apply_filters( 'woocommerce_order_button_text', __( 'Place order', 'woocommerce' ) );
            $button = '<a class="button"' . $style . '>' . $text . '</a>';
            
            // Clear all other notices          
            wc_clear_notices();
            
            // Notice
            wc_add_notice( __( 'We cannot ship this product to your country. Please remove it from the cart to continue!', 'woocommerce' ), 'error' ); 
        }
    }
    
    return $button;
}
add_filter( 'woocommerce_order_button_html', 'filter_woocommerce_order_button_text', 10, 1 );

Oder Für eine Kombination aus Warenkorb- und Checkout-Seite können Sie die verwenden woocommerce_check_cart_items Haken:

function action_woocommerce_check_cart_items() {        
    // The targeted product ids
    $targeted_ids = array( 30, 815 );

    // Flag
    $found = false;

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( array_intersect( $targeted_ids, array( $cart_item['product_id'], $cart_item['variation_id'] ) ) ) {
            $found = true;
            break;
        }
    }

    // True
    if ( $found ) {
        // Get billing country
        $billing_country = WC()->customer->get_billing_country();
        
        // Multiple country codes can be added, separated by a comma
        $countries = array( 'BE', 'LV' );
    
        // Checks if a value NOT exists in an array
        if ( ! in_array( $billing_country, $countries ) ) {
            // Notice
            wc_add_notice( __( 'We cannot ship this product to your country. Please remove it from the cart to continue!', 'woocommerce' ), 'error' ); 
            
            // Remove proceed to checkout button
            remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
        }
    }
}   
add_action( 'woocommerce_check_cart_items' , 'action_woocommerce_check_cart_items', 10, 0 );

  • Hey, gibt es eine Option, wie man eine zusätzliche Klasse für dieses $targeted_ids-Produkt hinzufügt, wenn das Land !== $countries ausgewählt ist? Dann könnte ich das Produkt mit CSS visuell markieren?

    – Marmelade

    8. Oktober 2021 um 20:45 Uhr

  • @jam ja, das kannst du über die machen woocommerce_cart_item_class Filterhaken

    – 7uc1f3r

    9. Oktober 2021 um 6:06 Uhr


997940cookie-checkDeaktivieren Sie die Schaltfläche „Bestellung aufgeben“ und zeigen Sie eine Nachricht an, wenn XX Land NICHT ausgewählt ist und der Warenkorb auf der Checkout-Seite ein bestimmtes Produkt in WooCommerce enthält

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

Privacy policy