Проблема: стандартный заголовок страницы Спасибо за заказ не подходит
По умолчанию WooCommerce выводит фиксированный заголовок (title) на странице «Спасибо за заказ» (Order Received). В большинстве тем это заголовок «Спасибо за заказ». Иногда требуется изменить заголовок динамически — например, добавить номер заказа, имя пользователя или другую информацию, чтобы улучшить UX или SEO.
Диагностика проблемы
Чтобы убедиться, что заголовок стандартный и не изменяется, откройте страницу завершения заказа (обычно /checkout/order-received/) и посмотрите код страницы или заголовок вкладки браузера. Скорее всего, там стоит статичный текст.
Проверить, какой именно заголовок используется:
add_action('wp_head', function() {
if (is_order_received_page()) {
echo '<!-- Заголовок страницы: ' . get_the_title() . ' -->';
}
});Если тема выводит заголовок через wp_title() или the_title(), то можно влиять на него фильтрами.
Как программно изменить заголовок страницы «Спасибо за заказ»
WooCommerce не предоставляет отдельного фильтра для изменения заголовка страницы оформления заказа, но WordPress позволяет менять заголовок через фильтр document_title_parts. Используем этот фильтр для модификации.
Шаги решения
- Добавьте следующий код в файл
functions.phpвашей темы или в плагин-сниппет:
add_filter('document_title_parts', function($title) {
if (function_exists('is_order_received_page') && is_order_received_page()) {
$order_id = absint(isset($_GET['order']) ? $_GET['order'] : 0);
if ($order_id) {
$order = wc_get_order($order_id);
if ($order) {
$customer_name = $order->get_billing_first_name() ?: 'клиент';
$title['title'] = 'Спасибо за заказ №' . $order_id . ', ' . esc_html($customer_name);
}
}
}
return $title;
});Этот код проверяет, что мы на странице подтверждения заказа, получает ID заказа из URL, и если заказ существует, меняет заголовок, добавляя номер заказа и имя клиента.
Что делает код:
- Фильтрует части заголовка страницы WordPress.
- Проверяет текущую страницу на соответствие странице «Спасибо за заказ».
- Получает номер заказа из параметров URL.
- Вытягивает имя клиента из метаданных заказа.
- Заменяет заголовок страницы на кастомный.
Проверка результата
После добавления кода:
- Оформите тестовый заказ в WooCommerce.
- На странице окончания заказа проверьте заголовок вкладки браузера — он должен выглядеть как «Спасибо за заказ №123, Иван».
- Просмотрите исходный код страницы в <title> — заголовок должен быть обновлён.
Если заголовок не изменился, проверьте, не перезаписывает ли тема заголовок собственным методом. Для проверки временно переключитесь на дефолтную тему (например, Storefront) и проверьте снова.
Частые ошибки и как их исправить
- Порядок фильтров: Если тема использует собственные фильтры заголовка, ваш фильтр может не сработать. Попробуйте увеличить приоритет, например,
add_filter(..., 999). - Отсутствие параметра order в URL: Некоторые кастомные решения WooCommerce могут не передавать ID заказа в URL. В таком случае получить ID заказа через глобальные объекты невозможно. Решение — использовать сессии или хук
woocommerce_thankyouдля сохранения ID заказа в сессию. - Не подключена функция is_order_received_page(): Убедитесь, что WooCommerce активен и функции доступны.
Практические советы по безопасности и производительности
- Обязательно используйте
esc_html()при выводе данных пользователя, чтобы избежать XSS-уязвимостей. - Проверяйте наличие заказа перед использованием, чтобы избежать ошибок PHP.
- Для производительности не делайте лишних запросов — используйте кэширование, если данные используются часто.
Сравнение вариантов изменения заголовка
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр document_title_parts | Простой, универсальный, не зависит от темы | Может конфликтовать с темами, которые жестко задают заголовок |
| Редактирование шаблона thankyou.php | Полный контроль над выводом | Требует поддержки при обновлениях WooCommerce |
Использование wp_title или pre_get_document_title | Альтернативные фильтры, могут работать в старых версиях WP | Менее универсальны, могут не сработать с SEO-плагинами |
Дополнительный пример: сохранение ID заказа в сессии
Если ID заказа не передаётся в URL, можно сохранить его в сессии при оформлении заказа:
add_action('woocommerce_thankyou', function($order_id) {
if ($order_id) {
WC()->session->set('last_order_id', $order_id);
}
});
add_filter('document_title_parts', function($title) {
$order_id = WC()->session->get('last_order_id');
if ($order_id) {
$order = wc_get_order($order_id);
if ($order) {
$customer_name = $order->get_billing_first_name() ?: 'клиент';
$title['title'] = 'Спасибо за заказ №' . $order_id . ', ' . esc_html($customer_name);
}
}
return $title;
});