В WordPress меню — это важный элемент навигации. Но иногда в меню скапливаются устаревшие или неактуальные пункты, которые нужно удалить, чтобы не загромождать интерфейс и не путать пользователей. В этой статье мы подробно рассмотрим, как автоматически удалять старые пункты меню в WordPress по дате создания и какие решения для этого можно использовать.
Почему важно периодически чистить меню в WordPress
Меню в WordPress может содержать ссылки на записи, страницы, категории или произвольные ссылки. Если в меню остаются ссылки на устаревший контент, это ухудшает UX, снижает качество сайта и может повлиять на SEO. Ручная очистка меню — трудоемкий процесс, особенно на больших сайтах. Автоматизация удаления старых пунктов меню помогает поддерживать навигацию в актуальном состоянии без лишних усилий.
Особенно это актуально для сайтов с часто обновляемым контентом — новостных порталов, блогов, онлайн-магазинов. Удаление устаревших пунктов меню по дате создания позволяет автоматически убирать ссылки на устаревшие записи или категории.
Как в WordPress хранится информация о пунктах меню
Пункты меню в WordPress — это записи типа nav_menu_item в таблице wp_posts. Для каждого пункта меню в мета-данных wp_postmeta хранятся дополнительные параметры. Однако сам пункт меню не хранит дату создания напрямую — он привязан к объекту (например, к странице или записи), у которой есть дата публикации.
Исходя из этого, логику удаления пунктов меню по дате нужно строить на основе даты объекта, связанного с пунктом меню. Если это произвольная ссылка, то дату определить сложно без дополнительных метаданных.
Реализация автоматического удаления устаревших пунктов меню по дате публикации связанных записей
Рассмотрим пример кода, который:
- Получает все пункты меню;
- Определяет дату публикации связанного объекта для каждого пункта;
- Если дата старше заданного порога (например, 1 год), удаляет пункт меню.
Пример кода для файла functions.php или собственного плагина:
function wponline_delete_old_menu_items($menu_location = 'primary', $days_old = 365) {
// Получаем объект меню по локейшену
$locations = get_nav_menu_locations();
if (empty($locations[$menu_location])) {
return;
}
$menu = wp_get_nav_menu_object($locations[$menu_location]);
if (!$menu) {
return;
}
// Получаем все пункты меню
$menu_items = wp_get_nav_menu_items($menu->term_id);
if (empty($menu_items)) {
return;
}
$threshold_date = strtotime('-' . intval($days_old) . ' days');
foreach ($menu_items as $item) {
// Проверяем тип объекта пункта меню
if (in_array($item->object, ['post', 'page'])) {
$post = get_post($item->object_id);
if ($post && strtotime($post->post_date) < $threshold_date) {
// Удаляем пункт меню
wp_delete_post($item->ID, true);
}
}
// Для других типов объектов (например, категории) можно дополнить логику
}
}
// Пример запуска функции при сохранении записи
add_action('save_post', function() {
wponline_delete_old_menu_items('primary', 365); // Локация меню 'primary', удаляем пункты старше 365 дней
});В этом коде функция wponline_delete_old_menu_items принимает название локации меню и количество дней, старше которых пункты меню будут удаляться. Она ищет пункты меню, связанные с записями или страницами, и удаляет те, которые опубликованы более года назад.
Особенности и доработки
- Если в меню есть произвольные ссылки или категории, для них нужно разработать отдельную логику, например, хранить дату создания в мета-данных пункта меню.
- Удаление пунктов меню — необратимая операция, рекомендуем предварительно делать резервные копии.
- Можно расширить функционал, добавив вывод предупреждений в админке или кнопку для запуска очистки вручную.
Использование плагинов для автоматизации управления меню
Готовых плагинов, которые именно удаляют старые пункты меню по дате, немного, но можно использовать универсальные решения для управления меню и кастомизации, комбинируя их с собственным кодом.
Например, плагин Nav Menu Roles позволяет скрывать пункты меню для определённых ролей или условий. Если расширить его функционал, можно скрывать пункты, связанные с устаревшим контентом, вместо удаления.
Для более глубокой кастомизации меню хорошо подходит плагин Clearfy Pro. Он содержит множество инструментов для оптимизации и управления WordPress, которые можно адаптировать для решения задач с меню.
Как интегрировать автоматическую очистку меню в рабочий процесс
Чтобы не запускать очистку вручную, можно настроить регулярное выполнение функции с помощью WP-Cron. Добавим крон-задачу, которая будет запускать удаление устаревших пунктов меню, например, раз в неделю:
function wponline_schedule_menu_cleanup() {
if (!wp_next_scheduled('wponline_weekly_menu_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wponline_weekly_menu_cleanup');
}
}
add_action('wp', 'wponline_schedule_menu_cleanup');
add_action('wponline_weekly_menu_cleanup', function() {
wponline_delete_old_menu_items('primary', 365);
});Такой подход позволит поддерживать меню в актуальном состоянии без участия администратора.
Советы по безопасности и отладке
При работе с удалением записей убедитесь, что у пользователя, запускающего функцию, есть соответствующие права (например, manage_options или edit_theme_options), чтобы случайно не удалить важные пункты меню.
Для отладки полезно выводить логи работы функции в файл или на экран, чтобы видеть, какие пункты удаляются и почему.
Пример добавления логирования в функцию удаления:
function wponline_delete_old_menu_items($menu_location = 'primary', $days_old = 365) {
$locations = get_nav_menu_locations();
if (empty($locations[$menu_location])) {
error_log('Меню с локейшеном ' . $menu_location . ' не найдено');
return;
}
$menu = wp_get_nav_menu_object($locations[$menu_location]);
if (!$menu) {
error_log('Объект меню не найден');
return;
}
$menu_items = wp_get_nav_menu_items($menu->term_id);
if (empty($menu_items)) {
error_log('Пункты меню отсутствуют');
return;
}
$threshold_date = strtotime('-' . intval($days_old) . ' days');
foreach ($menu_items as $item) {
if (in_array($item->object, ['post', 'page'])) {
$post = get_post($item->object_id);
if ($post && strtotime($post->post_date) < $threshold_date) {
wp_delete_post($item->ID, true);
error_log('Удалён пункт меню ID ' . $item->ID . ' связанный с устаревшей записью ID ' . $post->ID);
}
}
}
}Выводы и рекомендации
Автоматическое удаление старых пунктов меню в WordPress — удобный способ поддерживать навигацию сайта чистой и актуальной без лишних затрат времени. С помощью приведенного кода и примеров вы сможете реализовать эту функцию на своём сайте.
Для расширения возможностей стоит рассмотреть использование плагинов, таких как Clearfy Pro, которые помогут оптимизировать работу сайта и добавить дополнительные полезные инструменты.