web-dev-qa-db-fra.com

Existe-t-il une fonction un-wp_autop?

J'ai un problème avec WP qui nécessite votre aide. Le contenu de certains de mes messages a déjà été appliqué aux filtres "wp_autop". Ce filtre a transformé toutes les lignes à double cassure en balise <p>. Je veux l’inverse: transformer toutes les balises <p> en lignes à double cassure.

Avez-vous des suggestions? Je vous remercie.

3
Anh Tran

Je viens de rencontrer cette situation. Voici une fonction que j'avais l'habitude de défaire avec wpautop. Il se peut que je manque quelque chose, mais c’est un bon début:

function reverse_wpautop($s)
{
    //remove any new lines already in there
    $s = str_replace("\n", "", $s);

    //remove all <p>
    $s = str_replace("<p>", "", $s);

    //replace <br /> with \n
    $s = str_replace(array("<br />", "<br>", "<br/>"), "\n", $s);

    //replace </p> with \n\n
    $s = str_replace("</p>", "\n\n", $s);       

    return $s;      
}
8
Jason Coleman

Le filtre n'écrit pas dans la base de données, filtre sur l'interface frontale, lors de l'affichage de la publication ou d'un autre contenu. Vous désactivez le filtre et écrivez un filtre propre pour définir votre balisage personnalisé.

2
bueltge

J'avais aussi besoin d'un moyen de faire cela, mais n'étant pas satisfait des solutions existantes, j'ai décidé d'en créer une. J'espère que ça aide quelqu'un.

<?php

/**
 * Replaces paragraph elements with double line-breaks.
 *
 * This is the inverse behavior of the wpautop() function
 * found in WordPress which converts double line-breaks to
 * paragraphs. Handy when you want to undo whatever it did.
 * 
 * @see    wpautop()
 *
 * @param  string $pee
 * @param  bool   $br (optional)
 *
 * @return string
 */
function fjarrett_unautop( $pee, $br = true ) {

    // Match plain <p> tags and their contents (ignore <p> tags with attributes)
    $matches = preg_match_all( '/<(p+)*(?:>(.*)<\/\1>|\s+\/>)/m', $pee, $pees );

    if ( ! $matches ) {

        return $pee;

    }

    $replace = array( "\n" => '', "\r" => '' );

    if ( $br ) {

        $replace['<br>']   = "\r\n";
        $replace['<br/>']  = "\r\n";
        $replace['<br />'] = "\r\n";

    }

    foreach ( $pees[2] as $i => $tinkle ) {

        $replace[ $pees[0][ $i ] ] = $tinkle . "\r\n\r\n";

    }

    return rtrim(
        str_replace(
            array_keys( $replace ),
            array_values( $replace ),
            $pee
        )
    );

}

https://Gist.github.com/fjarrett/ecddd0ed419bb853e390

Bonus: Vous pourriez aussi potentiellement utiliser ceci pour déterminer si le contenu a été modifié par wpautop.

$is_wpautop = ( $content !== fjarrett_unautop( $content ) );
2
Frankie Jarrett

Il existe une fonction intégrée dans WordPress, mais JavaScript n'est déclenché que lorsque vous passez de Visual à HTML dans l'éditeur de publication (et c'est vraiment un bug si le langage HTML est réellement utilisé). Si son contenu est tout à fait normal (pas de code html), vous pouvez simplement éditer chaque message, basculer l’éditeur en arrière, puis sauvegarder.

C’est probablement la méthode la plus laborieuse, mais la plus sûre.

0
WraithKenny