#wordpress #woocommerce #hook-woocommerce #coupon
#wordpress #woocommerce #крюк-woocommerce #купон
Вопрос:
Проверил уже десятки статей и вопросов, размещенных здесь — уже использовал советы из каждой из них 🙂
Моя цель — сгенерировать купон с заранее определенными реквизитами для конкретного идентификатора продукта после подтверждения оплаты. И я хочу, чтобы он был сгенерирован вручную. Вот мой код:
Это довольно длинная, но работающая функция для создания купона на определенный адрес электронной почты.
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 купона.
Любые советы приветствуются 🙂 Заранее спасибо!
Комментарии:
1. Нашел интересную вещь в базе данных …
post_name
заполнен кодом купона, который я хочу, но дляpost_title
него он полученpost_title
из обрабатываемого заказа…2. Найдена основная причина… Не уверен, почему (нужно взглянуть на документацию WC), но
post_title
был переопределен данными POST из заказа WC (название заказа).