supprimer les paragraphes vides de the_content?

33

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 fait cette fonction moi-même 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?

mathiregister
la source
1
Essayez d’exécuter votre filtre avant wpautopde commencer, par exemple. add_filter('the_content', 'qanda', 7 );..
t31os
@ t31os: Pouvez-vous déplacer votre commentaire sur une réponse afin que nous puissions voter?
Jan Fabry

Réponses:

20

WordPress insère automatiquement <p>et </p>balises qui séparent les pauses contenu dans un article ou une page. Si, pour une raison quelconque, vous souhaitez ou devez les supprimer, 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);
Bainternet
la source
2
Je vous remercie! Je sais que wordpress insère automatiquement p tags. Cependant, il arrive parfois que des balises <p> </ p> vides se trouvent quelque part dans mon contenu (lorsque je l'inspecte avec un outil) ... cela se produit lorsque vous supprimez et éditez beaucoup de messages. Je ne veux tout simplement pas avoir de paragraphes vides dans mon contenu, c'est tout. J'ai besoin de paragraphes, mais pas de vides. Le 99999 ne fait aucune différence. Ça ne marche pas. le filtre wpautop n'est pas ce que je veux. Cela empêche tout <p> et tout formatage automatique. Je ne veux pas de p vide!
mathiregister
J'ai mis à jour mon post pour que vous voyez ce que je veux dire! J'ai fait une fonction qui filtre déjà le contenu. il insère divs et il semble que wordpress insère <p> </ p> avant et après, je ne comprends tout simplement pas. des idées?
mathiregister
21

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!

David Faber
la source
oh c'est pas un joli petit numéro! Merci pour le conseil - cela fonctionne pour moi et si quelqu'un d'autre se demandait comment l'utiliser, insérez-le dans le fichier JS personnalisé de votre thème.
Sol
11
Vous pouvez également le faire avec CSS:p:empty { display:none; }
@D_N Utiliser CSS pour masquer les balises de paragraphe vides ne fonctionne que pour <p></p>mais ne fonctionne pas pour <p>\n</p>.
Michael Ecklund le
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 cet élément essentiel: https://gist.github.com/1668216

Michelle
la source
6
Juste une petite note sur l'utilisation de force_balance_tags () ... Je suis tombé sur un bogue complexe provoqué par cette fonction lorsqu'elle était utilisée sur du contenu incluant du JavaScript (JS provenait de Gravity Forms lors de l'utilisation d'ajax sur un formulaire). Il y a des problèmes connus force_balance_tagsquand il rencontre le <personnage dans certaines situations. Voir le billet [9270] ( core.trac.wordpress.org/ticket/9270 ) pour plus de détails.
Dave Romsey
J'ai eu le même problème mis en évidence par Dave: l'extrait a supprimé la vidéo youtube intégrée et cela a également causé des problèmes de validation sur les pages d'amplis.
Marco Panichi
11

Il suffit d'utiliser CSS

p:empty {
  display: none;
}
au moins trois personnages
la source
S'il vous plaît ajouter une explication à votre réponse
Pieter Goosen
4
@PieterGoosen c'est déjà explicite
au moins trois caractères du
Si vous voulez simplement éviter de les afficher à des fins d'espacement, cela fonctionne bien jusqu'à IE9. caniuse.com/#feat=css-sel3 et developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty pour plus d'informations.
Will
1
option agréable avec la méthode de sélection CSS, ne savait pas qu'il existait. Merci!
i_a
1
FYI: S'il y a &nbsp;dans la balise <p> cela ne fonctionnera pas.
RynoRn le
5

Vous pouvez simplement lancer votre filtre avant qu'il ne wpautops'accroche mal avec 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 aide dans certains cas.

t31os
la source
3

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 le p-tag, tous les cas insensibles.

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);
Kater Louis
la source
0

J'ai trouvé cela bizarre, mais en réalité, l'appel the_content()insérera des paragraphes de la manière que vous décrivez. Si vous voulez le code html, fondamentalement, comme vous l'avez entré (le même que "view HTML" lors de l'édition), utilisez ensuite le type 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

cwd
la source
bien merci. Cependant je ne veux pas ça! J'ai besoin de paragraphes normaux. Premièrement, c'est le balisage sémantique et deuxièmement, c'est juste la façon dont il est supposé le faire. Je ne veux tout simplement pas avoir des paragraphes vides qui n'ont aucun sens! Simplement parce que j'ai appliqué le style à ces paragraphes, des paragraphes vides apparaissent avec ce style et ma page a un aspect bizarre.
mathiregister
Je me demande vraiment pourquoi mon objet add_filter ne fonctionne pas?
mathiregister
Je t'ai eu. Une chose que je recommanderais d’essayer est de passer du HTML au visuel et vice-versa. Je crois que lorsque l'éditeur WYSIWYG est chargé, il supprime les balises de paragraphe vides.
cwd
0

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 modèle provient de http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

utilisateur2914440
la source
0

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

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

Christian Isak
la source
0

Afin de n'avoir que du contenu HTML sans

balises, nous pouvons utiliser la boucle suivante pour ne mettre que le code HTML sans formater la publication ou la page

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