web-dev-qa-db-fra.com

shortcode de base - Pourquoi le premier paragraphe n'est pas encapsulé dans la balise p, mais le deuxième est

Je travaille sur un plugin de base qui ajoute des codes courts pour les colonnes, les boutons, les panneaux, etc. Rien de nouveau ici. De toute façon, je n'ai pas modifié wpautop; J'ai essayé de l'enlever et de le retarder - pas de changement. Ce qui se passe avec tous les codes abrégés utilisés, c'est que le premier paragraphe n'est pas encapsulé dans une balise p (les balises p apparaissent en fait directement après le premier paragraphe et vides), mais tous les paragraphes après le premier dans le même code court sont encapsulés dans des balises p. Je dois comprendre POURQUOI le premier paragraphe n'est pas encapsulé.

Une fonction:

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

Petit code:

[panel type=""]paragraph 1

paragraph 2[/panel]

La sortie ressemble à ceci:

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

Je sais que si j'ajoute un saut de ligne entre le [panneau] et le premier paragraphe, le premier paragraphe sera alors encapsulé dans une balise p. Mais les codes courts ne devraient-ils pas pouvoir être formatés correctement sans nécessiter de saut de ligne? Qu'est-ce que je fais de mal et quelqu'un peut-il me dire pourquoi cela se produit?

1
gstricklind

C’est en fait un exemple de finalité de la fonction wpautop() . Du Codex:

Transforme les doubles sauts de ligne du texte en paragraphes HTML (<p>...</p>).

Notez que l'exemple fourni dans le Codex utilise explicitement une chaîne commençant par un saut de ligne à cette fin:

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

and paragraphs in it.
// end text

echo wpautop($some_long_text);
?>

Ce qui précède entraîne le balisage suivant:

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

Le raisonnement qui sous-tend cette fonctionnalité est que les doubles sauts de ligne dans le balisage HTML sont interprétés comme des espaces blancs génériques et rendus comme un simple saut de ligne dans le DOM. Afin d'afficher correctement un double saut de ligne, vous devez soit insérer des éléments <br />, soit utiliser le style par défaut des éléments de paragraphe, comme le fait WordPress.

Comme la première ligne de votre exemple ne contient pas de saut de ligne, aucun élément de paragraphe ou <br /> n'est ajouté, car aucun formatage de saut de ligne ne doit être conservé.

Voir la source de la fonction wpautop() pour connaître l'implémentation exacte.

2
bosco