web-dev-qa-db-fra.com

Laisse la balise de paragraphe de fermeture lors de l'utilisation de codes courts

J'utilise un shortcode de base pour envelopper du texte dans un div extensible. Ce qui semble se produire, c’est que wpautop insère au début une balise de paragraphe qui se termine et une balise de paragraphe qui s’ouvre à la fin du contenu.

Voici à quoi ça ressemble dans l'éditeur:

[expandable text = "Afficher le contenu"]

Lorem ipsum dolor sit amet, consectetur elip adipiscing elit. Cras fermentum facilisis malesuada. Suspendisse potenti. Duen turpis, en rapport avec la culture, vestibulum egestas nulla.

[/ extensible]

Et le HTML rendu:

<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>

C'est la fonction shortcode:

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

C'est un problème frustrant, car je ne peux pas compter sur les éditeurs de contenu pour qu'ils soient suffisamment informés avec Wordpress/HTML pour comprendre comment le texte saisi sera analysé ...

--MODIFIER--

Ayant pensé à cela un peu plus, j'ai reconsidéré ma réponse précédente. HTML5 + est fourni avec l’extension Tidy , si vous pouvez l’utiliser sur votre serveur, les opérations suivantes fonctionneront:

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

De cette façon, vous pouvez profiter de tous les avantages des balises P sucrées, sans craindre que wpautop ait gâché quelque chose. Vous trouverez d'autres options pour $tidyArgs dans la documentation .

Si Tidy n'est pas disponible pour une raison quelconque, cela devrait quand même fonctionner:

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;
}

L’inconvénient évident de cette dernière méthode est que je ne peux pas appliquer de styles aux balises p dans les codes courts, mais jusqu’à ce qu’une meilleure solution apparaisse ou que le problème soit résolu dans Wordpress, cela ira!

2
Gruffy