удалить пустые абзацы из содержимого?


Привет, ребята, Я просто хочу предотвратить создание пустых абзацев в моем посте wordpress. Это случается довольно часто при попытке вручную разместить содержимое.

Я не знаю, почему это не вступает в силу?

/*Remove empty paragraph tags from 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) {

    // filters for [q=some question] and [a=some answer]
    // wraps it inside of <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>

Есть идеи, откуда взялась эта пустая буква "п"?

Author: mathiregister, 2011-04-03

11 answers

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

Чтобы полностью отключить фильтр wpautop, вы можете использовать:

remove_filter('the_content', 'wpautop');

Если вы все еще хотите, чтобы это работало, попробуйте добавить более позднее значение приоритета в свой фильтр, например:

add_filter('the_content', 'removeEmptyParagraphs',99999);
 22
Author: Bainternet, 2014-05-07 17:57:05

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

Это мой крошечный JS:

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

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

 24
Author: David Faber, 2012-01-02 10:00:02

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

p:empty {
  display: none;
}
 18
Author: at least three characters, 2015-09-30 13:24:27

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

Это из этой сути: https://gist.github.com/1668216

 14
Author: Michelle, 2012-05-22 22:03:32

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

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

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

 6
Author: t31os, 2011-04-06 12:40:17

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

Регулярное выражение: /<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);
 4
Author: kater louis, 2017-12-06 10:33:01

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

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

echo get_the_content();

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

 1
Author: cwd, 2011-04-03 14:40:24

Это рекурсивно удалит все пустые html-теги из строки

add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
         $str = force_balance_tags($str);
         //** Return if string not given or empty.
         if (!is_string ($str)
         || trim ($str) == '')
        return $str;

        //** Recursive empty HTML tags.
       return preg_replace (

              //** Pattern written by Junaid Atari.
              '/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',

             //** Replace with nothing if string empty.
             !is_string ($repto) ? '' : $repto,

            //** Source string
           $str
);}

Шаблон взят из http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

 0
Author: user2914440, 2014-05-07 13:37:39

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

Вы бы нашли там немного &nbsp;.. Удалите его, и пустые теги <p> исчезнут.

 0
Author: Christian Isak, 2017-05-15 10:33:03

Для того, чтобы иметь только html-контент без

теги мы можем использовать следующий цикл, чтобы выводить только html-код без форматирования сообщения или страницы
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
 0
Author: Shashank, 2018-09-19 11:44:59

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

ПРОБЛЕМА

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

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

РЕШЕНИЕ

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

<?php the_content();?>

 0
Author: Paul12_, 2021-01-04 22:37:22