web-dev-qa-db-ja.com

<p>タグはショートコード出力を中断します(他の解決策は機能しません)。

奇妙な問題に遭遇しました。私のショートコード出力はこんな感じです

'<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では問題があるとは思われません。

1
Igor Yavych

この関数を試してみてください。配列にショートコードを追加してください。

// (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;
}
1
NickFMC

@ 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変数をあなた自身のショートコードに置き換えてください。

0
Corey