Skip to content

Instantly share code, notes, and snippets.

@bitfade
Last active April 3, 2025 18:18
Show Gist options
  • Save bitfade/4555047 to your computer and use it in GitHub Desktop.
Save bitfade/4555047 to your computer and use it in GitHub Desktop.
WordPress - Remove empty p tags for custom shortcodes
<?php
add_filter("the_content", "the_content_filter");
function the_content_filter($content) {
// array of custom shortcodes requiring the fix
$block = join("|",array("col","shortcode2","shortcode3"));
// opening tag
$rep = preg_replace("/(<p>)?\[($block)(\s[^\]]+)?\](<\/p>|<br \/>)?/","[$2$3]",$content);
// closing tag
$rep = preg_replace("/(<p>)?\[\/($block)](<\/p>|<br \/>)?/","[/$2]",$rep);
return $rep;
}
Copy link

ghost commented Feb 18, 2014

Hello, any newer option for removing empty p? I can't get theme accepted on themeforest with this code inside.

@dtbaker
Copy link

dtbaker commented Feb 20, 2014

A friend of mine also had his theme rejected using this, but it might still be possible if it is explained, http://themeforest.net/forums/thread/how-to-add-shortcodes-in-wp-themes-without-being-rejected/98804#993635

@ash-f
Copy link

ash-f commented Oct 3, 2017

Interesting.
But shouldn't it be content_save_pre or something rather than the_content that works when saving posts?
So it will put less server loads.

function my_sanitize_content($value){ $value = preg_replace("/<p>(\[[^<]+?)<\/p>/u","$1",$value); $value = preg_replace("/<p>(\[[^<]+?)<br \/>/u","$1<p>",$value); return $value; } add_filter('content_save_pre','my_sanitize_content',10,1);

@cecowe
Copy link

cecowe commented Jul 10, 2018

Hey,
I have a child theme active right now. Should I add this snippet to functions of the child theme or the parent theme?
How may I add the code, in the end of the .php or?

@marbaque
Copy link

marbaque commented Apr 1, 2025

Is this still working? I am having that issue

@Shoora
Copy link

Shoora commented Apr 3, 2025

Is this still working? I am having that issue

i used this code

function clean_shortcodes($content) {
// List of shortcodes to process
$shortcodes = [
'item',
'itemalt'
];

// Process each shortcode
$content = array_reduce($shortcodes, function($carry, $shortcode) use ($content) {
    if (has_shortcode($carry, $shortcode)) {
        return preg_replace(
            "/(?:<p>|<br \/>)*\[(\/?{$shortcode})([^\]]*)\](?:<\/p>|<br \/>)*\s*/i",
            "[$1$2]",
            $carry
        );
    }
    return $carry;
}, $content);

return $content;

}
add_filter('the_content', 'clean_shortcodes', 10);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment