WooCommerce: как изменить URL страницы товара после покупки в GeneratePress

Диагностика задачи: зачем менять 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
Использование плагина для управления доступом Блокировка доступа к странице товара после покупки Быстрое решение, нет необходимости писать код Может быть избыточным, влияет на производительность
WooCommerce: как изменить изображение товара после покупки в GeneratePress
02.05.2026
WooCommerce: автоматическое изменение статуса и названия товара после покупки в GeneratePress
29.05.2026
Как добавить отложенную загрузку картинок в GeneratePress для ускорения сайта
23.01.2026
Как добавить автоматическую подгрузку постов в GeneratePress для бесконечной прокрутки
03.02.2026
Как добавить кастомный функционал в GeneratePress через хуки и фильтры
21.03.2026