Вопрос или проблема
Я начал писать плагин, который позволяет администратору выбирать конкретные страницы и устанавливать их видимость только для вошедших в систему пользователей; плагин дополнительно может применять это ограничение к всем дочерним страницам. Когда посетитель сайта пытается открыть любую из этих страниц, он перенаправляется на страницу входа.
Пока все хорошо. Пока это работает, и дублирует функционал, который я видел в существующих плагинах.
Однако, что я также хочу сделать, это автоматически удалить все эти страницы (включая дочерние страницы, где это указано) из меню фронтенда сайта. Я не хочу, чтобы они были видимыми, пока вы не вошли в систему.
Я видел решения, где люди создают два меню и переключаются между ними в зависимости от статуса входа, но это дополнительный шаг, который я бы предпочел избежать.
Я думал, что мог бы подойти к этому, добавив фильтр или хук действия для ‘wp_nav_menu_items’ в коде плагина, но у меня пока не было успеха с этим.
Какие мысли?
Спасибо,
Фил
Дополнительные детали (меньшая часть проблемы):
Вот небольшой кусок кода из моего плагина, который я пытаюсь использовать для перехвата элементов меню:
add_filter('wp_nav_menu_items','ppa_filter_visible_menus');
function ppa_filter_visible_menus($nav) {
die("filter menus");
}
Проблема в том, что ppa_filter_visible_menus не вызывается.
Ну, простое решение — это CSS
<!-- СКРЫВАЕТ элемент меню, если пользователь не вошел в систему -->
<?php if (is_user_logged_in()){
echo "";}
else {
echo "<style type="text/css">
.menu-item-58 {display:none;}
</style>";
};
?>
Но если вы пытаетесь разобраться с кодом, посмотрите исходный код этого плагина http://wordpress.org/extend/plugins/if-menu/ — это вам очень поможет.
А если вы просто хотите получить простое кодовое решение — замените заголовок
<ul>
<?php wp_list_pages(); ?>
</ul>
На условное выражение
if user not logged in
show
<ul>
<?php wp_list_pages('exclude=17,38' ); ?>
</ul>
где exclude — это идентификаторы страниц, которые вы не хотите, чтобы пользователь, не вошедший в систему, видел.
При этом используйте else, чтобы показать все меню вошедшему в систему пользователю
else
<ul>
<?php wp_list_pages(); ?>
</ul>
Надеюсь, это поможет вам. Держите нас в курсе.
Ответ или решение
Для успешного удаления элементов меню на лету в зависимости от настроек вашего плагина, предлагаю рассмотреть несколько ключевых шагов и рекомендаций. Ваш плагин уже демонстрирует рабочую логику обработки видимости страниц для пользователей, поэтому мы сосредоточимся на том, как управлять элементами меню с использованием хука wp_nav_menu_items
.
1. Использование хука wp_nav_menu_items
Хук wp_nav_menu_items
представляет собой идеальное решение для динамического изменения элементов меню. Вам нужно создать функцию-фильтр, которая будет проверять, вошел ли пользователь в систему, и, если нет, удалять необходимые элементы меню. Убедитесь, что ваша функция правильно зарегистрирована и вызывается.
2. Пример реализации
Вот пример того, как можно реализовать ваше намерение:
add_filter('wp_nav_menu_items', 'ppa_filter_visible_menus', 10, 2);
function ppa_filter_visible_menus($items, $args) {
// Получите ID страниц, которые должны быть скрыты для незалогиненных пользователей
$restricted_pages = get_option('your_plugin_restricted_pages'); // Параметры должны храниться в настройках вашего плагина
if (!is_user_logged_in()) {
// Перебираем элементы меню
foreach ($restricted_pages as $page_id) {
// Создаем регулярное выражение для поиска элементов меню по ID страницы
$items = preg_replace('/<li[^>]*?id="menu-item-' . $page_id . '"[^>]*?>.*?<\/li>/is', '', $items);
}
}
return $items;
}
3. Объяснение кода
- В приведённом коде мы используем хук
wp_nav_menu_items
, чтобы модифицировать элементы меню. - Функция
ppa_filter_visible_menus
принимает два параметра:$items
(HTML-код элементов меню) и$args
(массив аргументов меню). - Вы получаете список ограниченных страниц из опций вашего плагина (здесь можно использовать функцию
get_option
). - Если пользователь не залогинен, вы перебираете список запрещённых страниц и с помощью регулярного выражения удаляете соответствующие элементы меню.
4. Отладка
Если ваша функция фильтра по-прежнему не срабатывает, проверьте:
- Активен ли ваш плагин и правильно ли он инициализируется.
- Прикреплен ли фильтр к нужному месту — убедитесь, что ваш код находится в файле плагина, который загружается до вызова меню.
- Вы можете использовать
error_log()
для отладки и проверки, вызывается ли ваша функция.
5. Альтернативные подходы
Хотя указанный способ является самым простым и эффективным, можно рассмотреть и другие методы, например, использование CSS для скрытия элементов. Однако это не лучший способ с точки зрения безопасности, поскольку элементы всё равно будут доступны в исходном коде страницы.
Заключение
С помощью правильного использования хука wp_nav_menu_items
вы сможете на лету изменять элементы меню в зависимости от статуса пользователя без создания дополнительных меню. Сделав это, вы повысите удобство использования и безопасность вашего плагина. Не забудьте тестировать изменения на разных уровнях доступа пользователей, чтобы убедиться, что все работает корректно и по назначению.