21

I've seen the tutorials on creating a (raw) shortcode that leaves the code inside it untouched,

http://www.wprecipes.com/disable-wordpress-automatic-formatting-on-posts-using-a-shortcode

but unfortunately this only applies to one shortcode at a time... and because the else statement bypasses the normal filters and calls the functions directions. My other modifications to autop and texturize functions get ignored.

Is there a way to 1. match multiple shortcodes and 2. preserve my other add/remove filters to the_content?

1
  • The link is (effectively) broken. It redirects to a generic page, home for https://wphacks.com/. Commented Dec 8, 2019 at 20:51

4 Answers 4

47

After implementing @helgatheviking's solution on multiple websites, I'm convinced that only these lines are required:

// Move wpautop filter to AFTER shortcode is processed
remove_filter('the_content', 'wpautop');
add_filter('the_content', 'wpautop', 99);
add_filter('the_content', 'shortcode_unautop', 100);

Put them in your functions.php file and you're set.

Sign up to request clarification or add additional context in comments.

8 Comments

Thanks for verifying that. I've accepted this answer so that people will stop using my full code.
Where is shortcode_unautop defined? Is it a part of Wordpress?
Seriously, why is this not the default? I was getting all sorts of weird mangled output from a shortcode that was run through wpautop twice— dropped this in and it's perfect.
@NateBeaty Just yet another weird quirk of WordPress I suppose. wpautop() is one of those functions that seem quite dated just in general, but these behaviours make it more than a little annoying.
Anybody remember in what part of functions.php?
|
9

I solved this as best as possible by combining a slightly modified parse_shortcode_content function from Donal MacArthur (his originally manually calls wpautop... which I've removed. With the re-ordering of default filters to run wpautop much later... after the shortcode has already been processed instead of before.

// Clean up WordPress shortcode sormatting - important for nested shortcodes
// Adjusted from http://donalmacarthur.com/articles/cleaning-up-wordpress-shortcode-formatting/
function parse_shortcode_content( $content ) {

   /* Parse nested shortcodes and add formatting. */
    $content = trim( do_shortcode( shortcode_unautop( $content ) ) );

    /* Remove '' from the start of the string. */
    if ( substr( $content, 0, 4 ) == '' )
        $content = substr( $content, 4 );

    /* Remove '' from the end of the string. */
    if ( substr( $content, -3, 3 ) == '' )
        $content = substr( $content, 0, -3 );

    /* Remove any instances of ''. */
    $content = str_replace( array( '<p></p>' ), '', $content );
    $content = str_replace( array( '<p>  </p>' ), '', $content );

    return $content;
}

and moving the filters

// Move wpautop filter to AFTER shortcode is processed
remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop', 99);
add_filter( 'the_content', 'shortcode_unautop', 100 );

EDIT:

The parse_shortcode_content() function is no longer required (if it ever was). Simply adjust the filter order.

5 Comments

with the filters re-ordered, i'm not even sure that i need to continue using the parse_shortcode_content( $content ) in lieu of simply do_shortcode($content) in my nested shortcodes
thanks but where are you calling parse_shortcode_content? if i put that code in functions.php nothing happens. Thanks
honestly, after a year, i can't really remember. i believe it was inside the shortcode function... in lieu of do_shortcode(). but try re-ordering the filters, that seemed to work for @dan
This code doesn't look right. How can a 4-character long or 3-character long string ever be '' (an empty string)?
i have no idea. it might not be right or even needed, anymore.
5

In my case - this solution has broken one of the side shortcodes (revslider).

So I've found another solution here: http://wordpress-hackers.1065353.n5.nabble.com/shortcode-unautop-tp42085p42086.html

Which is to use another filter like this:

// Via http://www.wpexplorer.com/clean-up-wordpress-shortcode-formatting/
if ( !function_exists('wpex_fix_shortcodes') ) {
    function wpex_fix_shortcodes($content){
        $array = array (
            '<p>[' => '[',
            ']</p>' => ']',
            ']<br />' => ']'
        );
        $content = strtr($content, $array);
        return $content;
    }
    add_filter('the_content', 'wpex_fix_shortcodes');
}

It works fine for me :)

Comments

1

Please see my answer here:

Remove wpautop from shortcode content / remove whitespace in buffering

It allows you to turn off wpautop for as many specific shortcodes as you want using this:

include "shortcode-wpautop-control.php";
chiedolabs_shortcode_wpautop_control(array('shortcodeone', 'shortcodetwo'));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.