Как спрятать WooCommerce Cart и Mini Cart от посторонних пользователей

Диагностика проблемы: зачем скрывать корзину WooCommerce

В некоторых случаях нужно ограничить видимость корзины WooCommerce для гостей или определенных ролей пользователей. Например, если магазин работает только для зарегистрированных клиентов или если корзина отображается в публичной части сайта и мешает дизайну или безопасности. В стандартной установке WooCommerce корзина и мини-корзина доступны всем посетителям, что может привести к нежелательному поведению или утечке информации.

Пошаговое решение: скрываем корзину WooCommerce для гостей и определенных ролей

1. Скрытие мини-корзины для незарегистрированных пользователей через фильтр

WooCommerce использует виджет мини-корзины, который выводится через функцию woocommerce_mini_cart(). Чтобы полностью скрыть мини-корзину для гостей, можно отключить ее вывод через хук wp_nav_menu_items или через условное отображение в шаблоне.

Пример кода, который полностью удалит мини-корзину из меню у незарегистрированных пользователей:

add_filter('wp_nav_menu_items', 'hide_mini_cart_for_guests', 10, 2);
function hide_mini_cart_for_guests($items, $args) {
    if (is_user_logged_in()) {
        return $items;
    }
    // Предполагается, что мини-корзина добавляется в меню с определенным CSS-классом
    // Можно убрать элемент с классом 'menu-item-minicart'
    $items = preg_replace('/<li[^>]*menu-item-minicart[^>]*>.*?<\/li>/is', '', $items);
    return $items;
}

2. Скрытие страницы корзины и редирект гостей

Чтобы полностью запретить доступ к странице корзины для гостей, добавьте следующий код в functions.php вашей темы или в кастомный плагин:

add_action('template_redirect', 'redirect_cart_page_for_guests');
function redirect_cart_page_for_guests() {
    if (is_cart() && !is_user_logged_in()) {
        wp_redirect(wp_login_url());
        exit;
    }
}

Этот код перенаправит всех незарегистрированных пользователей со страницы /cart/ на страницу входа.

3. Скрытие видимости корзины на фронте через CSS

Если мини-корзина выводится через виджет или шорткод, и нет возможности изменить вывод через PHP, можно скрыть ее через CSS:

body:not(.logged-in) .widget_shopping_cart,
body:not(.logged-in) .woocommerce-mini-cart {
    display: none !important;
}

Для этого в functions.php нужно добавить класс logged-in к <body> у авторизованных пользователей:

add_filter('body_class', 'add_logged_in_body_class');
function add_logged_in_body_class($classes) {
    if (is_user_logged_in()) {
        $classes[] = 'logged-in';
    }
    return $classes;
}

Проверка результата после внедрения

  • Откройте сайт в режиме гостя (инкогнито) и проверьте, что мини-корзина не отображается в меню или сайдбаре.
  • Попробуйте перейти на страницу /cart/ — должно произойти перенаправление на страницу входа.
  • Авторизуйтесь под пользователем с ролью «Клиент» и убедитесь, что корзина и мини-корзина отображаются корректно.
  • Проверьте консоль браузера и логи сервера на наличие ошибок PHP или JavaScript.

Частые ошибки и как их исправить

  • Мини-корзина не скрывается полностью: возможно, в меню или шаблоне мини-корзина выводится не как элемент с ожидаемым CSS-классом. Проверьте структуру HTML и скорректируйте селектор в коде.
  • Редирект срабатывает у всех пользователей: проверьте, что функция is_user_logged_in() корректно работает, и код не вызывается на админке.
  • CSS не применяется: убедитесь, что класс logged-in добавляется к тегу body, и селекторы CSS правильно написаны.
  • Конфликт с кешированием: очистите кеш сайта и браузера, если изменения не видны.

Практические советы по безопасности и производительности

  • Используйте перенаправление на сервере (PHP), а не только скрытие через CSS — это надежнее с точки зрения безопасности.
  • Минимизируйте количество запросов к БД при проверке прав доступа, не создавайте лишних хуков.
  • Для SEO важно, чтобы страницы корзины не индексировались поисковиками для гостей — добавьте в robots.txt или мета-теги noindex при необходимости.
  • Если используете кеширующие плагины, убедитесь, что они корректно обрабатывают страницы для авторизованных и неавторизованных пользователей.

Таблица сравнения способов скрытия корзины WooCommerce

МетодПреимуществаНедостаткиПример кода/плагина
PHP-редирект на страницу входаНадежная защита, предотвращает доступМожет ухудшить UX, если нет регистрацииtemplate_redirect + wp_redirect (см. выше)
Удаление мини-корзины из меню через фильтрГибко, работает с кастомными менюТребует точного CSS-классаwp_nav_menu_items filter
Скрытие через CSSПростота внедрения, быстроНе защищает от прямого доступаCSS + body_class для logged-in
Плагины (например, User Role Editor + WooCommerce settings)Удобно для управления ролямиМожет замедлять сайт, лишние зависимостиПлагины из репозитория WP
⭐⭐⭐⭐⭐