Всем привет. Встала передо мной задача сделать для одного своего проекта генерацию купонов после покупки товара и так как я расщедрился и решил сделать купоны накопительные, т.е. один купон дает скидку 100 рублей, 10 купонов дает скидку в 1000 рублей, 100 купонов даёт скидку в 10000 рублей и т.д. то встала задача во первых генерировать эти купоны (ну с этим я справился довольно быстро), а во вторых предотвратить повторный вход на страницу “Спасибо за покупку” (где и генерируется купон) иначе особо продвинутые и не очень покупатели просто смогут нагенерить себе купонов хоть на миллион, просто обновляя страницу.
И так задача стоит следующая — чтобы URL страницы “Спасибо за покупку” менялся каждый раз при генерации купона, к примеру посетитель после оплаты попадает на страницу на страницу https://site.ru/thanks-you/ ему выводится сообщение с благодарностью за покупку и выводится купон на скидку, теперь если обновить страницу она уже была не действительна а следующим посетителям генерировалась к примеру страница https://site.ru/thanks-you-7583/ и если бы посетитель попытался зайти на неё повторно, то опять таки она была бы не действительна.
Приступаем.
Шаг 1. генерируем купон
Делать это мы будем при помощи шорткода [coupon_code] который сгенерирует нам рандомный купон и запишет значение в файл codecoupon.txt (тут будут храниться все сгенерированные купоны).
Здесь я поставил лимит в 10 минут на генерацию нового купона (сейчас это не нужно), я это сделал потому что у меня поначалу не получалось изменить URL страницы и чтобы дать понять пользователю что обновление страницы не приведёт к генерации нового купона то сделал паузу в 10 минут. Хотя по большому счету проблему это не решает, т.к. пользователь мог бы сгенерить новый купон через 15 минут и т.д.
function generate_coupon_code() {
$coupon_code = get_transient('coupon_code');
if (false === $coupon_code) {
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$code_length = 6;
$coupon_code = '';
for ($i = 0; $i < $code_length; $i++) {
$random_index = rand(0, strlen($characters) - 1);
$coupon_code .= $characters[$random_index];
}
$file_path = get_template_directory() . '/codecoupon.txt';
file_put_contents($file_path, $coupon_code . PHP_EOL, FILE_APPEND | LOCK_EX);
set_transient('coupon_code', $coupon_code, 10 * MINUTE_IN_SECONDS);
}
return $coupon_code;
}
add_shortcode('coupon_code', 'generate_coupon_code');
function change_page_permalink($permalink) {
global $post, $wpdb;
// Проверяем, является ли текущая страница нужной страницей по ее ID
if (is_page(11185)) { // Замените 11185 на ID вашей страницы
// Формируем новый рандомный URL
$random_number = rand(1000, 9999);
$new_permalink = home_url('/thanks-' . $random_number . '/');
// Обновляем физический URL страницы
$wpdb->update(
$wpdb->posts,
array('post_name' => 'thanks-' . $random_number),
array('ID' => $post->ID)
);
return $new_permalink; // Возвращаем новый URL
}
return $permalink; // Возвращаем исходный URL для остальных страниц
}
add_filter('page_link', 'change_page_permalink');
// add_filter('post_link', 'change_page_permalink'); // Раскомментируйте если хотите применить это и к постам тоже
Данный код каждый раз меняет URL страницы с id=11185. URL будет вида /thanks-[рандомное число от 1000 до 9999]/
Далее я столкнулся со следующей проблемой — в WordPress есть встроенный механизм редиректа со старого URL на текущий, а так как изначальный URL у меня был /thanks/ то при попадании на данный URL пользователя редиректило на новый URL, избавляемся от этого
Шаг 3. Настраиваем редирект
Добавляем в .htaccess следующую строку
Redirect 301 /thanks/ /
Теперь если пользователь захочет попасть на страницу /thanks/ то его перенаправит на главную страницу сайта
Шаг 4. Запрещаем индексацию страниц со “Спасибо”
Теперь чтобы поисковики не индексировали наш /thanks/ и /tnanks-[рандомное число]/ добавляем в tobots.txt следующее правило
# Запрет на индексировании страницы со спасибо, так как сюда попадают
# только после оплаты Disallow: /thanks/
Disallow: /thanks-*/