我正在使用Black Studio TinyMCE Widget 作为富文本编辑器小部件。在侧栏中,我插入了带有[testimonial]
短代码及其后的一些内容。
例如:
[testimonial]
Read more client testimonials (as a link)
当我切换到该小部件的HTML选项卡时,我得到了以下内容:
<p>[testimonial]</p>
<p><a title="Testimonials" href="http://mm.dev/testimonials/">Read more client testimonials</a></p>
shorcode仅显示随机
Testimonial
CPT职位:
add_shortcode("testimonial", "dlma_testimonial_shortcode");
function dlma_testimonial_shortcode($atts, $content = null){
$args = array(
\'post_type\' => \'testimonial\',
\'post_status\' => \'publish\',
\'posts_per_page\' => \'1\',
\'orderby\' => \'rand\'
);
$testimonial = new WP_Query($args);
if($testimonial){
return apply_filters(\'the_content\', $testimonial->posts[0]->post_content);
}
return "";
}
但是,当我查看页面时
<p>
插入元素:
Edited thanks to Tom J Nowell<div class="textwidget">
<p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum velit convallis sem pulvinar vitae lobortis metus varius.” <em>Person name, Person job</em></p>
</blockquote>
</p>
<p>
<a href="http://mysite.com/testimonials/" title="Testimonials">Read more client testimonials</a>
</p>
</div>
The
[testimonial]
然而,shortcode得到了正确的扩展,因为它最初被包装到
<p>
小部件中的元素,它似乎仍被包装在其中。我已尝试删除
<p>
但是,只要单击Save按钮
<p>
元素再次插入。
我试着移除不需要的<p>
元素,该元素用the_content
过滤如下:
remove_filter( \'the_content\', \'wpautop\' );
add_filter( \'the_content\', \'wpautop\' , 12);
那没用。我猜我在处理带有短代码的小部件的内容时出错了。我现在很困惑。如何删除不需要的
<p>
包裹短代码的元素?
我将非常感谢任何帮助!
非常感谢。
SO网友:Jake
我建议这样做,即将特定的“块级”短代码移到“p”元素之外,而不影响其他可能要内联的元素:
function my_fix_shortcodes($content){
if (strpos($content, \'<p>\') !== false) {
/* Move \'block level\' shortcode tags outside <p> elements by surrounding with </p>...<p>
If they have content, this will be put inside a new <p>
- you could use a final regex to remove this if needed... */
$block_level_shortcodes = array(
\'testimonial\',
\'another_shortcode\'
);
$regex_shortcode = \'(\' . implode(\'|\', $block_level_shortcodes) . \')\';
// Match opening/standalone or closing shortcode tags
$regex = \'/(\\[\' . $regex_shortcode . \'[^\\]]*\\]|\\[\\/\' . $regex_shortcode . \'\\])/\';
$regex_count = 0;
$content = preg_replace($regex, \'</p>$1<p>\', $content, -1, $regex_count);
if ($regex_count > 0) {
/* Remove <br/>s at start or end of <p> which might now be present,
then any empty <p>s which quite probably are */
$content = preg_replace(
array(\'/<p>\\s*<br *\\/>/s\', \'/<br *\\/>\\s*<\\/p>/s\', \'/<p>\\s*<\\/p>/s\'),
array(\'<p>\', \'</p>\', \'\'),
$content
);
}
}
return $content;
}
add_filter(\'the_content\', \'my_fix_shortcodes\');
还要注意的是,在WordPress[4.00]本身中,似乎有一次试图解决此类问题的尝试失败了,因此您的短代码处理程序可能会被传递到以<;开头的$内容/p> 并用<;p> ,您必须检测并删除。
更新:WordPress本身似乎存在一些缺陷(与简单的初始wpautop之外的零散添加<;p>和<;/p>有关,当涉及短代码时,如上所述[但这些零散元素没有传递给处理程序]),这意味着此解决方案可能并不总是有效,即使它应该:/