SHORTCODE_UNAUTOP快捷代码不起作用

时间:2016-02-09 作者:andershagbard

我用WordPress的短代码制作了自己的主题。

在我的过滤器中,我有:

remove_filter(\'the_content\', \'wpautop\');
add_filter(\'the_content\', \'wpautop\', 99);
add_filter(\'the_content\', \'shortcode_unautop\', 100);
这将删除我的短代码周围和中的段落标记。

我的短代码输出(整个代码的一部分):

$output .= \'
    <div \' . implode(\' \', $html_attributes) . \'>
        <a href="\' . get_permalink() . \'">
            <div \' . implode(\' \', $html_attributes_inner) . \'>
                \' . $logo . \'

                <div class="button hidden-xs hidden-sm">Læs case</div>

                <div class="content">
                    <div class="row">
                        <div class="col-md-8">
                            <h4 class="title">\' . get_the_title() . \'</h4>

                            <div class="spacer small"></div>

                            <div class="excerpt">\' . get_post()->post_excerpt . \'</div>
                        </div>
                    </div>
                </div>

            </div>
        </a>
    </div>
\';

// Script newlines whitespace, tabs etc.  
return str_replace(["\\r", "\\n", "\\t"], \'\', \'<div class="row cases">\' . $output . \'</div>\');
这将产生:

<div class="row cases">
<div class="col-xs-12"><a href="http://dev.youfront-hosting.dk/case/nori">
<div class="case" style="background-image: url(http://dev.youfront-hosting.dk/content/uploads/nori-restaurant-1120x500.jpg)">
<div class="button hidden-xs hidden-sm">Læs case</div>
<div class="content">
<div class="row">
<div class="col-md-8">
<h4 class="title">Nori</h4>
<div class="spacer small"></div>
<div class="excerpt"></div>
</div>
</div>
</div>
</div>
<p></a></div>
<div class="col-xs-12 col-md-6"><a href="http://dev.youfront-hosting.dk/case/an-ivy">
<div class="case" style="background-image: url(http://dev.youfront-hosting.dk/content/uploads/anivy-founders-545x500.jpg)"><img src="http://dev.youfront-hosting.dk/content/uploads/anivy-logo.png" alt="">
<div class="button hidden-xs hidden-sm">Læs case</div>
<div class="content">
<div class="row">
<div class="col-md-8">
<h4 class="title">AN-IVY. Nyt gentleman brand med stor passion for fashion, og klassisk herretøj</h4>
<div class="spacer small"></div>
<div class="excerpt">AN-IVY er et brand startet i 2013. De designer herrekollektioner der er inspireret af Ivy Leagues tradioner og moderne fashion. De har en stor passion for mode og klassisk herretøj.</div>
</div>
</div>
</div>
</div>
<p></a></div>
<div class="col-xs-12 col-md-6"><a href="http://dev.youfront-hosting.dk/case/powderstore">
<div class="case" style="background-image: url(http://dev.youfront-hosting.dk/content/uploads/team-youfront-545x500.jpg)">
<div class="button hidden-xs hidden-sm">Læs case</div>
<div class="content">
<div class="row">
<div class="col-md-8">
<h4 class="title">Powderstore</h4>
<div class="spacer small"></div>
<div class="excerpt"></div>
</div>
</div>
</div>
</div>
<p></a></div>
</div>
</div>
注意额外的<p> 第15、29和43行的标签。如果我删除短代码中的锚定标记,段落标记就会消失,但这不是我可以使用的解决方案。

3 个回复
最合适的回答,由SO网友:andershagbard 整理而成

这就是解决方案:

function wpex_fix_shortcodes($content) {

    return strtr($content, [
        \'<p>[\' => \'[\',
        \']</p>\' => \']\',
        \']<br />\' => \']\'
    ]);

}

remove_filter(\'the_content\', \'wpautop\');
remove_filter(\'the_content\', \'do_shortcode\', 11);

add_filter(\'the_content\', \'wpautop\', 100);
add_filter(\'the_content\', \'wpex_fix_shortcodes\', 105);
add_filter(\'the_content\' , \'do_shortcode\', 110);
这会在do\\u短代码之前运行wpautop,但会删除未格式化短代码之前和之后的段落标记,然后运行do\\u短代码。

EDIT

上述解决方案还可能导致一些HTML错误。最佳做法是删除wpautop过滤器,然后添加一个围绕内容调用wpautop的短代码。像这样:

add_shortcode(\'text\', function($attributes, $content = null)
{

    // Output
    return do_shortcode(wpautop($content));

});

SO网友:KungFuJosh

如果使用高级自定义字段,则上述解决方案不起作用。使用ACF时,以下代码有效:

remove_filter( \'the_content\', \'wpautop\' );
remove_filter( \'acf_the_content\', \'wpautop\' );
add_filter( \'the_content\', \'wpautop\' , 99);
add_filter( \'acf_the_content\', \'wpautop\' , 100);
add_filter( \'the_content\', \'shortcode_unautop\',110 );
add_filter( \'acf_the_content\', \'shortcode_unautop\',111 );

SO网友:majick

也许可以尝试从输出本身中删除所有换行符,因为这是最终要处理的。。。

$output .= \'<div \' . implode(\' \', $html_attributes) . \'>\';
$output .= \'<a href="\' . get_permalink() . \'">\';
$output .= \'<div \' . implode(\' \', $html_attributes_inner) . \'>\';
$output .= $logo;
。。。等等如果换行符消失了,wpautop可能会将短代码输出单独留下。

否则,由于它是一个非常特定且格式错误的字符串输出,因此您可以在事后对其进行修复:

add_filter(\'the_content\',\'shortcode_fix\',110);
function shortcode_fix($content) {
    return str_replace(\'<p></a></div>\',\'</a></div>\',$content);
}
。。。。

相关推荐

SHORTCODE_ATTS()中的$ATTS参数是什么?

这个WordPress developers reference page for shortcode_atts() 国家:$atts(array)(必选)用户在shortcode标记中定义的属性。但我不理解这个定义。例如,在WP Frontend Profile 插件:$atts = shortcode_atts( [ \'role\' => \'\', ], $atts ); 据我所知,shortcode\