首页 > 解决方案 > 处理订单时以编程方式生成 WC 优惠券 - 优惠券代码错误

问题描述


已经检查了这里发布的数十篇文章和问题 - 已经使用了他们每个人的提示 :)
我的目标是在确认付款后生成带有特定产品 ID 的预定义详细信息的优惠券。我希望它是手动生成的。这是我的代码:

这很长,但可以为特定电子邮件地址创建优惠券。
function bp_generate_coupon_for_training_packs( string $email ) {
    // check id of user
    $user = get_user_by( 'email', $email );
    if ( $user ) {
        $userid = $user->ID;
    }
    else {
        $userid = 'unknown';
    }
    // generate random coupon code
    $characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $char_length = "15";
    $random_string = substr( str_shuffle( $characters ), 0, $char_length );
    // today date
    $date = date_create();
    $today = date_format( $date, "Ymd" );
    // coupon name
    $coupon_code = $userid . '_treningx4_' . $today . '_' . $random_string;
    // set expiry date
    $date->add( new DateInterval( 'P30D' ) );   // add 30 days to expiry date
    $date_expires = date_timestamp_get( $date );
    $expiry_date = date_format( $date, "d.m.Y" );   // correct the format
    $schedule_end = date_format( $date, "d.m.Y H:i" );  // here too
    // coupon details
    $new_coupon = array(
        'post_title' => $coupon_code,
        'post_content' => '',
        'post_status' => 'publish',
        'post_author' => 1,
        'post_type' => 'shop_coupon'
    );
    // restrict coupon
    $roles = [ "customer", "wpamelia-customer" ];
    $restrictions = array_map( 'sanitize_text_field', $roles );
    // new coupon creation
    $new_coupon_id = wp_insert_post( $new_coupon );

    // post meta
    update_post_meta( $new_coupon_id, 'discount_type', 'percent' );
    update_post_meta( $new_coupon_id, 'coupon_amount', '100' );
    update_post_meta( $new_coupon_id, 'individual_use', 'yes' );
    update_post_meta( $new_coupon_id, 'product_ids', '2762' );
    update_post_meta( $new_coupon_id, 'usage_limit', '4' );
    update_post_meta( $new_coupon_id, 'usage_limit_per_user', '0' );
    update_post_meta( $new_coupon_id, 'limit_usage_to_x_items', '1' );
    update_post_meta( $new_coupon_id, 'usage_count', '0' );
    update_post_meta( $new_coupon_id, 'date_expires', $date_expires );
    update_post_meta( $new_coupon_id, 'free_shipping', 'no' );
    update_post_meta( $new_coupon_id, 'exclude_sale_items', 'no' );
    update_post_meta( $new_coupon_id, 'customer_email', $email );
    update_post_meta( $new_coupon_id, '_acfw_disable_url_coupon', 'yes' );
    update_post_meta( $new_coupon_id, '_acfw_force_apply_url_coupon', 'yes' );
    update_post_meta( $new_coupon_id, '_acfw_code_url_override', '' );
    update_post_meta( $new_coupon_id, '_acfw_enable_role_restriction', 'yes' );
    update_post_meta( $new_coupon_id, '_acfw_role_restrictions_type', 'allowed' );
    update_post_meta( $new_coupon_id, '_acfw_role_restrictions_error_msg', 'Nie mozesz skorzystac z tej promocji.' );
    update_post_meta( $new_coupon_id, '_acfw_cart_conditions', '' );
    update_post_meta( $new_coupon_id, '_acfw_cart_condition_notice', '' );
    update_post_meta( $new_coupon_id, '_acfw_role_restrictions', $restrictions );
    update_post_meta( $new_coupon_id, '_acfw_bogo_deals', '' );
    update_post_meta( $new_coupon_id, '_acfw_success_message', '' );
    update_post_meta( $new_coupon_id, '_acfw_after_redirect_url', '' );
    update_post_meta( $new_coupon_id, '_acfw_bogo_auto_add_products', '' );
    update_post_meta( $new_coupon_id, '_acfw_add_before_conditions', '' );
    update_post_meta( $new_coupon_id, '_acfw_add_products_data', '' );
    update_post_meta( $new_coupon_id, '_acfw_excluded_coupons', '' );
    update_post_meta( $new_coupon_id, '_acfw_shipping_overrides', '' );
    update_post_meta( $new_coupon_id, '_acfw_schedule_start', '' );
    update_post_meta( $new_coupon_id, '_acfw_schedule_end', $schedule_end );
    update_post_meta( $new_coupon_id, '_acfw_schedule_start_error_msg', '' );
    update_post_meta( $new_coupon_id, '_acfw_schedule_expire_error_msg', 'Ten pakiet juz wygasl.' );
    update_post_meta( $new_coupon_id, '_acfw_apply_notification_message', '' );
    update_post_meta( $new_coupon_id, '_acfw_apply_notification_btn_text', '' );
    update_post_meta( $new_coupon_id, '_acfw_apply_notification_type', 'info' );
    update_post_meta( $new_coupon_id, '_acfw_reset_usage_limit_period', 'none' );
    update_post_meta( $new_coupon_id, '_acfw_loyalty_program_user', '' );
    update_post_meta( $new_coupon_id, '_acfw_loyalty_program_points', '' );
    update_post_meta( $new_coupon_id, '_acfw_cart_condition_display_notice_auto_apply', '' );
    update_post_meta( $new_coupon_id, 'expiry_date', $expiry_date );
    update_post_meta( $new_coupon_id, '_acfw_usage_limit_reset_time', '' );
    // id of coupon category
    $cat_id = array( 164 );
    $term_id = array_map( 'intval', $cat_id );
    $term_id = array_unique( $term_id );
    wp_set_post_terms( $new_coupon_id, $term_id, 'shop_coupon_cat' );
}

一旦订单状态更改为处理中(付款后),这将创建一张优惠券:

add_action( 'woocommerce_order_status_completed', 'bp_generate_coupon_after_payment' );
function bp_generate_coupon_after_payment( $order_id ) {
    $order = wc_get_order( $order_id );
    $email = $order->get_billing_email();
    $items = $order->get_items();
    foreach ( $items as $item ) {
        $product_id = $item[ 'product_id' ];
        if ( $product_id == '2804' ) {
            bp_generate_coupon_for_training_packs( $email );
        }
    }
}

使用函数 bp_generate_for_training_packs( 'test@email.pl' ) 创建优惠券时,它工作得很好。但是当在 bp_generate_coupon_after_payment() 中调用函数时,它会创建一个带有代码的优惠券: order – 4th December, 2020 @ 09:19 pm并且用户的电子邮件地址不会放入优惠券的 customer_email 字段中。

欢迎任何提示:) 在此先感谢!

标签: wordpresswoocommercehook-woocommercecoupon

解决方案


推荐阅读