В некоторых случаях возникает необходимость удалить из содержимого постов WordPress заголовки определённых уровней, например, H1, H2 или H3. Это может быть связано с требованиями дизайна, SEO, или особенностями темы. В этой статье мы подробно рассмотрим, как программно удалить эти заголовки из контента поста, не затрагивая остальной текст и структуру.
Почему может понадобиться удалять заголовки из постов WordPress
Удаление заголовков из постов — задача, которая не так часто обсуждается, но очень полезна в ряде случаев:
- SEO оптимизация: иногда заголовки дублируются или мешают правильной иерархии на странице.
- Дизайн и верстка: тема может выводить собственные заголовки, а из контента их нужно убрать, чтобы не было визуального дублирования.
- Автоматическая обработка контента: при импортировании или миграции контента могут появляться лишние заголовки.
Важно, чтобы удаление было аккуратным и не ломало структуру HTML.
Как найти и удалить заголовки H1, H2, H3 из контента поста
Для удаления заголовков из постов WordPress нужно работать с содержимым, которое хранится в базе данных и выводится через функцию the_content(). Мы можем применить фильтр, который будет модифицировать контент перед выводом.
Рассмотрим пример функции, которая удаляет все заголовки H1, H2, H3 из контента.
function wplangs_remove_headings_from_content($content) {
// Регулярное выражение для удаления тегов h1, h2, h3 с их содержимым
$pattern = '/<h[1-3][^>]*>.*?<\/h[1-3]>/is';
$content = preg_replace($pattern, '', $content);
return $content;
}
add_filter('the_content', 'wplangs_remove_headings_from_content');Этот код сработает для самых простых случаев, удаляя все заголовки H1, H2, H3 вместе с содержимым, находящимся между тегами. Однако, часто нужно сохранить текст внутри заголовков, удаляя только сами теги.
Удаление только тегов, сохраняя содержимое заголовков
Если необходимо убрать только теги, а текст оставить, лучше использовать DOMDocument для безопасного парсинга HTML.
function wplangs_strip_headings_tags($content) {
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
for ($i = 1; $i <= 3; $i++) {
$tags = $dom->getElementsByTagName('h' . $i);
// Собираем в массив, т.к. NodeList динамический
$toRemove = [];
foreach ($tags as $tag) {
$toRemove[] = $tag;
}
foreach ($toRemove as $tag) {
// Вставляем дочерние узлы перед тегом
while ($tag->firstChild) {
$tag->parentNode->insertBefore($tag->firstChild, $tag);
}
// Удаляем сам тег
$tag->parentNode->removeChild($tag);
}
}
$body = $dom->getElementsByTagName('body')->item(0);
$newContent = '';
foreach ($body->childNodes as $child) {
$newContent .= $dom->saveHTML($child);
}
return $newContent;
}
add_filter('the_content', 'wplangs_strip_headings_tags');Такой подход позволяет сохранить текст внутри заголовков, просто убирая сами теги, что полезно для сохранения семантики и читаемости.
Удаление заголовков из пользовательских полей и виджетов
Иногда заголовки могут находиться не только в основном содержимом поста, но и в пользовательских полях, мета-данных или виджетах. В таких случаях аналогично можно применять фильтры или обрабатывать данные при выводе.
Например, если у вас есть мета-поле с контентом, его можно обработать так же:
function wplangs_filter_meta_content($meta_content) {
return wplangs_strip_headings_tags($meta_content);
}И вызывать эту функцию при выводе мета-поля в шаблонах.
Пример удаления заголовков из виджета текстового типа
Если в виджете используется пользовательский HTML с заголовками, можно использовать фильтр widget_text:
add_filter('widget_text', 'wplangs_strip_headings_tags');Это автоматически удалит теги H1-H3 из содержимого текстового виджета.
Использование плагинов для удаления заголовков
Если вы предпочитаете не писать код, существуют плагины, позволяющие управлять выводом заголовков:
- Remove HTML Tags — позволяет удалить определённые HTML-теги из контента.
- Content Filter Manager — даёт возможность настраивать фильтры для контента, включая удаление тегов.
Однако, подобные плагины часто слишком универсальны и могут затрагивать другие участки сайта, поэтому программный подход зачастую более точен и безопасен.
Тестирование и отладка
После внедрения удаления заголовков обязательно протестируйте все виды постов и страницы, чтобы убедиться, что контент отображается корректно и не происходит удаление нужных элементов.
Если используете DOMDocument, убедитесь, что сервер поддерживает эту библиотеку и что код корректно обрабатывает все варианты HTML.
Также полезно включить логирование ошибок PHP на время тестирования, чтобы быстро находить и исправлять проблемы.