WooCommerce 中付费客户的自动折扣
Automatic discount for paying customers in WooCommerce
我想自动向在我的网站上至少进行过一次购买的每个人应用折扣券。这是我尝试过的代码,但我在页面上遇到了致命错误 ...
function has_bought( $customer_email ){
$orders = get_posts(array(
'numberposts' => -1,
'post_type' => 'shop_order',
'post_status' => array('wc-completed'),
) );
$email_array = array();
foreach($orders as $order) {
$order_obj = wc_get_order($order->ID);
$order_obj_data = $order_obj->get_data();
array_push($email_array, $order_obj_data['billing']['email']);
}
if (in_array($customer_email, $email_array)) {
return true;
} else {
return false;
}
}
add_action( 'woocommerce_before_cart', 'apply_matched_coupons' );
function apply_matched_coupons() {
global $woocommerce;
$coupon_code = '10fidelity'; // coupon code
if ( $woocommerce->cart->has_discount( $coupon_code ) ) return;
if ( has bought() {
$woocommerce->cart->add_discount( $coupon_code );
$woocommerce->show_messages();
}
}
你的实际代码很重而且已经过时了......而是尝试以下更轻便和有效的方法,即使用 WC_Customer
is_paying_customer
属性:
add_action( 'woocommerce_before_calculate_totals', 'enable_customer_fidelity_discount', 10, 1 );
function enable_customer_fidelity_discount( $cart ) {
if ( ! ( is_cart() || is_checkout() ) )
return;
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || ! is_user_logged_in() )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// The discount coupon code below
$coupon_code = '10fidelity';
if( ! in_array( $coupon_code, $cart->get_applied_coupons() ) && WC()->customer->get_is_paying_customer() ) {
$cart->apply_coupon( $coupon_code );
} elseif( in_array( $coupon_code, $cart->get_applied_coupons() ) && ! WC()->customer->get_is_paying_customer() ) {
$cart->remove_coupon( $coupon_code );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。测试和工作
或者使用这个改进的轻型功能来检查客户是否已经下订单:
function has_bought( $user_id = 0 ) {
global $wpdb;
$customer_id = $user_id == 0 ? get_current_user_id() : $user_id;
$paid_order_statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );
$results = $wpdb->get_col( "
SELECT p.ID FROM {$wpdb->prefix}posts AS p
INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $paid_order_statuses ) . "' )
AND p.post_type LIKE 'shop_order'
AND pm.meta_key = '_customer_user'
AND pm.meta_value = $customer_id
" );
// Count number of orders and return a boolean value depending if higher than 0
return count( $results ) > 0 ? true : false;
}
add_action( 'woocommerce_before_calculate_totals', 'enable_customer_fidelity_discount', 10, 1 );
function enable_customer_fidelity_discount( $cart ) {
if ( ! ( is_cart() || is_checkout() ) )
return;
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || ! is_user_logged_in() )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// The discount coupon code below
$coupon_code = 'summer';
if( ! in_array( $coupon_code, $cart->get_applied_coupons() ) && has_bought() ) {
$cart->apply_coupon( $coupon_code );
} elseif( in_array( $coupon_code, $cart->get_applied_coupons() ) && ! has_bought() ) {
$cart->remove_coupon( $coupon_code );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
相关:
我想自动向在我的网站上至少进行过一次购买的每个人应用折扣券。这是我尝试过的代码,但我在页面上遇到了致命错误 ...
function has_bought( $customer_email ){
$orders = get_posts(array(
'numberposts' => -1,
'post_type' => 'shop_order',
'post_status' => array('wc-completed'),
) );
$email_array = array();
foreach($orders as $order) {
$order_obj = wc_get_order($order->ID);
$order_obj_data = $order_obj->get_data();
array_push($email_array, $order_obj_data['billing']['email']);
}
if (in_array($customer_email, $email_array)) {
return true;
} else {
return false;
}
}
add_action( 'woocommerce_before_cart', 'apply_matched_coupons' );
function apply_matched_coupons() {
global $woocommerce;
$coupon_code = '10fidelity'; // coupon code
if ( $woocommerce->cart->has_discount( $coupon_code ) ) return;
if ( has bought() {
$woocommerce->cart->add_discount( $coupon_code );
$woocommerce->show_messages();
}
}
你的实际代码很重而且已经过时了......而是尝试以下更轻便和有效的方法,即使用 WC_Customer
is_paying_customer
属性:
add_action( 'woocommerce_before_calculate_totals', 'enable_customer_fidelity_discount', 10, 1 );
function enable_customer_fidelity_discount( $cart ) {
if ( ! ( is_cart() || is_checkout() ) )
return;
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || ! is_user_logged_in() )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// The discount coupon code below
$coupon_code = '10fidelity';
if( ! in_array( $coupon_code, $cart->get_applied_coupons() ) && WC()->customer->get_is_paying_customer() ) {
$cart->apply_coupon( $coupon_code );
} elseif( in_array( $coupon_code, $cart->get_applied_coupons() ) && ! WC()->customer->get_is_paying_customer() ) {
$cart->remove_coupon( $coupon_code );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。测试和工作
或者使用这个改进的轻型功能来检查客户是否已经下订单:
function has_bought( $user_id = 0 ) {
global $wpdb;
$customer_id = $user_id == 0 ? get_current_user_id() : $user_id;
$paid_order_statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );
$results = $wpdb->get_col( "
SELECT p.ID FROM {$wpdb->prefix}posts AS p
INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $paid_order_statuses ) . "' )
AND p.post_type LIKE 'shop_order'
AND pm.meta_key = '_customer_user'
AND pm.meta_value = $customer_id
" );
// Count number of orders and return a boolean value depending if higher than 0
return count( $results ) > 0 ? true : false;
}
add_action( 'woocommerce_before_calculate_totals', 'enable_customer_fidelity_discount', 10, 1 );
function enable_customer_fidelity_discount( $cart ) {
if ( ! ( is_cart() || is_checkout() ) )
return;
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || ! is_user_logged_in() )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// The discount coupon code below
$coupon_code = 'summer';
if( ! in_array( $coupon_code, $cart->get_applied_coupons() ) && has_bought() ) {
$cart->apply_coupon( $coupon_code );
} elseif( in_array( $coupon_code, $cart->get_applied_coupons() ) && ! has_bought() ) {
$cart->remove_coupon( $coupon_code );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
相关: