Внутренние ссылки — важная часть структуры сайта, они помогают посетителям и поисковым системам лучше ориентироваться по вашему контенту. Но иногда возникает необходимость удалять определённые внутренние ссылки по условию: например, ссылки на страницы с определённым статусом, ссылочные атрибуты для SEO или ссылки, ведущие на устаревшие разделы сайта. В этой статье мы подробно рассмотрим, как программно и с помощью плагинов реализовать удаление внутренних ссылок по условию в WordPress.
Почему может потребоваться удалять внутренние ссылки по условию
Удаление внутренних ссылок не должно быть хаотичным, ведь это может навредить SEO и удобству пользователей. Но есть несколько распространённых причин, когда такая задача становится актуальной:
- Удаление ссылок на страницы с определённым статусом (например, черновики или приватные страницы).
- Исключение ссылок на устаревшие или временные разделы сайта.
- Устранение ссылок для улучшения SEO, например, добавление
rel="nofollow"или полное удаление ссылок в определённых условиях. - Управление ссылками в зависимости от роли пользователя или типа контента.
В зависимости от конкретной задачи можно использовать разные подходы — от фильтров WordPress до кастомных плагинов.
Удаление внутренних ссылок через фильтр the_content
Самый простой и гибкий способ — отфильтровать содержимое поста перед выводом и убрать нужные ссылки. Для этого используется хук the_content. Пример кода для удаления ссылок на посты с определённой категорией.
Пример: Удаление ссылок на записи из категории «Архив»
function clearfy_remove_internal_links_conditionally($content) {
// Используем DOMDocument для парсинга HTML
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
$anchors = $dom->getElementsByTagName('a');
// Проходим в обратном порядке, чтобы не ломать итератор при удалении
for ($i = $anchors->length - 1; $i >= 0; $i--) {
$a = $anchors->item($i);
$href = $a->getAttribute('href');
// Проверяем, является ли ссылка внутренней
if (strpos($href, home_url()) === 0) {
// Получаем ID поста по URL
$post_id = url_to_postid($href);
if ($post_id) {
$categories = wp_get_post_categories($post_id);
// Проверяем, есть ли категория с названием 'Архив'
foreach ($categories as $cat_id) {
$cat = get_category($cat_id);
if ($cat->name === 'Архив') {
// Удаляем ссылку, заменяя на текст
$text = $a->textContent;
$textNode = $dom->createTextNode($text);
$a->parentNode->replaceChild($textNode, $a);
break;
}
}
}
}
}
// Получаем очищенный HTML без <html><body>
$body = $dom->getElementsByTagName('body')->item(0);
$new_content = '';
foreach ($body->childNodes as $child) {
$new_content .= $dom->saveHTML($child);
}
return $new_content;
}
add_filter('the_content', 'clearfy_remove_internal_links_conditionally');
В этом примере мы удаляем все ссылки на записи из категории "Архив", заменяя их на простой текст, чтобы не нарушать структуру и не портить пользовательский опыт.
Использование плагинов для управления ссылками
Если вы предпочитаете готовые решения, которые позволяют гибко управлять ссылками, можно рассмотреть несколько плагинов:
- Remove Orphan Shortcodes — помогает убрать неиспользуемые шорткоды, но иногда может помочь и с ссылками.
- Broken Link Checker — плагин, который сканирует сайт на битые ссылки и позволяет их редактировать или удалять.
- WP External Links (nofollow new tab etc.) — позволяет управлять внешними и внутренними ссылками, включая добавление атрибутов, отключение ссылок и пр.
Но для сложных условий, как в нашем примере, лучше использовать кастомные решения.
Удаление ссылок в меню WordPress по условию
Внутренние ссылки часто находятся не только в контенте, но и в меню. Для управления ими можно использовать фильтр wp_nav_menu_objects. Например, удалим пункты меню, которые ведут на страницы с меткой "скрыто".
function clearfy_filter_menu_items($items, $args) {
foreach ($items as $key => $item) {
if ($item->object === 'page') {
$post_id = $item->object_id;
if (has_tag('скрыто', $post_id)) {
unset($items[$key]);
}
}
}
return $items;
}
add_filter('wp_nav_menu_objects', 'clearfy_filter_menu_items', 10, 2);
Этот код удалит из меню все ссылки на страницы с тегом "скрыто". Такой подход помогает динамически управлять меню без редактирования вручную.
Практические советы и рекомендации
При удалении внутренних ссылок важно учитывать несколько моментов:
- Кэширование. После внесения изменений очистите кэш сайта и браузера, чтобы увидеть результаты.
- SEO. Удаление ссылок может повлиять на внутренний PageRank, поэтому продумывайте стратегию ссылочного веса.
- Тестирование. Проверяйте работу кода на тестовом сайте, чтобы избежать ошибок и поломок.
- Удобство пользователей. Заменяйте удалённые ссылки на текст, чтобы не ухудшать UX.
Заключение
Удаление внутренних ссылок в WordPress по условию — задача, требующая аккуратного подхода и точного кода. Используя фильтры the_content и wp_nav_menu_objects, вы можете гибко управлять ссылками в контенте и меню. При необходимости подключайте плагины для дополнительного контроля. Приведённые примеры помогут быстро начать и настроить логику под свои нужды.