web-dev-qa-db-ja.com

無効なマークアップを生成しているWordPressのwpautop/shortcode

私のショートコードに無効なマークアップがあることに気付きました。 wpautopを無効にしても大丈夫

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 />を追加すること以外は大丈夫です。

1
JM at Work

これを試して:

// 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);
}
1
onetrickpony

この問題の原因はわかりませんが、 force_balance_tags() 関数を使用して、事実の後にマークアップを整理することができます。

実際にforce_balance_tags()を使用する際には 注意すべき点がいくつかあります

0
Ben Visness