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