WordPress wpautop/生成无效标记的快捷代码

时间:2011-06-29 作者:JM at Work

我注意到我的短代码中有无效的标记。如果我禁用它就可以了wpautop tho公司

function shortcode_banner($attrs, $content = \'\') {
    echo \' --- \' . $content . \' --- \';
    $html = \'<section id="banner"><div class="wrap">\' . do_shortcode($content) . \'</div></section>\';
    die($html);
}
启用autop时,我得到(注意关闭</p> 一开始?)

--- </p>
<h1>The title</h1>
xxx ... xxx ...
--- 
<section id="banner"><div class="wrap"></p>
<h1>The title</h1>
xxx ... xxx ...
</div></section>
禁用时,我会

 --- 
<h1>The header</h1>
xxx ... xxx ...
 --- 
<section id="banner"><div class="wrap">
<h1>The header</h1>
xxx ... xxx ...    
</div></section>
UPDATE: 我注意到只有当我有一个标签(例如。<h1>) 在我的短代码之后。例如:

[banner]
<h1>Test</h1>
如果我有

[banner]
xxx ...
没关系,只是Wordpress添加了<br />

2 个回复
SO网友:onetrickpony

Try this:

// replaces [banner ...] .. [/banner] with <!--banner ID--> before the_content filters run
add_filter(\'the_content\', \'protect_my_shortcode\', -100);
function protect_my_shortcode($content){
  return preg_replace_callback(\'/\\[(banner)\\b(.*?)(?:(\\/))?\\](.+?)\\[\\/\\1\\]/s\', \'protect_my_shortcode_callback\', $content);
}

function protect_my_shortcode_callback($matches){
  global $__banners;
  $id = \'<!--banner \'.count($__banners).\'-->\';

  $__banners[$id] = do_shortcode($matches[0]);
  // or \'[\'.$matches[1].\' \'.$matches[2].\']\'.$matches[4].\'[/\'.$matches[1].\']\'
  // if you need to run any filters on the shortcode content ($matches[4])

  return $id;
}

// replaces <!--banner ID--> with the processed shortcode after all the filters run
add_filter(\'the_content\', \'unprotect_my_shortcode\', 100);
function unprotect_my_shortcode($content){
  global $__banners;
  return str_replace(array_keys($__banners), array_values($__banners), $content);
}
SO网友:Ben Visness

我不知道是什么导致了这个问题,但您可以使用force_balance_tags() 函数可在事后清理标记。

请注意,有some caveats 到使用force_balance_tags() 在实践中。

结束

相关推荐

Nested Shortcode Detection

如果您熟悉此代码<?php $pattern = get_shortcode_regex(); preg_match(\'/\'.$pattern.\'/s\', $posts[0]->post_content, $matches); if (is_array($matches) && $matches[2] == \'YOURSHORTCODE\') { //shortcode is being used }&#