В WordPress меню — важный элемент навигации, который помогает пользователям быстро ориентироваться на сайте. Однако со временем в меню могут накапливаться устаревшие или нерелевантные пункты, особенно если они связаны с динамическим контентом, например, постами или страницами. Вручную искать и удалять такие пункты неудобно, особенно если меню большое. В этой статье мы разберём, как автоматически удалять старые пункты меню WordPress по дате создания или по другим критериям, используя код и плагины.
Почему в меню появляются старые пункты и зачем их удалять?
Меню WordPress может содержать ссылки на статические страницы, категории, произвольные ссылки и даже на записи блога. Если меню создавалось вручную, старые пункты могут просто лежать без дела. Если же меню формируется динамически (например, через плагин или код), то в него могут попадать устаревшие записи или страницы.
Удаление старых пунктов меню помогает:
- Поддерживать актуальность навигации;
- Улучшить пользовательский опыт;
- Упростить администрирование;
- Избежать битых ссылок и ошибок.
Рассмотрим несколько способов, как автоматизировать этот процесс.
Автоматическое удаление пунктов меню по дате создания записи
Если пункты меню ссылаются на записи или страницы, можно проверить дату создания этих объектов и удалить ссылки на те, что старше заданного срока.
Обработка меню через фильтр wp_get_nav_menu_items
Для начала получим пункты меню через фильтр wp_get_nav_menu_items и отфильтруем их, удаляя устаревшие.
add_filter('wp_get_nav_menu_items', 'wponline_filter_old_menu_items', 10, 3);
function wponline_filter_old_menu_items($items, $menu, $args) {
$threshold_date = strtotime('-1 year'); // Удалять пункты старше 1 года
$filtered_items = [];
foreach ($items as $item) {
// Проверяем только пункты, связанные с записями
if ($item->object === 'post' || $item->object === 'page') {
$post_date = strtotime(get_post_field('post_date', $item->object_id));
if ($post_date >= $threshold_date) {
$filtered_items[] = $item;
}
} else {
// Оставляем другие пункты без изменений
$filtered_items[] = $item;
}
}
return $filtered_items;
}
В этом коде мы задаём порог в 1 год и фильтруем пункты меню. Пункты, связанные с постами и страницами старше года, удаляются из вывода меню.
Где разместить код
Этот код можно добавить в файл functions.php вашей темы или лучше в плагин для пользовательских функций (например, созданный самостоятельно).
Использование плагинов для автоматизации управления меню
Есть плагины, которые расширяют возможности меню и позволяют динамически формировать его содержимое. Рассмотрим несколько полезных:
- Clearfy Pro — этот плагин содержит множество оптимизаций, включая автоматическое управление меню и очистку от устаревших элементов.
- WPCommunity — если вы используете форум или сообщество, этот плагин поможет интегрировать динамическое меню, которое обновляется в зависимости от активности пользователей.
Использование плагинов может значительно упростить работу, но не всегда подходит для специфических задач. В таких случаях лучше использовать кастомный код.
Удаление пунктов меню по пользовательским меткам (CSS классы и атрибуты)
Иногда в меню можно добавлять пользовательские CSS классы или атрибуты, по которым можно фильтровать устаревшие пункты. Например, можно при создании пункта меню добавить класс old-item и потом удалять такие пункты программно.
add_filter('wp_get_nav_menu_items', 'wponline_remove_old_class_menu_items', 10, 3);
function wponline_remove_old_class_menu_items($items, $menu, $args) {
$filtered_items = [];
foreach ($items as $item) {
if (in_array('old-item', $item->classes)) {
continue; // пропускаем пункты с классом old-item
}
$filtered_items[] = $item;
}
return $filtered_items;
}
Такой способ удобен, если вы хотите вручную помечать пункты меню для удаления, а потом удалять их автоматически.
Как регулярно чистить меню — планирование задач через WP-Cron
Чтобы автоматизировать удаление пунктов меню без вашего участия, можно настроить регулярную задачу с помощью WP-Cron, которая будет запускать очистку меню по расписанию.
Пример планирования задачи
if (!wp_next_scheduled('wponline_clean_menu_event')) {
wp_schedule_event(time(), 'daily', 'wponline_clean_menu_event');
}
add_action('wponline_clean_menu_event', 'wponline_clean_menu_callback');
function wponline_clean_menu_callback() {
// Логика удаления (например, удаляем пункты из базы данных)
// Здесь нужно получить меню и удалить элементы программно
}
WP-Cron запускает функцию wponline_clean_menu_callback каждый день. Внутри этой функции можно реализовать механизм реального удаления пунктов из меню через функции WordPress, например, wp_delete_post для кастомных пунктов меню (nav_menu_item).
Пример удаления пунктов меню из базы
function wponline_clean_menu_callback() {
$threshold_date = strtotime('-1 year');
$menu_locations = get_nav_menu_locations();
if (empty($menu_locations)) return;
$menu_id = reset($menu_locations);
$menu_items = wp_get_nav_menu_items($menu_id);
foreach ($menu_items as $item) {
if (($item->object === 'post' || $item->object === 'page') &&
strtotime(get_post_field('post_date', $item->object_id)) < $threshold_date) {
wp_delete_post($item->ID, true); // Удаляем пункт меню
}
}
}
Обратите внимание, что удаление пунктов меню — это удаление записей типа nav_menu_item из базы данных. Поэтому будьте осторожны и делайте резервные копии перед применением.
Вывод
Автоматизация удаления старых пунктов меню в WordPress помогает поддерживать актуальность навигации и облегчает администрирование сайта. Для большинства случаев достаточно фильтровать вывод меню через wp_get_nav_menu_items, а при необходимости — удалять пункты из базы с помощью WP-Cron. Если хотите облегчить себе жизнь, посмотрите в сторону плагинов типа Clearfy Pro, которые автоматизируют множество рутинных задач.