Как удалить пустые параграфы из the_content в WordPress?
Привет, ребята, Я просто хочу предотвратить создание пустых параграфов в своих постах WordPress. Это часто происходит при попытке вручную разбить контент на части.
Не понимаю, почему это не работает?
/*Удаление пустых тегов параграфов из the_content*/
function removeEmptyParagraphs($content) {
/*$pattern = "/<p[^>]*><\\/p[^>]*>/";
$content = preg_replace($pattern, '', $content);*/
$content = str_replace("<p></p>","",$content);
return $content;
}
add_filter('the_content', 'removeEmptyParagraphs');
редактирование/обновление:
похоже, проблема в этом:
function qanda($content) {
// фильтры для [q=вопрос] и [a=ответ]
// оборачивает их в <div class="qanda"><div class="question"> </div><div class="answer"> </div></div>
$content = preg_replace('/\[q=(.+?)].+?\[a=(.+?)]/is', '<div class="qanda"><div class="question">$1</div><div class="answer">$2</div></div>', $content);
return $content;
}
add_filter('the_content', 'qanda');
Я сам написал эту функцию для обработки своего рода шорткодов в постах и страницах. Хотя в админке пост полностью готов без лишних параграфов и пробелов, на выходе получается так:
<div class="entry">
<p></p>
<div class="qanda">...</div>
<p></p>
<p></p>
<div class="qanda">...</div>
<p></p>
<p></p>
<div class="qanda">...</div>
</div>
Есть идеи, откуда берутся эти пустые теги <p>?
У меня была такая же проблема, как у вас. Я нашел... скажем так... не самое красивое решение, но оно работает, и пока это единственное решение, которое у меня есть. Я добавил небольшую строку JavaScript. Для этого нужен jQuery, но уверен, вы сможете адаптировать это и без него.
Вот мой небольшой JS-код:
$('p:empty').remove();
Это работает для меня!

О, разве это не миленькая штучка! Спасибо за подсказку - у меня сработало, и если кому-то еще интересно, как это использовать, просто добавьте это в ваш файл пользовательского JS темы.

Если вам нужно просто избежать их отображения для целей разметки, это хорошо работает вплоть до IE9. http://caniuse.com/#feat=css-sel3 и https://developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty для дополнительной информации.

отличный вариант с методом CSS-селектора, не знал о его существовании. спасибо!

К сведению: если внутри тега <p> есть
, это не сработает.

WordPress автоматически вставляет теги <p>
и </p>
, которые разделяют разрывы контента внутри записи или страницы. Если по какой-то причине вы хотите или вам нужно удалить их, вы можете использовать один из следующих фрагментов кода.
Чтобы полностью отключить фильтр wpautop, используйте:
remove_filter('the_content', 'wpautop');
Если вы всё же хотите, чтобы эта функция работала, попробуйте добавить более поздний приоритет к вашему фильтру, например:
add_filter('the_content', 'removeEmptyParagraphs', 99999);

спасибо! Я знаю, что WordPress автоматически вставляет теги p. Однако бывают случаи, когда в моем контенте появляются просто пустые теги <p></p> (когда я проверяю его с помощью инструментов)... это происходит при частом удалении и редактировании записей. Я просто не хочу иметь пустые параграфы в своем контенте, вот и все. Мне нужны параграфы, но не пустые. Число 99999 не имеет значения. Просто не работает. Фильтр wpautop - не то, что мне нужно. Он предотвращает все <p> и автоформатирование. Я просто не хочу никаких пустых p!

Я знаю, что это уже помечено как 'решено', но просто для справки, вот функция, которая делает именно то, что вам нужно, без необходимости добавлять разметку к записям. Просто поместите это в functions.php вашей темы:
add_filter('the_content', 'remove_empty_p', 20, 1);
function remove_empty_p($content){
$content = force_balance_tags($content);
return preg_replace('#<p>\s*+(<br\s*/*>)?\s*</p>#i', '', $content);
}
Это взято из этого gist: https://gist.github.com/1668216

Небольшое замечание по использованию force_balance_tags()...
Я столкнулся с коварной ошибкой, вызванной этой функцией, когда она применялась к контенту, содержащему JavaScript (JS поступал из Gravity Forms при использовании ajax в форме). Известны проблемы с force_balance_tags
, когда она встречает символ <
в определённых ситуациях. Подробности см. в тикете 9270.

Вы можете просто запустить свой фильтр до того, как надоедливый wpautop
подключится и испортит разметку.
add_filter('the_content', 'qanda', 7 );
Таким образом, вы уже преобразуете то, что нужно, к моменту его подключения, что в некоторых случаях действительно помогает.

Тот же подход, что и в двух ответах выше, но с обновлённым регулярным выражением, так как предыдущее у меня не сработало.
Регулярное выражение: /<p>(?:\s| )*?<\/p>/i
(незахватывающая группа, ищущая любое количество пробелов или
внутри тега p, регистронезависимо).
add_filter('the_content', function($content) {
$content = force_balance_tags($content);
return preg_replace('/<p>(?:\s| )*?<\/p>/i', '', $content);
}, 10, 1);

Это может показаться странным, но на самом деле вызов the_content()
будет вставлять абзацы так, как вы описали. Если вам нужен HTML-код в том виде, в котором вы его ввели (аналогично "просмотру HTML" при редактировании), используйте get_the_content()
, который возвращает содержимое без форматирования и тегов абзацев.
Поскольку функция возвращает содержимое, убедитесь, что вы используете что-то вроде:
echo get_the_content();
См. также: http://codex.wordpress.org/Function_Reference/get_the_content

Хорошо, спасибо. Однако я этого не хочу! Мне нужны обычные параграфы. Во-первых, это семантическая разметка, а во-вторых, так и должно быть. Я просто не хочу иметь пустые параграфы, которые не имеют смысла! Просто потому что у меня применены стили к этим параграфам, и пустые параграфы отображаются с этим стилем, что делает мою страницу странной.

Мне действительно интересно, почему мой add_filter не работает?

Это рекурсивно удалит все пустые HTML-теги из строки
add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
$str = force_balance_tags($str);
//** Возвращаем, если строка не передана или пуста.
if (!is_string ($str)
|| trim ($str) == '')
return $str;
//** Рекурсивное удаление пустых HTML-тегов.
return preg_replace (
//** Паттерн написан Junaid Atari.
'/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',
//** Заменяем на ничего, если строка пуста.
!is_string ($repto) ? '' : $repto,
//** Исходная строка
$str
);}
Паттерн взят с http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

Для вывода только HTML-контента без тегов
мы можем использовать следующий цикл, который выводит содержимое без форматирования записи или страницы:<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>

Если в верхней части вашей страницы или записи появляется пустой тег <p>
, это обычно вызвано оборачиванием <?php the_content();?>
в теги параграфа.
ПРОБЛЕМА
Вот что вызывает появление лишнего тега <p>
вверху страницы/записи:
<p><?php the_content();?></p>
РЕШЕНИЕ
Если убрать теги <p>
и оставить только шаблонный тег, проблема будет решена.
<?php the_content();?>
