我用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行的标签。如果我删除短代码中的锚定标记,段落标记就会消失,但这不是我可以使用的解决方案。
最合适的回答,由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);
}
。。。。