从the_content删除空的段落?


33

大家好,我只是想防止在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>

知道这个空p的来源吗?



1
例如,尝试运行过滤器wpautopadd_filter('the_content', 'qanda', 7 );..
t31os 2011年

@ t31os:您可以将评论移至答案,以便我们对其进行投票吗?
Jan Fabry

Answers:


20

WordPress将自动插入<p></p>标记,以分隔帖子或页面中的内容中断。如果出于某种原因想要或需要删除它们,则可以使用以下任一代码段。

要完全禁用wpautop过滤器,可以使用:

remove_filter('the_content', 'wpautop');

如果您仍然希望此功能起作用,请尝试向过滤器中添加一个更高的优先级值,例如:

add_filter('the_content', 'removeEmptyParagraphs',99999);

2
谢谢!我知道wordpress会自动插入p标签。但是,有时在我的内容中某个地方(当我使用某种工具进行检查时)只有空的<p> </ p>标记...在进行大量删除和编辑帖子时会发生这种情况。我只是不想在我的内容中有空的段落,仅此而已。我确实需要段落,但不是空的。99999没什么不同。只是不起作用。wpautop过滤器不是我想要的。它可以防止所有<p>和自动格式化。我就是不想有空的p!
mathiregister 2011年

我更新了我的帖子,所以您明白我的意思了!我做了一个已经过滤内容的功能。它插入div,似乎wordpress在它之前和之后插入<p> </ p>,我只是不明白。有任何想法吗?
mathiregister 2011年

21

我遇到了同样的问题。我只是做了一个...让我们说...不是很好的解决方案,但是它有效,到目前为止,这是我唯一的解决方案。我添加了一些JavaScript行。它需要jQuery,但我敢肯定,没有它就可以弄清楚。

这是我的小JS:

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

这对我有用!


哦,那不是一个甜蜜的小数字!感谢您的提示-它适用于我,如果其他人想知道如何使用它,只需将其放在主题的自定义JS文件中即可。
Sol Sol

11
您也可以使用CSS执行此操作:p:empty { display:none; }

@D_N使用CSS隐藏空的Paragraph标签仅适用于,<p></p>但不适用于<p>\n</p>
Michael Ecklund '17

11

我知道这已经被标记为“已解决”,但是仅供参考,这是一个功能,可以完全满足您的需要,而无需在帖子中添加任何标记。只需将其放在主题的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


6
只是有关使用force_balance_tags()的一点说明...当此函数用于包含JavaScript的内容时(在表单上使用ajax时JS来自Gravity Forms),我遇到了一个棘手的bug。在某些情况下force_balance_tags遇到<角色时存在已知问题。有关详细信息,请参见票证[9270](core.trac.wordpress.org/ticket/9270)。
戴夫·罗姆西

我遇到了Dave强调的相同问题:该代码段删除了嵌入的youtube视频,这也导致放大器页面上的验证问题。
Marco Panichi

11

只需使用CSS

p:empty {
  display: none;
}

请说明添加到您的答案
彼得·古森

4
@PieterGoosen,这已经是不言而喻的了
至少三个字符,

如果您只是想避免出于间距目的而显示它们,那么此版本在IE9之下效果都很好。caniuse.com/#feat=css-sel3developer.mozilla.org/en-US/docs/Web/CSS/%3了解更多。
2016年

1
CSS选择器方法的不错选择,不知道它是否存在。谢谢!
i_a

1
仅供参考:如果&nbsp;<p>标记内没有该标记,则将无法使用。
RynoRn

5

您可以只运行过滤器,wpautop然后再去烦扰并弄乱标记。

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

这样,您已经在挂钩时将所需的内容转换了,这在某些情况下确实有所帮助。


3

与我之前的2个回答相同的方法,但是更新了正则表达式,因为他对我不起作用。

正则表达式:(/<p>(?:\s|&nbsp;)*?<\/p>/i 非捕获组&nbsp;在p标签内查找任意数量的空格或s,所有情况均不区分大小写。

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);

0

我发现这很奇怪,但是实际上调用the_content()将按照您描述的方式插入段落。如果您想要html代码,基本上就像您输入它一样(与编辑时的“查看HTML”相同),那么使用即可get_the_content()返回内容,而无需设置格式和段落标签。

由于它返回了它,因此请确保使用类似以下内容的东西:

回声get_the_content();

另请参阅:http : //codex.wordpress.org/Function_Reference/get_the_content


好,谢谢。但是我不想要那个!我需要正常的段落。首先是语义标记,其次是它应该采用的方式。我只是没有没有意义的空段!仅仅是因为我对这些段落应用了样式,所以这种样式也会出现空的段落,并且我的页面看起来很奇怪。
mathiregister 2011年

我实际上想知道为什么我的add_filter东西无法正常工作?
mathiregister 2011年

知道了 好吧,我建议您尝试的一件事是从HTML切换到视觉,再返回一两个时间。我相信在所见即所得编辑器加载时,它确实会删除空的段落标签。
cwd

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);
         //** 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

为了只有html内容而没有

标签,我们可以使用以下循环来仅显示html,而不格式化帖子或页面的格式

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.