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" ); |
---|