web-dev-qa-db-fra.com

supprimer les paragraphes vides de the_content?

Hé les gars, je veux simplement empêcher la création de paragraphes vides dans mon post wordpress. Cela arrive assez souvent lorsque vous essayez d'espacer manuellement le contenu.

Je ne sais pas pourquoi cela ne prend pas effet

/*Remove empty paragraph tags from the_content*/
function removeEmptyParagraphs($content) {

    /*$pattern = "/<p[^>]*><\\/p[^>]*>/";   
    $content = preg_replace($pattern, '', $content);*/
    $content = str_replace("<p></p>","",$content);
    return $content;
}

add_filter('the_content', 'removeEmptyParagraphs');

éditer/mettre à jour:

semble que le problème est le suivant:

function qanda($content) {

    // filters for [q=some question] and [a=some answer]
    // wraps it inside of <div class="qanda"><div class="question"> </div><div class="answer"> </div></div>
    $content = preg_replace('/\[q=(.+?)].+?\[a=(.+?)]/is', '<div class="qanda"><div class="question">$1</div><div class="answer">$2</div></div>', $content);

    return $content;
}

add_filter('the_content', 'qanda');

j'ai moi-même fait cette fonction pour filtrer une sorte de modèle de shortcode dans mes publications et mes pages. Même si dans mon backend, le post est complètement fait sans paragraphes et espacements inutiles, le résultat est le suivant:

<div class="entry">

    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>

</div>

aucune idée d'où viennent ces p vides?

33
mathiregister

WordPress insérera automatiquement les balises <p> et </p> qui séparent les coupures de contenu dans une publication ou une page. Si, pour une raison quelconque, vous souhaitez ou devez supprimer ces éléments, vous pouvez utiliser l'un des fragments de code suivants.

Pour désactiver complètement le filtre wpautop, vous pouvez utiliser:

remove_filter('the_content', 'wpautop');

Si vous voulez toujours que cela fonctionne, essayez d'ajouter une valeur de priorité ultérieure à votre filtre, par exemple:

add_filter('the_content', 'removeEmptyParagraphs',99999);
20
Bainternet

J'ai eu le même problème que vous avez. Je viens de faire une ... disons ... pas très belle solution, mais cela fonctionne et jusqu'à présent, c'est la seule solution que j'ai. J'ai ajouté une petite ligne JavaScript. Il a besoin de jQuery, mais je suis sûr que vous pouvez le résoudre sans.

Ceci est mon petit JS:

$('p:empty').remove();

Cela fonctionne pour moi!

20
David Faber

Il suffit d'utiliser CSS

p:empty {
  display: none;
}
11

Je sais que cela est déjà marqué comme "résolu", mais juste pour référence, voici une fonction qui fait exactement ce que vous voulez sans avoir à ajouter de balises aux publications. Il suffit de mettre ceci dans le functions.php de votre thème:

add_filter('the_content', 'remove_empty_p', 20, 1);
function remove_empty_p($content){
    $content = force_balance_tags($content);
    return preg_replace('#<p>\s*+(<br\s*/*>)?\s*</p>#i', '', $content);
}

Ceci est de cette Gist: https://Gist.github.com/1668216

10
Michelle

Vous pouvez simplement lancer votre filtre avant que cette méchante wpautop s'accroche et gâche le balisage.

add_filter('the_content', 'qanda', 7 );

De cette façon, vous avez déjà converti ce dont vous avez besoin au moment de l’accrochage, ce qui peut aider dans certains cas.

5
t31os

Même approche que 2 réponses avant moi, mais une regex mise à jour, car sa ne fonctionnait pas pour moi.

the regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (groupe non capturé recherchant un nombre quelconque d'espaces ou de &nbsp;s dans une balise-p, tous les cas insensibles à la casse.

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);
3
kater louis

Cela supprimera récursivement toutes les balises html vides de la chaîne

add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
         $str = force_balance_tags($str);
         //** Return if string not given or empty.
         if (!is_string ($str)
         || trim ($str) == '')
        return $str;

        //** Recursive empty HTML tags.
       return preg_replace (

              //** Pattern written by Junaid Atari.
              '/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',

             //** Replace with nothing if string empty.
             !is_string ($repto) ? '' : $repto,

            //** Source string
           $str
);}

Le motif provient de http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

0
user2914440

Si vous avez des balises <p> avec des espaces dans le contenu, accédez à votre publication ou à votre page et ne la modifiez pas dans un style visuel.

vous trouveriez quelque &nbsp; dedans .. Supprimez-le et les balises <p> vides disparaîtront.

0
Christian Isak

Afin de n'avoir que du contenu HTML sans

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
0
Shashank

J'ai trouvé cela bizarre, mais appeler the_content() insérera des paragraphes de la manière que vous décrivez. Si vous voulez le code HTML, en gros comme vous l'avez entré (le même que "view HTML" lors de l'édition), utilisez alors get_the_content() qui renvoie le contenu sans balises de formatage et de paragraphe.

Puisqu'il le retourne, assurez-vous d'utiliser quelque chose comme:

 echo get_the_content (); 

Voir aussi: http://codex.wordpress.org/Function_Reference/get_the_content

0
cwd