WordPress: Как убрать тег <р> в контенте и изображениях
В WordPress автоматически вставляет HTML теги <p></p> после абзаца, когда в редакторе нажимаете Enter. Кроме того, пустые теги без текста <p></p> могут присутствовать в тексте вокруг шорткода и также обертываться в изображениях с тегом <p><p style="text-align: center;"><img src="image.jpg"></p>.
Я недавно столкнулся с данной проблемой, когда плагин шорткодов оставлял пустые теги <p></p> и советы из Интернета по фильтрам функций не привели к результатам. Тогда я начал тестировать и редактировать код, который исправил данную проблему. Кроме того, если нужно убрать теги <p> из обвертывания картинок, то также опишу как это сделать.
Как убрать пустые теги <p> в контенте вокруг шорткода
Этот фильтр автоматически удаляет обёртки <p> и <br> вокруг шорткодов [code]. Вставьте ниже хук в файл functions.php.
add_filter('the_content', 'shortcode_empty_paragraph_fix');
function shortcode_empty_paragraph_fix($content) {
$array = array(
'<p>[' => '[',
']</p>' => ']',
']<br />' => ']',
']<br>' => ']',
);
$content = strtr($content, $array);
return $content;
}
Как убрать пустые теги <p> в контенте
Если нужно убрать пустые теги <p></p> в контенте, то добавьте следующую функцию в файл functions.php.
function remove_empty_p_tags($content) {
return preg_replace('#<p>(\s| )*</p>#i', '', $content);
}
add_filter('the_content', 'remove_empty_p_tags', 20);
Как убрать теги <p> из всего контента
wpautop - это встроенная функция WordPress, которая находит двойные переводы строк и превращает их в <p>…</p> и одинарные переводы строк превращает в <br/>. Данный способ рекомендуется везде в Интернете, в том числе и на официальном форуме WordPress, но я не рекомендую данный код, так как весь текст будет выводиться сплошняком, без автоматических абзацев и переносов. Это может привести к полной поломке структурированного контента на страницах и сайте в целом.
Текст в WordPress в классическом редакторе при нажатии Enter обертывается автоматически в <p> теги. Если нужно убрать <p> из всего контента, то скопируйте в functions.php следующий код, который также уберет тег <br> (перенос строки).
remove_filter('the_content', 'wpautop');
remove_filter('the_excerpt', 'wpautop');
Как убрать теги <p> в изображениях
Если вставлять изображения в WordPress через Enter, то <img> обернется в тег <p>, что не логично для разметки HTML, так как тег <p> обозначает абзац. Лучше всего обернуть в <figure> или просто оставить <img> без абзаца. Нынешние алгоритмы Яндекса и Google отлично понимают, что данная фича WordPress с тегом <p> вокруг картинок – это особенность. Прямого влияния на SEO замечено не было и по логике не должно быть, так как на данном движке много сайтов и поисковики понимают весь смысл. Если кто хочет убрать <p> вокруг <img> картинок, то код будет следующий в functions.php.
function remove_p_tags_around_images($content) {
return preg_replace(
'/<p>\s*(<a [^>]+>\s*)?(<img [^>]+>)(\s*<\/a>)?\s*<\/p>/i',
'$1$2$3',
$content
);
}
add_filter('the_content', 'remove_p_tags_around_images');
Кроме того, в WordPress работает автоматическая функция выравнивания <p style="text-align: center;">, которая делает по центру изображения, если центровать в редакторе, что опять не логично, так как тег для текста. Чтобы убрать автоматический тег <p style="text-align: center;">, который выравнивает изображения по центру, вставьте следующий хук в functions.php.
function remove_centered_p_tags($content) {
// Убираем только <p> с атрибутом style="text-align: center;"
return preg_replace('/<p[^>]*style=["\']text-align:\s*center;?["\'][^>]*>(.*?)<\/p>/i', '$1', $content);
}
add_filter('the_content', 'remove_centered_p_tags', 20);
Так как центрование убрали, то редактируем стиль и выравниваем изображения по центру. Откройте style.css и найдите .aligncenter, который приведен ниже. Если его нет, то напишите его в style.css. Ниже два примера, где последний более логичный.
.aligncenter {
text-align: center;
}
или более совершенный для капризных шаблонов:
.aligncenter {
display: block;
margin-left: auto;
margin-right: auto;
text-align: center;
}

Мы получили чистый тег <img> в WordPress, но я решил сделать более лучше для SEO и логики, вставив автоматически тег <figure> для изображения. Другими словами, убираем из изображений тег <p> и <p style="text-align: center;">, после чего вставляем тег <figure>. Если выше вставляли 2-ой код, удалите его и вставьте этот:
function replace_p_with_figure_no_caption($content) {
return preg_replace_callback(
'/<p[^>]*>\s*(<a [^>]+>\s*)?(<img [^>]+>)(\s*<\/a>)?\s*<\/p>/i',
function ($matches) {
$link_open = isset($matches[1]) ? $matches[1] : '';
$img_tag = $matches[2];
$link_close = isset($matches[3]) ? $matches[3] : '';
$figure = '<figure>';
$figure .= $link_open . $img_tag . $link_close;
$figure .= '</figure>';
return $figure;
},
$content
);
}
add_filter('the_content', 'replace_p_with_figure_no_caption', 20);
⚠️Настоятельно рекомендую проверить множество страниц, категорий и другие элементы сайта на корректность отображения верстки. Не забудьте очистить кэш WordPress, кэш Clodflare, если подключен и проверить в браузере режим инкогнито.
myWEBpc