Как удалить пустые параграфы из the_content в WordPress?

3 апр. 2011 г., 13:13:16
Просмотры: 94.3K
Голосов: 39

Привет, ребята, Я просто хочу предотвратить создание пустых параграфов в своих постах 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>?

3
Комментарии

Попробуйте запустить ваш фильтр до того, как wpautop выполнит свою работу, например: add_filter('the_content', 'qanda', 7 );..

t31os t31os
4 апр. 2011 г. 01:16:10

@t31os: Не могли бы вы перенести ваш комментарий в ответ, чтобы мы могли проголосовать за него?

Jan Fabry Jan Fabry
6 апр. 2011 г. 15:31:22
Все ответы на вопрос 11
3
25

У меня была такая же проблема, как у вас. Я нашел... скажем так... не самое красивое решение, но оно работает, и пока это единственное решение, которое у меня есть. Я добавил небольшую строку JavaScript. Для этого нужен jQuery, но уверен, вы сможете адаптировать это и без него.

Вот мой небольшой JS-код:

$('p:empty').remove();

Это работает для меня!

2 янв. 2012 г. 12:00:02
Комментарии

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

SolaceBeforeDawn SolaceBeforeDawn
6 сент. 2012 г. 08:08:07

Это также можно сделать с помощью CSS: p:empty { display:none; }

User User
20 июл. 2016 г. 04:42:00

@D_N Использование CSS для скрытия пустых тегов Paragraph работает только для <p></p>, но не работает для <p>\n</p>.

Michael Ecklund Michael Ecklund
21 апр. 2017 г. 23:51:33
6
23

Просто используйте CSS

p:empty {
  display: none;
}
30 сент. 2015 г. 16:24:27
Комментарии

Пожалуйста, добавьте объяснение к вашему ответу

Pieter Goosen Pieter Goosen
30 сент. 2015 г. 16:49:24

@PieterGoosen это и так самоочевидно

at least three characters at least three characters
1 окт. 2015 г. 15:23:54

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

Will Will
3 янв. 2016 г. 23:11:32

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

i_a i_a
14 апр. 2016 г. 14:47:18

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

laszlo-horvath laszlo-horvath
6 июн. 2019 г. 17:52:04

На самом деле это не работает.

pjk_ok pjk_ok
5 янв. 2021 г. 00:27:08
Показать остальные 1 комментариев
2
22

WordPress автоматически вставляет теги <p> и </p>, которые разделяют разрывы контента внутри записи или страницы. Если по какой-то причине вы хотите или вам нужно удалить их, вы можете использовать один из следующих фрагментов кода.

Чтобы полностью отключить фильтр wpautop, используйте:

remove_filter('the_content', 'wpautop');

Если вы всё же хотите, чтобы эта функция работала, попробуйте добавить более поздний приоритет к вашему фильтру, например:

add_filter('the_content', 'removeEmptyParagraphs', 99999);
3 апр. 2011 г. 15:15:51
Комментарии

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

mathiregister mathiregister
3 апр. 2011 г. 15:23:07

я обновил свой пост, чтобы вы поняли, о чем я! у меня уже есть функция, которая фильтрует контент. она вставляет div'ы, и похоже, что WordPress вставляет <p></p> до и после них, я просто не понимаю почему. Есть идеи?

mathiregister mathiregister
3 апр. 2011 г. 16:02:39
2
15

Я знаю, что это уже помечено как 'решено', но просто для справки, вот функция, которая делает именно то, что вам нужно, без необходимости добавлять разметку к записям. Просто поместите это в 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

23 мая 2012 г. 01:03:32
Комментарии

Небольшое замечание по использованию force_balance_tags()...

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

Dave Romsey Dave Romsey
15 авг. 2013 г. 00:56:57

У меня была та же проблема, которую описал Dave: сниппет удалял встроенные youtube-видео, что также вызывало проблемы с валидацией на AMP-страницах.

Marco Panichi Marco Panichi
29 июн. 2019 г. 15:14:49
0

Вы можете просто запустить свой фильтр до того, как надоедливый wpautop подключится и испортит разметку.

add_filter('the_content', 'qanda', 7 );

Таким образом, вы уже преобразуете то, что нужно, к моменту его подключения, что в некоторых случаях действительно помогает.

6 апр. 2011 г. 15:40:17
0

Тот же подход, что и в двух ответах выше, но с обновлённым регулярным выражением, так как предыдущее у меня не сработало.

Регулярное выражение: /<p>(?:\s|&nbsp;)*?<\/p>/i (незахватывающая группа, ищущая любое количество пробелов или &nbsp; внутри тега p, регистронезависимо).

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);
6 дек. 2017 г. 12:33:01
3

Это может показаться странным, но на самом деле вызов the_content() будет вставлять абзацы так, как вы описали. Если вам нужен HTML-код в том виде, в котором вы его ввели (аналогично "просмотру HTML" при редактировании), используйте get_the_content(), который возвращает содержимое без форматирования и тегов абзацев.

Поскольку функция возвращает содержимое, убедитесь, что вы используете что-то вроде:

echo get_the_content();

См. также: http://codex.wordpress.org/Function_Reference/get_the_content

3 апр. 2011 г. 17:40:24
Комментарии

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

mathiregister mathiregister
3 апр. 2011 г. 17:54:39

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

mathiregister mathiregister
3 апр. 2011 г. 17:55:00

Понял. Что я могу порекомендовать, так это попробовать переключиться из HTML в визуальный режим и обратно несколько раз. Я полагаю, что когда загружается WYSIWYG редактор, он удаляет пустые теги параграфов.

cwd cwd
4 апр. 2011 г. 06:11:15
0

Это рекурсивно удалит все пустые 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

7 мая 2014 г. 16:37:39
0

Если у вас есть теги <p> с пробелами в содержимом, перейдите в запись или страницу и отредактируйте её не в визуальном режиме.

Вы найдёте там некоторые &nbsp;... Удалите их, и пустые теги <p> исчезнут.

15 мая 2017 г. 13:33:03
0

Для вывода только HTML-контента без тегов

мы можем использовать следующий цикл, который выводит содержимое без форматирования записи или страницы:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
19 сент. 2018 г. 14:15:56
0

Если в верхней части вашей страницы или записи появляется пустой тег <p>, это обычно вызвано оборачиванием <?php the_content();?> в теги параграфа.

ПРОБЛЕМА

Вот что вызывает появление лишнего тега <p> вверху страницы/записи:

<p><?php the_content();?></p>

РЕШЕНИЕ

Если убрать теги <p> и оставить только шаблонный тег, проблема будет решена.

<?php the_content();?>

5 янв. 2021 г. 00:37:22