奇妙な問題に遭遇しました。私のショートコード出力はこんな感じです
'<span class="link_container"><a href="#">'.$content.'</a></span>
<div class="upgrade_box">
some more divs here
</div>'
</p>
の後に挿入されたランダムな</span>
終了タグによって壊れています
Wpautopの優先順位を変更してもうまくいきませんでした。うまくいったと思われる唯一の解決策は、wpautopフィルタをすべて削除することでしたが、これは明らかにそれほど優れた解決策ではありません。
P.S私は自分のテストサイトでwp 2015テーマを使っているので、いくつかのテーマの森テーマpplでは問題があるとは思われません。
この関数を試してみてください。配列にショートコードを追加してください。
// (OPT) STOP SHORTCODES THAT DON'T USE INLINE CONTENT FROM BEING WRAPPED IN A P TAG (until WP fixes this)
// ** NOTE -> BE SURE TO change the array to the shortcodes you are using!
add_filter('the_content', 'the_content_filter');
function the_content_filter($content) {
// array of custom shortcodes requiring the fix
$block = join("|",array( 'shortcode_name' ));
// opening tag
$rep = preg_replace("/(<p>)?\[($block)(\s[^\]]+)?\](<\/p>|<br \/>)?/","[$2$3]",$content);
// closing tag
$rep = preg_replace("/(<p>)?\[\/($block)](<\/p>|<br \/>)?/","[/$2]",$rep);
return $rep;
}
@ nickfmcのコメントを締めくくるに、これは最新のWordPressの改訂版で、フィルタに正しい優先順位を使用し、正規表現に関するいくつかの問題も修正しています。
注:各ブロックフォーマットのショートコードは、それぞれ独自の行(WYSIWYGエディタの独立した段落)に入れておくことをお勧めします。
<?php
add_filter('the_content', function ($content) {
$blocks = 'columns|column';
$replace = [
"/(?:<p>)?\[($blocks)(\s[^\]]+)?\](?:<\/p>|<br\s*\/?>)?/" => '[$1$2]',
"/(?:<p>)?\[\/($blocks)\](?:<\/p>|<br\s*\/?>)?/" => '[/$1]',
];
return preg_replace(array_keys($replace), array_values($replace), $content);
}, '10.1');
もちろん、$blocks
変数をあなた自身のショートコードに置き換えてください。