Cum să elimini paragrafele goale din the_content?
Bună tuturor, Pur și simplu vreau să evit crearea de paragrafe goale în postările mele WordPress. Acest lucru se întâmplă destul de des când încerc să spațiez manual conținutul.
Nu înțeleg de ce această funcție nu are efect?
/*Elimină tag-urile de paragraf goale din 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');
edit/actualizare:
se pare că problema este aceasta:
function qanda($content) {
// filtrează pentru [q=o întrebare] și [a=un răspuns]
// le înfășoară în <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');
Am creat această funcție pentru a filtra un tip de model de shortcode în postările și paginile mele. Chiar dacă în backend postarea este complet fără paragrafe și spații inutile, rezultatul arată astfel:
<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>
aveți vreo idee de unde provin aceste tag-uri p goale?
Am avut aceeași problemă pe care o ai tu. Am făcut o... să zicem... soluție nu foarte frumoasă, dar funcționează și până acum este singura soluție pe care o am. Am adăugat o mică linie de JavaScript. Are nevoie de jQuery, dar sunt sigur că te poți descurca și fără.
Iată micul meu cod JS:
$('p:empty').remove();
Funcționează pentru mine!

Oh, ce drăguț lucrușor! Mulțumesc pentru pont - funcționează pentru mine și în cazul în care cineva altcineva s-a întrebat cum să-l folosească, doar puneți-l în fișierul JS personalizat al temei dumneavoastră.

Dacă vrei doar să eviți afișarea lor din motive de spațiere, această soluție funcționează bine până la IE9. http://caniuse.com/#feat=css-sel3 și https://developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty pentru mai multe informații.

opțiune interesantă cu metoda selectorului CSS, nu știam că există. mulțumesc!

FYI: Dacă există
în interiorul tag-ului <p>, această soluție nu va funcționa.

WordPress va insera automat tag-urile <p>
și </p>
care separă întreruperile de conținut într-un articol sau pagină. Dacă, din anumite motive, doriți sau aveți nevoie să eliminați acestea, puteți utiliza oricare dintre următoarele fragmente de cod.
Pentru a dezactiva complet filtrul wpautop, puteți folosi:
remove_filter('the_content', 'wpautop');
Dacă încă doriți ca această funcție să funcționeze, încercați să adăugați o valoare de prioritate mai mare filtrului dvs., de exemplu:
add_filter('the_content', 'removeEmptyParagraphs', 99999);

mulțumesc! Știu că WordPress inserează automat tag-uri p. Totuși, există cazuri în care apar doar tag-uri goale <p></p> undeva în conținut (când le inspectez cu unele instrumente)... asta se întâmplă când fac multe ștergeri și editări de articole. Pur și simplu nu vreau să am paragrafe goale în conținutul meu, atât. Am nevoie de paragrafe, dar nu de cele goale. Valoarea 99999 nu face nicio diferență. Pur și simplu nu funcționează. Filtrul wpautop nu este ceea ce vreau. Acesta prevenește toate <p>-urile și formatarea automată. Eu pur și simplu nu vreau niciun p gol!

Știu că această problemă este deja marcată ca 'rezolvată', dar doar pentru referință, iată o funcție care face exact ceea ce doriți fără a fi nevoie să adăugați nicio marcare în postări. Puneți acest cod în fișierul functions.php al temei dumneavoastră:
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);
}
Acest cod este preluat din acest gist: https://gist.github.com/1668216

Doar o mică notă despre utilizarea funcției force_balance_tags()...
Am dat peste o problemă complicată cauzată de această funcție atunci când a fost folosită pe conținut care includea JavaScript (JS venea de la Gravity Forms când foloseam ajax pe un formular). Există probleme cunoscute cu force_balance_tags
atunci când întâlnește caracterul <
în anumite situații. Consultați tichetul 9270 pentru detalii.

Ai putea pur și simplu să rulezi filtrul tău înainte ca acel enervant wpautop
să se atașeze și să încurce marcajul.
add_filter('the_content', 'qanda', 7 );
În acest fel, deja ai convertit ceea ce ai nevoie până când acesta se atașează, ceea ce ajută în unele cazuri.

Aceeași abordare ca cele 2 răspunsuri de dinaintea mea, dar cu o expresie regulată actualizată, pentru că a lui nu a funcționat pentru mine.
expresia regulată: /<p>(?:\s| )*?<\/p>/i
(grup non-capturant care caută orice număr de spații albe sau
în interiorul tag-ului p, toate insensibile la majuscule/minuscule.
add_filter('the_content', function($content) {
$content = force_balance_tags($content);
return preg_replace('/<p>(?:\s| )*?<\/p>/i', '', $content);
}, 10, 1);

Am găsit acest lucru ciudat, dar de fapt apelarea funcției the_content()
va insera paragrafe în modul descris de tine. Dacă dorești codul HTML, practic așa cum l-ai introdus (la fel ca "view HTML" când editezi), atunci folosește get_the_content()
care returnează conținutul fără formatare și fără tag-uri de paragraf.
Deoarece returnează conținutul, asigură-te că folosești ceva de genul:
echo get_the_content();
Vezi și: http://codex.wordpress.org/Function_Reference/get_the_content

bine, mulțumesc. Totuși nu vreau asta! Am nevoie de paragrafe normale. În primul rând este markup semantic și în al doilea rând așa ar trebui să fie. Nu vreau să am paragrafe goale care nu au sens! Pur și simplu pentru că am stiluri aplicate acestor paragrafe, iar paragrafele goale apar cu acest stil și pagina mea arată ciudat.

Aceasta va elimina recursiv toate tag-urile HTML goale din șirul de caractere
add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
$str = force_balance_tags($str);
//** Returnează dacă șirul nu este dat sau este gol.
if (!is_string ($str)
|| trim ($str) == '')
return $str;
//** Tag-uri HTML goale recursive.
return preg_replace (
//** Model scris de Junaid Atari.
'/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',
//** Înlocuiește cu nimic dacă șirul este gol.
!is_string ($repto) ? '' : $repto,
//** Șirul sursă
$str
);}
Modelul este preluat de la http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

Pentru a avea doar conținutul HTML fără tag-uri
putem folosi următoarea buclă pentru a afișa doar HTML-ul fără formatarea articolului sau paginii<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>

Dacă obțineți un tag <p>
gol în partea de sus a paginii sau a articolului, acesta este de obicei cauzat de încadrarea lui <?php the_content();?>
în tag-uri de paragraf.
PROBLEMA
Acesta este motivul pentru care apare tag-ul <p>
neașteptat în partea de sus a paginii/articolului:
<p><?php the_content();?></p>
SOLUȚIA
Dacă eliminați tag-urile <p>
și păstrați doar tag-ul de șablon, veți rezolva problema.
<?php the_content();?>
