Wenden Sie programmgesteuert einen Gutschein in WooCommerce 3.0+ für die erste Bestellung eines Kunden an

Lesezeit: 4 Minuten

Benutzer-Avatar
Demis Cunningham

Ich verwende diesen Code, um programmgesteuert einen Gutschein in WooCommerce für die Erstbestellung von Kunden anzuwenden. Ich brauche eine Funktion, die sieht, ob der Kunde neu ist, und wenn ja, den Gutscheincode anwendet.

Ich versuche dies vergeblich in meiner functions.php meines Child-Themes zu verwenden.

add_action('woocommerce_after_checkout_validation','check_new_customer_coupon', 0);
function check_new_customer_coupon(){
    global $woocommerce;
    // you might change the name of your coupon
    $new_cust_coupon_code="new2022";

    $has_apply_coupon = false;

    foreach ( WC()->cart->get_coupons() as $code => $coupon ) {
        if($code == $new_cust_coupon_code) {
            $has_apply_coupon = true;
        }
    }

    if($has_apply_coupon) {

        if(is_user_logged_in()) {
            $user_id = get_current_user_id();

            // retrieve all orders
            $customer_orders = get_posts( array(
                    'meta_key'    => '_customer_user',
                    'meta_value'  => $user_id,
                    'post_type'   => 'shop_order',
                    'numberposts'=> -1
            ) );

            if(count($customer_orders) > 0) {
                $has_ordered = false;

                $statuses = array('wc-failed', 'wc-cancelled', 'wc-refunded');

                // loop thru orders, if the order is not falled into failed, cancelled or refund then it consider valid
                foreach($customer_orders as $tmp_order) {

                    $order = wc_get_order($tmp_order->ID);
                    if(!in_array($order->get_status(), $statuses)) {
                        $has_ordered = true;
                    }
                }

                // if this customer already ordered, we remove the coupon
                if($has_ordered == true) {
                    WC()->cart->remove_coupon( $new_cust_coupon_code );
                    wc_add_notice( sprintf( "Coupon code: %s is only applicable for new customer." , $new_cust_coupon_code), 'error' );
                    return false;
                }
            } else {
                // customer has no order, so valid to use this coupon
                return true;
            }

        } else {
            // new user is valid
            return true;
        }
    }
}

Nur scheint das in der aktuellen WooCommerce-Version nicht mehr zu funktionieren? Was mache ich falsch? Meine WordPress-Version ist 6.0 und WooCommerce ist 6.5.1

  • wie geht das nicht? Der Code scheint legitim zu sein. Vielleicht überprüfen Sie Ihre Logik in Bezug auf den Auftragsstatus. Übrigens müssen Sie nicht true\false zurückgeben, da es sich um einen Action-Hook und nicht um einen Filter handelt.

    – Ash0ur

    Vor 2 Tagen


Benutzer-Avatar
7uc1f3r

Der von Ihnen verwendete Code funktioniert in aktuellen WooCommere-Versionen nicht mehr, da er veralteten Code, Mängel und einige überflüssige Schritte enthält:

  • Es ist nicht notwendig zu verwenden get_posts() mit mehreren Argumenten verwenden wc_get_customer_order_count() stattdessen
  • $tmp_order->ID gewechselt zu $tmp_order->get_id() seit WooCommerce 3
  • Ihr Code berücksichtigt keine Gastbenutzer, sodass diese den Coupon manuell anwenden können
  • Der Gutschein wird nicht automatisch vergeben, Ihr Code geht davon aus, dass die Kunden diesen Gutschein eingelöst haben
  • Das woocommerce_after_checkout_validation Hook enthält 2 Parameter
  • Sie müssen nicht true\false zurückgeben, da es sich um einen Action-Hook und nicht um einen Filter handelt.

Diese aktualisierte Version berücksichtigt:

  • Wenn die Gutschein angewendetaber der Kunde ist NICHT eingeloggt, Coupon wird entfernt
  • Wenn die Gutschein angewendetder Kunde ist eingeloggt, aber NICHT die erste Bestellungwird der Gutschein sein ENTFERNT
  • Wenn die Gutschein angewendetdas Kunde eingeloggt ist und es sich um die erste Bestellung handelt, bleibt der Gutschein erhalten
  • Wenn die Gutschein wurde NICHT angewendetdas Kunde eingeloggt ist und es sich um die erste Bestellung handelt, wird der Gutschein eingelöst

Sie erhalten also:

function action_woocommerce_after_checkout_validation( $data, $error ) {
    // Change the name to your coupon
    $new_cust_coupon_code="coupon1";

    // Initialize
    $coupon_been_applied = false;
    $remove_coupon = false;

    // Get applied coupons
    $applied_coupons = WC()->cart->get_applied_coupons();

    // Has coupon already been applied by the customer
    if ( in_array( $new_cust_coupon_code, $applied_coupons ) ) {
        $coupon_been_applied = true;

        // Coupon has been applied, but customer is a guest user
        if ( ! is_user_logged_in() ) {
            $remove_coupon = true;
        }
    }

    // Customer is logged in
    if ( is_user_logged_in() ) {    
        // Check if the customer has bought before
        $has_bought_before = wc_get_customer_order_count( get_current_user_id() ) >= 1 ? true : false;

        // Coupon been applied, but customer has bought before
        if ( $coupon_been_applied && $has_bought_before ) {
            $remove_coupon = true;
        // NOT been applied AND NOT has bought before
        } elseif ( ! $coupon_been_applied && ! $has_bought_before ) {
            // Apply coupon
            WC()->cart->apply_coupon( $new_cust_coupon_code );
        }
    }

    // When true
    if ( $remove_coupon ) {
        // Remove coupon
        WC()->cart->remove_coupon( $new_cust_coupon_code );

        // Show message
        $error->add( 'validation', sprintf( __( 'Coupon code: "%s" is only applicable for logged in new customers. So the coupon has been removed', 'woocommerce' ), $new_cust_coupon_code ) );
    }
}
add_action( 'woocommerce_after_checkout_validation', 'action_woocommerce_after_checkout_validation', 10, 2 );

1019600cookie-checkWenden Sie programmgesteuert einen Gutschein in WooCommerce 3.0+ für die erste Bestellung eines Kunden an

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

Privacy policy