Диагностика задачи: зачем менять шаблон страницы товара для залогиненных пользователей
В стандартной комплектации WooCommerce все пользователи видят одинаковую страницу товара. Задача — показать зарегистрированным клиентам, например, специальные цены, персональные скидки или дополнительную информацию, не доступную гостям. В теме GeneratePress это можно сделать без создания дочерней темы, используя хуки и фильтры WooCommerce и GeneratePress.
Пошаговое решение: кастомизация шаблона товара для зарегистрированных пользователей
1. Создаем функцию проверки авторизации и вывода кастомного контента
Добавьте следующий код в functions.php вашей дочерней темы или в плагин для кастомных функций:
function gp_custom_product_template_content() {
if ( is_user_logged_in() ) {
// Кастомный контент для зарегистрированных пользователей
echo '<div class="gp-logged-in-info">';
echo '<p><strong>Специальное предложение для вас!</strong> Получите скидку 10% при покупке этого товара.</p>';
// Дополнительный пример: показать кастомную цену
global $product;
if ( $product ) {
$price = $product->get_price();
$discounted_price = $price * 0.9; // 10% скидка
echo '<p>Цена для вас: <del>' . wc_price($price) . '</del> <ins>' . wc_price($discounted_price) . '</ins></p>';
}
echo '</div>';
}
}2. Подключаем функцию к странице товара через хук WooCommerce
Вставьте вывод функции после описания товара, используя хук woocommerce_after_single_product_summary с приоритетом 15, чтобы не мешать стандартным блокам:
add_action( 'woocommerce_after_single_product_summary', 'gp_custom_product_template_content', 15 );3. Добавляем стили для кастомного блока
Чтобы выделить блок для зарегистрированных пользователей, добавьте CSS в файл стилей дочерней темы или через Customizer:
.gp-logged-in-info {
background-color: #eaf8ff;
border: 1px solid #0073aa;
padding: 15px;
margin-top: 20px;
border-radius: 5px;
font-size: 16px;
color: #004a7f;
}Проверка результата после внедрения
1. Зайдите на страницу товара как гость — блок с персональными скидками не должен отображаться.
2. Авторизуйтесь под зарегистрированным пользователем и откройте ту же страницу товара — блок с предложением и ценой должен появиться.
3. Используйте инструменты разработчика (DevTools) для проверки наличия блока .gp-logged-in-info и корректности стилей.
Частые ошибки и как их исправить
- Блок не отображается для залогиненных пользователей: проверьте, что функция подключена через
add_actionи чтоis_user_logged_in()возвращает true. - Код добавлен в основной файл темы GeneratePress: это опасно, измените код в дочерней теме или через плагин, чтобы не потерять изменения при обновлении.
- Стили не применяются: убедитесь, что CSS правильно загружается, нет конфликтов с другими стилями, и в классе нет опечаток.
- Цена не меняется: проверьте, что глобальный объект
$productдоступен, и используйте корректные методы WooCommerce (get_price(),wc_price()).
Практические советы по безопасности и производительности
- Код с проверкой
is_user_logged_in()не влияет на производительность сайта, но избегайте тяжелых запросов в этой функции. - Для более сложных сценариев используйте transient API для кеширования персональных данных, если они подтягиваются из базы.
- Включайте кастомный функционал через дочернюю тему или плагин, чтобы избежать потери при обновлениях.
- Проверяйте совместимость с плагинами WooCommerce и GeneratePress после обновлений.
Сравнение вариантов реализации кастомизации страницы товара
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Хуки WooCommerce + условие is_user_logged_in() | Добавление кастомного блока через action | Простота, не требует копирования шаблонов, совместимость | Ограниченная кастомизация шаблона, подходит для вывода доп. информации |
| Перегрузка шаблона single-product.php в дочерней теме | Полная замена шаблона для разного типа пользователей | Полный контроль над разметкой | Сложность поддержки, риск конфликтов при обновлениях WooCommerce |
| Использование плагинов кастомизации WooCommerce | Графические настройки и условия показа | Удобство без кода | Нагрузка, ограниченная гибкость, зависимость от плагина |