-
-
Save ninnypants/1668216 to your computer and use it in GitHub Desktop.
<?php | |
add_filter( 'the_content', 'remove_empty_p', 20, 1 ); | |
function remove_empty_p( $content ){ | |
// clean up p tags around block elements | |
$content = preg_replace( array( | |
'#<p>\s*<(div|aside|section|article|header|footer)#', | |
'#</(div|aside|section|article|header|footer)>\s*</p>#', | |
'#</(div|aside|section|article|header|footer)>\s*<br ?/?>#', | |
'#<(div|aside|section|article|header|footer)(.*?)>\s*</p>#', | |
'#<p>\s*</(div|aside|section|article|header|footer)#', | |
), array( | |
'<$1', | |
'</$1>', | |
'</$1>', | |
'<$1$2>', | |
'</$1', | |
), $content ); | |
return preg_replace('#<p>(\s| )*+(<br\s*/*>)*(\s| )*</p>#i', '', $content); | |
} |
OSM ... Work Perfectly
Works great. Thanks for your work!
This works great! I had one issue where a plugin was outputting HTML comments and that was interfering with the regex (#<p>\s*<(div|aside|section|article|header|footer)#
doesn't match <p><!--foo--><div>
). My solution was to just strip out all of the comments before applying this filter, using this regex <!--(.*?)-->
.
Seems WP 4.3 broke this? ANyone else?
Use Jquery : $( 'p:empty' ).remove();
jquery option is the best, add it to custom.js , under jquery document ready function
@kprovance Does not work for me either on WP4.3.1 :(
Worked wonders for me. This will literally save me hours trying to hunt down empty lines.
@ThornedRose it seems to work again in 4.4.1
Wow... this is really awesome. Thanks!
The guy posted this. (You are awesome 👍 )
Glad To Report That It's Still Working
2017 and still working! Awesome work!
Like this
p:empty { display:none; }
Not working for me.. I have a shortcode that outputs a link along with a div container that is hidden with CSS and called when the link is clicked (as a modal). The div container, being a block element, causes the shortcode to end the paragraph early, show the div and then just has the remaining text sort of floating there unwrapped by anything.
So... let's say I have something like this in the tinymce:
Blah blah blah [popup id=5 text="click me to open the popup this should be inline with this blah blah paragraph"] and then the sentence continues.
The HTML output ends up being:
<p>Blah blah blah </p>
<div id="popup-5" class="popup-modal">click me to open... paragraph</div>
and then the sentence continues.
Was hoping your function would get me output that looked like:
<p>Blah blah blah <div id="popup-5" class="popup-modal">click me to open... paragraph</div> and then the sentence continues.</p>
Any ideas? Thank you!
Wanted to chime in to say 'thank you' for this gist. I was finally fed up with a crappy theme I'm using that aggressively added empty tags every time you hit save on a page. (Going to be moving away from the theme in the future, but gotta get through the next 2 months first). This is/was a life saver.
Adding this jQuery works perfectly fine for me
$('p').each(function() { const $this = $(this); if($this.html().replace(/\s| /g, '').length === 0) $this. Remove(); });
If the p tag is completely empty without space or  , then this should work
$( 'p:empty' ).remove();
Added more support for block level elements recently will probably turn this into a plugin on .org just to make things easier