web-dev-qa-db-ja.com

基本的なショートコード - 1段落目がpタグで囲まれていないのに2段目が

私は、列、ボタン、パネルなどのためのショートコードを追加する基本的なプラグインに取り組んでいます。ここで新しいことは何もない。私はとにかくwpautopを変更していません。私はそれを削除してそれを遅らせることを試みました - 変更なし。使用されているすべてのショートコードで起こることは、最初の段落がpタグで囲まれていない(実際にはpタグが最初の段落の直後に現れて空になる)が最初の段落が折り返されていない理由を理解する必要があります。

関数:

function vc_shortcode_panel($atts, $content = null) {
  extract( shortcode_atts( array(
    'type' => ''
  ), $atts) );
 return '<div class="panel ' . $type . '">' . do_shortcode( trim($content) ) . '</div>';
 }
add_shortcode('panel', 'vc_shortcode_panel');

ショートコード:

[panel type=""]paragraph 1

paragraph 2[/panel]

出力は次のようになります。

<div class="panel">
  paragraph 1
  <p></p>
  <p>paragraph 2</p>
</div>

[panel]と最初の段落の間に改行を追加すると、最初の段落がpタグで囲まれます。しかし、その改行を必要とせずにショートコードを正しくフォーマットすることができないはずですか?私は何を間違っているのですか、そして、誰がこれが起こっているのか私に言うことができますか?

1
gstricklind

これは実際には wpautop()関数 の意図した目的の例です。コーデックスから:

テキスト内の二重改行をHTML段落に変更します(<p>...</p>)。

Codex で提供されている例では、この目的のために改行で始まる文字列を明示的に使用しています。

<?php
$some_long_text = // Start Text
Some long text
that has many lines

and paragraphs in it.
// end text

echo wpautop($some_long_text);
?>

上記の結果、次のようなマークアップが得られます。

<p>Some long text<br/>
that has many lines</p>
<p>and paragraphs in it.</p>

この機能の背後にある理由は、HTMLマークアップの二重改行が一般的な空白として解釈され、DOM内の単一の改行としてレンダリングされることです。二重改行を正しく表示するには、<br />要素を挿入するか、デフォルトの段落要素スタイルを使用する必要があります。これがWordPressの動作です。

例の最初の行には改行が含まれていないので、改行のフォーマットを保持する必要がないため、段落や<br />要素は追加されません。

正確な実装については wpautop()関数のソース を参照してください。

2
bosco