从 WooCommerce 3+ 开始以编程方式创建优惠券

Create a coupon programmatically since WooCommerce 3+

我使用此代码以编程方式在 woocommerce 上添加优惠券。

    if(empty($coupon_post)){

        $coupon = array(
            'post_title'    => $coupon_code,
            'post_content'  => '',
            'post_status'   => 'publish',
            'post_author'   => 1,
            'post_type'     => 'shop_coupon'
        );

        $new_coupon_id = wp_insert_post( $coupon );

        // 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', '' );
update_post_meta( $new_coupon_id, 'expiry_date', '' );
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, 'exclude_sale_items', 'no' );     
update_post_meta( $new_coupon_id, 'free_shipping', 'no' );      
update_post_meta( $new_coupon_id, 'product_categories', '' );       
update_post_meta( $new_coupon_id, 'exclude_product_categories', '' );       
update_post_meta( $new_coupon_id, 'minimum_amount', '' );       
update_post_meta( $new_coupon_id, 'customer_email', '' ); 
    }

但它总是说 usage_limit = 1。

我添加了额外的代码来更新:

add_action( 'save_post_shop_coupon', 'my_child_after_coupon_save', 10, 3 );

function my_child_after_coupon_save( $post_id, $post, $update ) {
   update_post_meta( $post_id, 'usage_limit', '');
}

但是如果我在后台打开优惠券,不做任何修改直接更新,那是行不通的first.But。使用限制设置为无限制。

如何触发这个,我不需要打开所有优惠券。

从 WooCommerce 3 开始,您的代码有点过时,例如 apply_before_tax 不再使用。您最好使用所有可用的 WC_Coupon setter methods 来创建优惠券。

在下面的代码中,我只使用了必要的 setter 方法 (与您的代码相关):

// Get an empty instance of the WC_Coupon Object
$coupon = new WC_Coupon();

// Set the necessary coupon data (since WC 3+)
$coupon->set_code( $coupon_code ); // (string)
// $coupon->set_description( $description ); // (string)
$coupon->set_discount_type( $discount_type ); // (string)
$coupon->set_amount( $coupon_amount ); // (float)
// $coupon->set_date_expires( $date_expires ); // (string|integer|null)
// $coupon->set_date_created( $date_created ); // (string|integer|null)
// $coupon->set_date_modified( $date_created ); // (string|integer|null)
// $coupon->set_usage_count( $usage_count ); // (integer)
$coupon->set_individual_use( true ); // (boolean) 
// $coupon->set_product_ids( $product_ids ); // (array)
// $coupon->set_excluded_product_ids( $excl_product_ids ); // (array)
$coupon->set_usage_limit( 0 ); // (integer)
// $coupon->set_usage_limit_per_user( $usage_limit_per_user ); // (integer)
// $coupon->set_limit_usage_to_x_items( $limit_usage_to_x_items ); // (integer|null)
// $coupon->set_free_shipping( $free_shipping ); // (boolean) | default: false
// $coupon->set_product_categories( $product_categories ); // (array)
// $coupon->set_excluded_product_categories( $excl_product_categories ); // (array)
// $coupon->set_exclude_sale_items( $excl_sale_items ); // (boolean)
// $coupon->set_minimum_amount( $minimum_amount ); // (float)
// $coupon->set_maximum_amount( $maximum_amount ); // (float)
// $coupon->set_email_restrictions( $email_restrictions ); // (array)
// $coupon->set_used_by( $used_by ); // (array)
// $coupon->set_virtual( $is_virtual ); // (array)

// Create, publish and save coupon (data)
$coupon->save();

现在要更新优惠券,您可以将以下挂钩函数与任何 setter 方法结合使用,例如:

add_action( 'woocommerce_coupon_options_save', 'action_coupon_options_save', 10, 2 );
function action_coupon_options_save( $post_id, $coupon ) {
    $coupon->set_usage_limit( 0 );
    $coupon->save();
}

代码进入活动子主题(或活动主题)的 functions.php 文件。