| 1 | <?php |
|---|
| 2 | /* |
|---|
| 3 | Plugin Name: WordPress Bug #14050 Hotfix |
|---|
| 4 | Plugin URI: http://core.trac.wordpress.org/ticket/14050 |
|---|
| 5 | Description: Improves the big monster shortcode_unautop() regular expression, which is causing all the ruckus |
|---|
| 6 | Author: Leho Kraav |
|---|
| 7 | Author URI: http://leho.kraav.com |
|---|
| 8 | Version: 1.0 |
|---|
| 9 | */ |
|---|
| 10 | |
|---|
| 11 | if ( is_admin() ) return; |
|---|
| 12 | |
|---|
| 13 | /** |
|---|
| 14 | * Don't auto-p wrap shortcodes that stand alone |
|---|
| 15 | * |
|---|
| 16 | * Ensures that shortcodes are not wrapped in <<p>>...<</p>>. |
|---|
| 17 | * |
|---|
| 18 | * @since 2.9.0 |
|---|
| 19 | * |
|---|
| 20 | * @param string $pee The content. |
|---|
| 21 | * @return string The filtered content. |
|---|
| 22 | */ |
|---|
| 23 | function wp14050_shortcode_unautop( $pee ) { |
|---|
| 24 | global $shortcode_tags; |
|---|
| 25 | |
|---|
| 26 | if ( empty( $shortcode_tags ) || !is_array( $shortcode_tags ) ) { |
|---|
| 27 | return $pee; |
|---|
| 28 | } |
|---|
| 29 | |
|---|
| 30 | $tagregexp = join( '|', array_map( 'preg_quote', array_keys( $shortcode_tags ) ) ); |
|---|
| 31 | |
|---|
| 32 | $pattern = |
|---|
| 33 | '/' |
|---|
| 34 | . '<p>' // Opening paragraph |
|---|
| 35 | . '\\s*+' // Optional leading whitespace |
|---|
| 36 | . '(' // 1: The shortcode |
|---|
| 37 | . '\\[\\/?' // Opening bracket for opening or closing shortcode tag |
|---|
| 38 | . "($tagregexp)" // 2: Shortcode name |
|---|
| 39 | . '(?![\\w-])' // Not followed by word character or hyphen |
|---|
| 40 | // Unroll the loop: Inside the opening shortcode tag |
|---|
| 41 | . '[^\\]\\/]*' // Not a closing bracket or forward slash |
|---|
| 42 | . '(?:' |
|---|
| 43 | . '\\/(?!\\])' // A forward slash not followed by a closing bracket |
|---|
| 44 | . '[^\\]\\/]*' // Not a closing bracket or forward slash |
|---|
| 45 | . ')*?' |
|---|
| 46 | . '[\\w\\s="\']*' // Shortcode attributes |
|---|
| 47 | . '(?:' |
|---|
| 48 | . '\\s*+' // Optional leading whitespace, supports [footag /] |
|---|
| 49 | . '\\/\\]' // Self closing tag and closing bracket |
|---|
| 50 | . '|' |
|---|
| 51 | . '\\]' // Closing bracket |
|---|
| 52 | . '(?:' // Unroll the loop: Optionally, anything between the opening and closing shortcode tags |
|---|
| 53 | . '(?!<\/p>)' // Not followed by closing paragraph |
|---|
| 54 | . '[^\\[]*+' // Not an opening bracket, matches all content between closing bracket and closing shortcode tag |
|---|
| 55 | . '(?:' |
|---|
| 56 | . '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag |
|---|
| 57 | . '[^\\[]*+' // Not an opening bracket |
|---|
| 58 | . ')*+' |
|---|
| 59 | . '\\[\\/\\2\\]' // Closing shortcode tag |
|---|
| 60 | . ')?' |
|---|
| 61 | . ')' |
|---|
| 62 | . ')' |
|---|
| 63 | . '\\s*+' // optional trailing whitespace |
|---|
| 64 | . '<\\/p>' // closing paragraph |
|---|
| 65 | . '/s'; |
|---|
| 66 | |
|---|
| 67 | return preg_replace( $pattern, '$1', $pee ); |
|---|
| 68 | } |
|---|
| 69 | |
|---|
| 70 | # wp-includes/default-filters.php |
|---|
| 71 | foreach ( array( "term_description" ) as $filter ) { |
|---|
| 72 | remove_filter( $filter, "shortcode_unautop" ); |
|---|
| 73 | add_filter( $filter, "wp14050_shortcode_unautop" ); |
|---|
| 74 | } |
|---|
| 75 | |
|---|
| 76 | remove_filter( "the_content", "shortcode_unautop" ); |
|---|
| 77 | add_filter( "the_content", "wp14050_shortcode_unautop" ); |
|---|
| 78 | |
|---|
| 79 | remove_filter( "the_excerpt", "shortcode_unautop" ); |
|---|
| 80 | add_filter( "the_excerpt", "wp14050_shortcode_unautop" ); |
|---|