it-swarm.com.de

basic Shortcode - Warum 1. Absatz nicht in p-Tag, sondern 2. ist

Ich arbeite an einem einfachen Plugin, das Shortcodes für Spalten, Schaltflächen, Bedienfelder usw. hinzufügt. Hier gibt es nichts Neues. Ich habe wpautop sowieso nicht geändert. Ich habe versucht, es zu entfernen und zu verzögern - keine Änderung. Was mit allen verwendeten Shortcodes passiert, ist, dass der erste Absatz nicht in ein p-Tag eingeschlossen wird (die p-Tags erscheinen tatsächlich direkt nach dem ersten Absatz und sind leer), sondern dass alle Absätze nach dem ersten innerhalb desselben Shortcodes in p-Tags eingeschlossen werden. Ich muss herausfinden, WARUM der erste Absatz nicht umbrochen wird.

Funktion:

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');

Shortcode:

[panel type=""]paragraph 1

paragraph 2[/panel]

Die Ausgabe sieht folgendermaßen aus:

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

Ich weiß, dass, wenn ich einen Zeilenumbruch zwischen dem [Bedienfeld] und dem ersten Absatz hinzufüge, dieser erste Absatz in ein p-Tag eingeschlossen wird. Aber sollten Shortcodes nicht korrekt formatiert werden können, ohne dass ein Zeilenumbruch erforderlich ist? Was mache ich falsch und kann mir jemand sagen, warum das passiert?

1
gstricklind

Dies ist tatsächlich ein Beispiel für den beabsichtigten Zweck der Funktion wpautop() . Aus dem Kodex:

Ändert doppelte Zeilenumbrüche im Text in HTML-Absätze (<p>...</p>).

Beachten Sie, dass das im Codex bereitgestellte Beispiel explizit eine Zeichenfolge verwendet, die zu diesem Zweck mit einem Zeilenumbruch beginnt:

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

and paragraphs in it.
// end text

echo wpautop($some_long_text);
?>

Das obige führt zu folgendem Markup:

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

Der Grund für diese Funktionalität ist, dass doppelte Zeilenumbrüche im HTML-Markup als generisches Leerzeichen interpretiert und im DOM als einzelner Zeilenumbruch gerendert werden. Um einen doppelten Zeilenumbruch korrekt anzuzeigen, müssen Sie entweder <br /> -Elemente einfügen oder das Standard-Absatzelement-Styling verwenden, wie es WordPress tut.

Da die erste Zeile Ihres Beispiels keine Zeilenumbrüche enthält, werden keine Absatz- oder <br /> -Elemente hinzugefügt, da keine Formatierung der Zeilenumbrüche beibehalten werden muss.

Die genaue Implementierung finden Sie in der Quelle der Funktion wpautop() .

2
bosco