Приведенный ниже код позволяет генерировать купоны и их автоматическое применение, когда пользователь обращается к такой ссылке, как example.com/cart/?coupon-code=mycupon. К сожалению, код генерирует купоны каждый раз при перезагрузке страницы. Я пытался изменить код, но мне не удалось сделать его работоспособным. Код должен работать так: если код был сгенерирован в сеансе, другой код не должен генерироваться при перезагрузке страницы. Поскольку я не нашел решения, которое не генерировало бы другой код, если бы он был сгенерирован в этом сеансе, я попытался сделать так, чтобы купон нельзя было применять вместе с другим кодом. К сожалению, мне не удалось сделать его функциональным. Мой код показывает, что к корзине был применен только один купон, но на самом деле были добавлены все купоны, сгенерированные при перезагрузке страницы. Еще одно изменение кода сгенерировало для меня почти 7000 купонов за несколько минут
< p>Код должен генерировать разные купоны для каждого пользователя, который обращается к этой ссылке. Можете ли вы помочь мне решить проблему?
Заранее спасибо!
Код: Выделить всё
function coupon_exists($coupon_code) {
global $wpdb;
$sql = $wpdb->prepare( "SELECT post_name FROM $wpdb->posts WHERE post_type = 'shop_coupon' AND post_name = '%s'", $coupon_code );
$coupon_codes = $wpdb->get_results($sql);
if (count($coupon_codes)> 0) {
return true;
}
else {
return false;
}
}
// Utility function that generate a non existing coupon code (as each coupon code has to be unique)
function random_coupon_code() {
global $wpdb;
// Get an array of all existing coupon codes
$coupon_codes_check = $wpdb->get_col("SELECT post_name FROM $wpdb->posts WHERE post_type = 'shop_coupon'");
for ( $i = 0; $i < 1; $i++ ) {
$generated_code = strtolower( wp_generate_password( 15, false ) );
// Check if the generated code doesn't exist yet
if( in_array( $generated_code, $coupon_codes_check ) ) {
$i--; // continue the loop and generate a new code
} else {
break; // stop the loop: The generated coupon code doesn't exist already
}
}
return $generated_code;
}
function generate_random_coupon($coupon_generated) {
// Set some coupon data by default
$date_expires = date('Y-m-d', strtotime('+1 days'));
$discount_type = 'fixed_cart'; // 'store_credit' doesn't exist
$coupon_amount = '10';
$coupon = new WC_Coupon();
// Generate a non existing coupon code name
$coupon_code = random_coupon_code();
$coupon->set_code($coupon_generated);
//the coupon discount type can be 'fixed_cart', 'percent' or 'fixed_product', defaults to 'fixed_cart'
$coupon->set_discount_type($discount_type);
//the discount amount, defaults to zero
$coupon->set_amount($coupon_amount );
$coupon->set_date_expires( $date_expires );
//save the coupon
$coupon->save();
return $coupon_generated;
}
function hwn_add_programmatically_created_coupon_to_basket( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$coupon_code = random_coupon_code();
if (!coupon_exists($coupon_code)) {
generate_random_coupon($coupon_code);
}
$applied_coupons = $cart->get_applied_coupons();
if( ! in_array($coupon_code, $applied_coupons)){
$cart->add_discount( $coupon_code );
wc_print_notices();
}
elseif( in_array($coupon_code, $applied_coupons)){
$cart->remove_coupon( $coupon_code );
}
}
add_action('woocommerce_before_calculate_totals', 'hwn_add_programmatically_created_coupon_to_basket');
Источник: https://stackoverflow.com/questions/781 ... ing-a-link
Мобильная версия