web-dev-qa-db-ja.com

ショートコード使用時の段落タグの終了

私は基本的なショートコードを使ってテキストを拡張可能なdivで囲みます。何が起こっているように見えるのかというと、wpautopは折り返されているコンテンツの最初に段落終了タグを、段落終了タグに最後のタグを挿入しています。

これがエディタでどのように見えるかです:

[展開可能なテキスト= "コンテンツを表示"]

Loremイプサムdolor座ってamet、conittetur adipiscing elit。 Cras fermentum facilisis malesuada。一時停止の可能性Aenean dui turpis、イプサムエジプトの前菜、vestibulum egestas nulla。

[/拡張可能]

そしてレンダリングされたHTML:

<div class="expandable"><a href="#" class="expand-link">Show Content</a></p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras fermentum facilisis malesuada. Suspendisse potenti. Aenean dui turpis, ornare in ipsum eget, vestibulum egestas nulla.</p>
<p></div>

これはショートコード関数です。

function expandable_content_shortcode( $atts, $content = null ) {
    $args = shortcode_atts( array(
        'text' => __( 'View More', $this->plugin_slug ),
        'linklocation' => 'top'
    ), $atts, 'expandable' );

    if ( $args['linklocation'] === 'top' ) {
        $output = '<div class="expandable-content"><a href="#" class="expand-link">' . $args['text'] . '</a>' . $content . '</div>';
    } else {
        $output = '<div class="expandable-content">' . $content . '<a href="#" class="expand-link">' . $args['text'] . '</a></div>';
    }

    return $output;
}
4
hereswhatidid

私が入力したテキストがどのようにパースされるのか理解するのにWordpress/HTMLに精通しているのは私がコンテンツエディタに頼ることができないので、これはイライラする問題です...

- 編集 -

もう少し考えてみると、私は以前の答えを再検討しました。 HTML5 +には Tidy拡張子 が付いています。これをあなたのサーバーで使うことができれば、次のようになります。

function cleanUpAutoP($content)
    {
        $tidy = new Tidy();
        // Switch out the encoding an doctype in $tidyArgs to suit your use case
        // 'show-body-only' HTML to be parsed as a fragment
        // rather than a whole document
        $tidyArgs = array(  'doctype' => 'html',
                            'input-encoding' => 'utf8',
                            'output-encoding' => 'utf8',
                            'show-body-only' => true
                    );
        // Return the repaired string
        return $tidy->repairString($content, $tidyArgs);
    }

このようにして、wpautopが何かをめちゃくちゃにすることを恐れずに、甘い、甘いPタグのすべての利点を享受することができます。 $tidyArgsのさらなるオプションは ドキュメント で見ることができます。

何らかの理由でTidyが利用できない場合でも、これでうまくいくはずです。

function cleanUpAutoP($content) {

    // Replace all OPENING paragraph tags with <br /><br />
    $content = preg_replace('/<p[^>]*>/', '<br /><br />', $content);

    // Remove all CLOSING p tags
    $content = str_replace('</p>', '', $content);


    return $content;
}

後者の方法の明らかな欠点は、ショートコードのpタグにはスタイルを適用できないことですが、より良い解決策が見つかるまで、または問題がWordpressで修正されるまでは、そうなるでしょう。

2
Gruffy