个性化客户的Woocommerce优惠券代码

时间:2018-11-21 17:32:28

标签: php wordpress woocommerce checkout coupon

每位客户从网站上购买产品时,我都会为他们动态生成优惠券代码,并且我已经设置了某些条件。

当我动态创建了优惠券代码后,它存储在woocommerce>优惠券部分中。

function couponCodeGeneration($order_id, $i){
    // Get the order ID
    $coupon_code =  $order_id."".$i; // Coupon Code
    $amount = '100%'; // Amount
    $discount_type = 'percent'; // Type: fixed_cart, percent, fixed_product, percent_product

wp_coupon_exist( $coupon_code );

if( wp_coupon_exist( $coupon_code ) ) {
    //coupon code exists.
} else { 
    //coupon code not exists, so inserting coupon code
    $coupon = array(
    'post_title' => $coupon_code,
    'post_content' => '',
    'post_status' => 'publish',
    'post_author' => 1,
    'post_type'     => 'shop_coupon'
    //'post_category' => array(1)
    );

    $new_coupon_id = wp_insert_post( $coupon );

    //SET THE PRODUCT CATEGORIES
    wp_set_object_terms($post_id, 'Holiday Season offers', 'product_cat');

    // Add meta
    update_post_meta( $new_coupon_id, 'discount_type', $discount_type );
    update_post_meta( $new_coupon_id, 'coupon_amount', $amount );
    update_post_meta( $new_coupon_id, 'individual_use', 'yes' );
    update_post_meta( $new_coupon_id, 'product_ids', '' );
    update_post_meta( $new_coupon_id, 'exclude_product_ids', '' );
    update_post_meta( $new_coupon_id, 'usage_limit', '1' );
    update_post_meta( $new_coupon_id, 'expiry_date', '2019-07-31' );
    update_post_meta( $new_coupon_id, 'apply_before_tax', 'yes' );
    update_post_meta( $new_coupon_id, 'free_shipping', 'no' );
    update_post_meta( $new_coupon_id, 'limit_usage_to_x_items', '1' );
    update_post_meta( $new_coupon_id, 'usage_limit_per_user', '1' );
    update_post_meta( $post_id, 'times', '1' );


    echo '<div class="couponCode"><strong>Your Coupon Code for your next purchase - '.$coupon_code.'</strong><hr></div>';
}

}

在以下情况下我需要帮助。

生成的优惠券代码不应由其他客户使用。优惠券仅对该客户私人。优惠券代码无法转移。

客户下订单时,生成的优惠券代码未存储在管理订单页面中。我怎么知道哪个顾客产生了哪个优惠券代码。

有人可以给我建议吗

2 个答案:

答案 0 :(得分:2)

自Woocommerce 3以来,您的代码确实过时了,并且有很多错误。 wp_coupon_exist()功能不存在。

  

要将优惠券限于特定客户,可以使用Email restrictions WC_Coupon方法,该方法还可以让您知道哪个客户生成了优惠券代码。

如果需要,还可以设置一些自定义元数据,以保存用户ID或用户完整名称。

所以我的代码中有两个函数:

  • 第一个检查优惠券代码不存在的人
  • 第二个按您的计划生成优惠券代码的人。

代码:

// Utility function that check if coupon exist
function does_coupon_exist( $coupon_code ) {
    global $wpdb;

    $value = $wpdb->get_var( "
        SELECT ID
        FROM {$wpdb->prefix}posts
        WHERE post_type = 'shop_coupon'
        AND post_name = '".strtolower($coupon_code)."'
        AND post_status = 'publish';
    ");

    return $value > 0 ? true : false;
}


function coupon_code_generation( $order_id, $i ){
    $coupon_code = $order_id."".$i; // Coupon Code

    // Check that coupon code not exists
    if( ! does_coupon_exist( $coupon_code ) ) {

        // Get a new instance of the WC_Coupon object
        $coupon = new WC_Coupon();

        // Get the instance of the WC_Order object
        $order = wc_get_order( $order_id );

        ## --- Coupon settings --- ##

        $discount_type  = 'percent'; // Type
        $coupon_amount  = '100'; // Amount
        $customer_email = array( $order->get_billing_email() ); // Customer billing email
        $product_categories_names = array('Holiday Season offers');
        $date_expires = '2019-07-31';

        // Convert to term IDs
        $term_ids = array();
        foreach( $product_categories_names as $term_name ) {
            if ( term_exists( $term_name, 'product_cat' ) )
                $term_ids[] = get_term_by( 'name', $term_name, 'product_cat' )->term_id;
        }


        ## --- Coupon settings --- ##

        // Set the necessary coupon data
        $coupon->set_code( $coupon_code );
        $coupon->set_discount_type( 'percent' );
        $coupon->set_amount( 100 );
        if( is_array($term_ids) && sizeof($term_ids) > 0 )
            $coupon->set_product_categories( $term_ids );
        $coupon->set_email_restrictions( $customer_email );
        $coupon->set_individual_use( true );
        $coupon->set_usage_limit( 1 );
        $coupon->set_usage_limit_per_user( 1 );
        $coupon->set_limit_usage_to_x_items( 1 );
        $coupon->set_date_expires( date( "Y-m-d H:i:s", strtotime($date_expires) ) );

        // Save the data
        $post_id = $coupon->save();
    }
    echo isset($post_id) && $post_id > 0 ? sprintf(
        '<div class="couponCode"><strong>%s <code>%s</code></strong>.<hr></div>',
        __("Your Coupon Code for your next purchase is", "woocommerce"), $coupon_code
    ) : __("Sorry, a coupon code already exist.", "woocommerce");
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试并可以正常工作。

您将得到类似的输出(生成优惠券时):

  

您下次购买的优惠券代码为1198A

或者如果存在优惠券:

  

对不起,优惠券代码已经存在。

答案 1 :(得分:-1)

我已经解决了问题。

在functions.php中添加以下代码

add_filter( 'woocommerce_coupon_is_valid', 'wc_riotxoa_coupon_is_valid', 20, 2 );

if ( ! function_exists( 'wc_riotxoa_coupon_is_valid' ) ) {

    function wc_riotxoa_coupon_is_valid( $result, $coupon ) {
        $user = wp_get_current_user();

        $restricted_emails = $coupon->get_email_restrictions();

        return ( in_array( $user->user_email, $restricted_emails ) ? $result : false );
    }
}

参考:https://gist.github.com/riotxoa/f4f1a895052c195394ba4841085a0e83