WordPress wpautop / shortcode генерирует недопустимую разметку

Я замечаю, что theres недействительная разметка в моем коротком коде. Это нормально, если я 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 />

Попробуй это:

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

Я не знаю, что вызывает эту проблему, но вы можете использовать force_balance_tags() для очистки разметки после факта.

Обратите внимание, что есть некоторые предостережения для использования force_balance_tags() на практике.