通过 PHP 函数从 WordPress 短代码中删除空的 <p> 标签

14

我正在寻找一个php函数(非jQuery或wpautop修改)的方法,来删除wordpress中的<p></p>标签。

我尝试了这个方法,但它不起作用:

        function cleanup_shortcode_fix($content) {   
          $array = array (
            '<p>[' => '[', 
            ']</p>' => ']', 
            ']<br />' => ']',
            ']<br>' => ']'
          );
          $content = strtr($content, $array);
            return $content;
        }
        add_filter('the_content', 'cleanup_shortcode_fix');

你的内容在括号和标签之间可能有空格或空白符(\n等),这种情况是否可能发生? - David Gard
2
当编辑的以括号开头的段落突然变成了一个破碎的段落时,他会感到惊讶吧。 - Damien Overeem
@DamienOvereem:实现has_shortcode函数可以解决这个问题。 - luukvhoudt
只是想指出,如果我在add_filter的末尾添加10个优先级,就像add_filter('the_content', 'cleanup_shortcode_fix',10,1);,上面的代码对我有效。 - LBF
7个回答

15

尝试将以下代码插入到您的functions.php文件中:

remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop', 99 );
add_filter( 'the_content', 'shortcode_unautop', 100 );

这里输入图片描述


我也尝试过这个解决方案,但我发现它在其他地方生成了P标签。 - BadJohnny
非常好!我不确定在哪里放置代码,所以我测试了一下并添加了一个截图。非常感谢! - Adrian Smith

6

add_filter('the_content', 'cleanup_shortcode_fix', 10);

我发现只有当你把优先级设为10时,这段代码才能起作用;别的数值都不行。


2
这是一个老问题,但我今天解决了它并想分享一下。在我的情况下,我基本上想要删除所有格式不正确的 <p><br> 标签,但然后您希望将它们正确地添加回去,以便短代码中的文本可以得到正确的格式化。
/*
 * Half column shortcode
 */
    function custom_shortcode_half_column( $atts, $content = '') {
        $content = custom_filter_shortcode_text($content);
        return '<div class="half-column">'. $content .'</div>';
    }
    add_shortcode( 'half-column', 'custom_shortcode_half_column' );


/*
 * Utility function to deal with the way WordPress auto formats text in a shortcode.
 */
    function custom_filter_shortcode_text($text = '') {
        // Replace all the poorly formatted P tags that WP adds by default.
        $tags = array("<p>", "</p>");
        $text = str_replace($tags, "\n", $text);

        // Remove any BR tags
        $tags = array("<br>", "<br/>", "<br />");
        $text = str_replace($tags, "", $text);

        // Add back in the P and BR tags again, remove empty ones
        return apply_filters('the_content', $text);
    }

在我看来,这应该是WordPress解析短代码$content参数的默认方式。


0

或许正则表达式可以解决:

$string=preg_replace_('/<p>\s*</p>/', '', $string);

这应该将任何带有空内容的<p></p>替换为无,因此删除它们。

在对HTML代码应用正则表达式时,最好先删除HTML的\r\n,因为它们会阻止正则表达式的工作。


这并不是有帮助的,因为删除内容中的所有p标签,有时候p标签还带有样式。 - Farshadi

0

你应该提高过滤器的优先级。

这应该可以工作。

add_filter('the_content', 'cleanup_shortcode_fix', 1);

0

You can remove

Tag enter

<?php echo $post->post_content; ?>

instead of the_content()


-4
你需要的是jquery和php的混合使用...这是我发现唯一有效的方法,而且效果非常好。我在我的网站上有教程,但为了保持内部资料,以下是具体步骤: jQuery:
将此代码包含在您已经排队的某个JS文件中

jQuery(function($){
    $('div#removep > p').filter(function() {
        return $.trim($(this).text()) === '' && $(this).children().length == 0
    })
    .remove()
})

一个稍后可以使用的短代码:
在您的functions.php或包含的文件中

function sght_removep( $atts, $content = null ) {return '<div id="removep">'.do_shortcode($content).'</div>';}
add_shortcode('removep', 'sght_removep');

现在您可以像这样包装特定的东西:
[removep]
Some text i write directly in wordpress wysiwyg
<p></p> <-- this would get removed
[/removep]

这个解决方案需要一些专业知识,但它是可行的!
希望能对您有所帮助...


这可能是我在SO上见过的最糟糕的答案。它没有回答问题,因为OP明确表示不使用jQuery,并且这是一个可怕的解决方案,因为您永远不应该在JavaScript中修复错误的标记,特别是当您有机会在PHP中修复它之后再提供服务。 - spikyjt
你错了!在许多情况下,写文章时你不想进行全局修复,而是进行简单的定向修复!你不应该改变 WP 的整个输出来修复某个特定元素的列结构或其他元素。在许多情况下,你并没有“错误标记”,而是只想针对特定元素进行定向处理...(顺便说一句:感谢你的戏剧效果)。 - Sagive
谁说需要全局修复了?你可能只需要修复一个或几个短代码,我理解这一点。我在这个页面上也没有看到完美的答案。但是一个糟糕的JS hack不是答案。WP已经被太多“我刚刚做了这个糟糕的hack,它对我有效”这样的代码建议所困扰了。 - spikyjt
这是一个很棒的解决方案...不期望的P标签在短代码和其他地方的问题一次又一次地出现...在大多数情况下,这没问题 - 有时甚至很棒,这就是为什么关闭它(这很容易)并不是每个人的最佳选择!但有时它会困扰用户,因此使用一个小的短代码是解决特定问题的好方法 - 此外,我认为使用jQuery自定义元素及其外观也没有问题。这在当今的网页设计世界中很常见。 - Sagive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接