Диагностика задачи: зачем менять URL товара после покупки
В стандартной конфигурации WooCommerce URL страницы товара остаётся постоянным независимо от статуса заказа. Однако в ряде случаев требуется изменить URL товара после покупки — например, чтобы перенаправить покупателя на страницу с благодарностью, дополнительными инструкциями или ограничить повторный доступ к странице товара. Такая задача актуальна для цифровых товаров, ограниченных по времени акций и эксклюзивных предложений.
GeneratePress, как лёгкая тема, не вмешивается в логику URL WooCommerce, поэтому решение нужно реализовать через хуки WooCommerce и WordPress.
Пошаговое решение: изменение URL товара после покупки
1. Определяем условие покупки товара
Для начала нужно отследить, что пользователь приобрёл конкретный товар. Это можно сделать, используя хук woocommerce_thankyou, который срабатывает после успешного оформления заказа.
add_action('woocommerce_thankyou', 'gp_redirect_after_purchase');
function gp_redirect_after_purchase($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// ID нужного товара
$target_product_id = 1234;
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $target_product_id) {
// Тут будет редирект или смена URL
break;
}
}
}2. Реализуем перенаправление на новую страницу после покупки
Чтобы изменить URL страницы товара, проще всего сделать редирект при попытке открыть страницу товара. Для этого добавим фильтр, который при попытке загрузить страницу купленного товара перенаправит пользователя.
add_action('template_redirect', 'gp_redirect_product_page_after_purchase');
function gp_redirect_product_page_after_purchase() {
if (!is_product()) return;
global $post;
$product_id = $post->ID;
$user_id = get_current_user_id();
if (!$user_id) return; // Только для авторизованных
// Проверяем, купил ли пользователь этот товар
$customer_orders = wc_get_orders(array(
'customer_id' => $user_id,
'limit' => -1,
'status' => array('completed','processing'),
));
foreach ($customer_orders as $order) {
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $product_id) {
// Перенаправляем на кастомную страницу
wp_redirect(site_url('/product-purchased?product_id=' . $product_id));
exit;
}
}
}
}3. Создаём кастомную страницу для купленного товара
Создайте страницу WordPress с ярлыком product-purchased. На ней можно вывести благодарность, инструкции или дополнительные услуги. Для динамической подстановки данных используйте GET-параметр product_id.
add_shortcode('gp_product_purchased_info', function() {
if (!isset($_GET['product_id'])) return 'Информация о товаре недоступна.';
$product_id = intval($_GET['product_id']);
$product = wc_get_product($product_id);
if (!$product) return 'Товар не найден.';
ob_start();
?>
<h2>Спасибо за покупку: <?php echo esc_html($product->get_name()); ?></h2>
<p>Здесь вы можете найти инструкции и дополнительные материалы по вашему товару.</p>
<?php
return ob_get_clean();
});Добавьте шорткод [gp_product_purchased_info] на страницу product-purchased.
Проверка результата после внедрения
- Оформите заказ на товар с ID 1234 от учётной записи пользователя.
- После успешной покупки попробуйте открыть страницу этого товара снова, будучи авторизованным под этим пользователем.
- Должен произойти редирект на страницу
/product-purchased?product_id=1234с соответствующим сообщением. - Для неавторизованных или пользователей, которые не покупали товар, страница товара откроется в обычном виде.
Частые ошибки и как их исправить
- Редирект не срабатывает: Проверьте, что код подключен в functions.php дочерней темы или через плагин с приоритетом выше 10. Также убедитесь, что нет конфликтов с другими редиректами.
- Проверка заказа не учитывает статус: Важно фильтровать заказы по статусам
completedиprocessing, иначе пользователь может быть перенаправлен до оплаты. - Пользователь не авторизован: Если нужно работать с гостями, логику нужно дополнить, например, по email из заказа, но это усложняет реализацию и требует дополнительной проверки безопасности.
- Плохая производительность: Вызов
wc_get_ordersс большим количеством заказов замедляет сайт. Если у пользователя много заказов, лучше реализовать кэширование или использовать отдельное поле метаданных.
Практические советы по безопасности и производительности
- Используйте nonce и проверки прав пользователя, если добавляете формы или динамический вывод.
- Кэшируйте результаты проверок покупок в user meta на 10-15 минут, чтобы снизить нагрузку.
- Избегайте редиректов для гостей или анонимных пользователей без дополнительной авторизации.
- Минимизируйте количество запросов к базе, особенно если на сайте много заказов и покупателей.
Альтернативные подходы: сравнение методов изменения URL товара после покупки
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Редирект через template_redirect |
Перенаправление пользователя при попытке открыть страницу купленного товара | Простая реализация, гибкость в настройке страницы | Дополнительные запросы к базе, возможные конфликты с кэшированием |
| Изменение постоянной ссылки (permalink) товара | Изменение URL товара после покупки через фильтры WooCommerce | URL уникален, можно интегрировать с SEO | Сложно реализовать, возможны проблемы с индексированием и SEO |
| Использование плагина для управления доступом | Блокировка доступа к странице товара после покупки | Быстрое решение, нет необходимости писать код | Может быть избыточным, влияет на производительность |