有必要确保发送表格时,该人收到专门为其生成的促销代码。问题是,信件到达,促销代码已生成,但促销代码未插入信件中。 WordPress 网站,woocomerce,店面主题,我使用 contact form7 作为表单。这就是我在 function.php 中得出的结论 我的主题:
// Обработка формы после отправки
function process_form_after_submission($contact_form) {
// Получаем значения из формы
$submission = WPCF7_Submission::get_instance();
if ($submission) {
$posted_data = $submission->get_posted_data();
// Получаем значение поля "E-mail"
$email = isset($posted_data['email-504']) ? sanitize_email($posted_data['email-504']) : '';
// Генерируем уникальный промокод
$coupon_code = generate_unique_coupon($email);
if ($coupon_code) {
// Устанавливаем параметры промокода (ваша дата и сумма могут отличаться)
$coupon = array(
'post_title' => $coupon_code,
'post_content' => '',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'shop_coupon',
'post_excerpt' => 'Промокод для ' . $email,
);
// Создаем промокод
$new_coupon_id = wp_insert_post($coupon);
// Устанавливаем сумму скидки и ограничения
update_post_meta($new_coupon_id, 'discount_type', 'fixed_cart');
update_post_meta($new_coupon_id, 'coupon_amount', 1000);
update_post_meta($new_coupon_id, 'individual_use', 'yes');
update_post_meta($new_coupon_id, 'usage_limit', 1);
update_post_meta($new_coupon_id, 'expiry_date', strtotime('+1 week'));
// Сохраняем промокод в сессии для использования в блоке благодарности
WC()->session->set('generated_coupon', $coupon_code);
}
}
}
add_action('wpcf7_mail_sent', 'process_form_after_submission');
// Заменяем шорткод [generated_coupon] на значение из сессии
function replace_generated_coupon_shortcode($content) {
return str_replace('[generated_coupon]', WC()->session->get('generated_coupon'), $content);
}
add_filter('wpcf7_mail_tag_replaced', 'replace_generated_coupon_shortcode', 10, 3);
// Генерация уникального промокода
function generate_unique_coupon($email) {
$coupon_code = 'DISCOUNT_' . wp_generate_password(8, false);
// Дополнительные проверки, чтобы избежать конфликтов
$existing_coupon = get_page_by_title($coupon_code, OBJECT, 'shop_coupon');
if ($existing_coupon) {
// Если промокод с таким кодом уже существует, генерируем новый
return generate_unique_coupon($email);
}
return $coupon_code;
}
您的
wpcf7_mail_sent
处理程序创建优惠券代码并将其设置在会话中,您的 wpcf7_mail_tag_replaced
处理程序从会话中读取并将其替换到电子邮件中。
但是,
wpcf7_mail_tag_replaced
钩子会在wpcf7_mail_sent
之前触发,因此此时优惠券不会被创建。
您必须在过程中较早触发的钩子中创建帖子/将代码写入会话(我认为
wpcf7_posted_data
可能适合于此)
// Обработка формы перед отправкой письма
function process_form_before_send_mail($contact_form) {
// Проверяем ID формы
if ($contact_form->id() === 'c310a2d') {
// Получаем значения из формы
$submission = WPCF7_Submission::get_instance();
if ($submission) {
$posted_data = $submission->get_posted_data();
// Получаем значение поля "E-mail"
$email = isset($posted_data['email-504']) ? sanitize_email($posted_data['email-504']) : '';
// Генерируем уникальный промокод
$coupon_code = generate_unique_coupon($email);
if ($coupon_code) {
// Сохраняем промокод в сессии для использования в блоке благодарности
WC()->session->set('generated_coupon', $coupon_code);
}
}
}
}
add_action('wpcf7_before_send_mail', 'process_form_before_send_mail');
// Заменяем шорткод [generated_coupon] на значение из сессии
function replace_generated_coupon_shortcode($content, $contact_form, $args) {
// Проверяем ID формы
if ($contact_form->id() === 'c310a2d') {
$coupon_code = WC()->session->get('generated_coupon');
// Дополнительно, отправляем письмо с промокодом
$mail_body = str_replace('[generated_coupon]', $coupon_code, $content);
$mail_subject = $contact_form->title();
$mail_to = $contact_form->prop('mail')['recipient'];
wp_mail($mail_to, $mail_subject, $mail_body);
return $content;
}
return $content;
}
add_filter('wpcf7_mail_replace_tags', 'replace_generated_coupon_shortcode', 10, 3);
// Генерация уникального промокода
function generate_unique_coupon($email) {
$coupon_code = 'DISCOUNT_' . wp_generate_password(8, false);
// Дополнительные проверки, чтобы избежать конфликтов
$existing_coupon = wc_get_coupon($coupon_code);
if ($existing_coupon) {
// Если промокод с таким кодом уже существует, генерируем новый
return generate_unique_coupon($email);
}
// Создаем объект промокода в WooCommerce
$coupon = new WC_Coupon();
$coupon->set_code($coupon_code);
$coupon->set_description('Промокод для ' . $email);
$coupon->set_discount_type('fixed_cart');
$coupon->set_amount(1000);
$coupon->set_individual_use(true);
$coupon->set_usage_limit(1);
$coupon->set_expiry_date(strtotime('+1 week'));
// Сохраняем промокод
$coupon->save();
return $coupon_code;
}