Make WordPress Core

Changeset 64347


Ignore:
Timestamp:
10/14/2026 07:34:43 PM (31 hours ago)
Author:
joedolson
Message:

Admin: Revert admin notices accessibility fixes.

Following merge, it became evident that the complexity of notices as handled in the WordPress admin make this change premature. While it worked effectively handling standard notices, there are significant numbers of unusual notice cases. The follow-up PR (​https://github.com/wordpress/wordpress-develop/pull/14223) would have significantly limited the false positives, but not sufficiently for production.

Variant notices will need to have improved handling before these fixes can be implemented effectively.

Props joedolson, matt, peterwilsoncc, wildworks, mamaduka.
See #50486.

Location:
trunk
Files:
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/js/_enqueues/admin/common.js

    r64301 r64347  
    10761076        }
    10771077
     1078        /*
     1079         * The `.below-h2` class is here just for backward compatibility with plugins
     1080         * that are (incorrectly) using it. Do not use. Use `.inline` instead. See #34570.
     1081         * If '.wp-header-end' is found, append the notices after it otherwise
     1082         * after the first h1 or h2 heading found within the main content.
     1083         */
     1084        if ( ! $headerEnd.length ) {
     1085                $headerEnd = $( '.wrap h1, .wrap h2' ).first();
     1086        }
     1087        $( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd );
     1088
    10781089        /**
    10791090         * Makes notices dismissible.
    … …  
    15141525                input.on('change', toggleUploadButton);
    15151526        })();
    1516 
    1517         /**
    1518          * Moves the admin notices into an `aside` element after the first `h1`.
    1519          * Prior to 7.2.0, admin notices were only moved after the first `h1`;
    1520          * The `aside` wrapper was added in 7.2.0.
    1521          *
    1522          * @since 7.2.0
    1523          *
    1524          * @return {void}
    1525          */
    1526         function moveAdminNotices() {
    1527                 /*
    1528                  * The `.below-h2` class is here just for backward compatibility with plugins
    1529                  * that are (incorrectly) using it. Do not use. Use `.inline` instead. See #34570.
    1530                  * If '.wp-header-end' is found, append the notices after it otherwise
    1531                  * after the first h1 or h2 heading found within the main content.
    1532                  */
    1533                 if ( ! $headerEnd.length ) {
    1534                         $headerEnd = $( '.wrap h1, .wrap h2' ).first();
    1535                 }
    1536                 const $notices = $( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' );
    1537                 if ( $notices.length ) {
    1538                         const $wpAdminNotices = $( '<aside id="wp-admin-notices"></aside>' ).attr( 'aria-label', __( 'Admin Notices' ) ).insertAfter( $headerEnd );
    1539                         $notices.appendTo( $wpAdminNotices );
    1540                 }
    1541         }
    15421527
    15431528        /**
    … …  
    21442129
    21452130        window.wpResponsive.init();
    2146         moveAdminNotices();
    21472131        setPinMenu();
    21482132        setMenuState();
  • trunk/src/wp-admin/admin.php

    r64282 r64347  
    101101
    102102require_once ABSPATH . 'wp-admin/includes/admin.php';
    103 
    104 WP_Admin_Notice_Collector::init();
    105103
    106104auth_redirect();
  • trunk/src/wp-includes/functions.php

    r64305 r64347  
    93469346        $args = apply_filters( 'wp_admin_notice_args', $args, $message );
    93479347
    9348         // Unique ID is intended for internal use, and is not a filterable argument.
    9349         $unique_id         = wp_unique_prefixed_id( 'wp-admin-notice-' );
    9350         $args['notice_id'] = $unique_id;
    9351 
    93529348        $wrap_with_p  = false !== $args['paragraph_wrap'];
    93539349        $wrap_opener  = $wrap_with_p ? '<p>' : '';
    … …  
    93599355                $trimmed_id = trim( $args['id'] );
    93609356
    9361                 $html_builder->set_attribute( 'data-id', $unique_id );
    93629357                if ( '' !== $trimmed_id ) {
    93639358                        $html_builder->set_attribute( 'id', $trimmed_id );
    9364                 } else {
    9365                         $html_builder->set_attribute( 'id', $unique_id );
    9366                 }
    9367         } else {
    9368                 $html_builder->set_attribute( 'data-id', $unique_id );
    9369                 $html_builder->set_attribute( 'id', $unique_id );
     9359                }
    93709360        }
    93719361
  • trunk/src/wp-settings.php

    r64337 r64347  
    116116require ABSPATH . WPINC . '/meta.php';
    117117require ABSPATH . WPINC . '/functions.php';
    118 require ABSPATH . WPINC . '/class-wp-admin-notice-collector.php';
    119118require ABSPATH . WPINC . '/class-wp-meta-query.php';
    120119require ABSPATH . WPINC . '/class-wp-matchesmapregex.php';
  • trunk/tests/phpunit/tests/functions/wpAdminNotice.php

    r64282 r64347  
    2222         */
    2323        public function test_should_output_admin_notice( $message, $args, $expected ) {
    24                 // Replace placeholder %%ID%% in expected string, required for test isolation.
    25                 $next_id = array_last( explode( '-', wp_unique_prefixed_id( 'wp-admin-notice-' ) ) );
    26                 ++$next_id;
    27                 $expected = str_replace( '%%ID%%', $next_id, $expected );
    28 
    2924                ob_start();
    3025                wp_admin_notice( $message, $args );
    … …  
    4439                                'message'  => 'A notice with defaults.',
    4540                                'args'     => array(),
    46                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with defaults.</p></div>',
     41                                'expected' => '<div class="notice"><p>A notice with defaults.</p></div>',
    4742                        ),
    4843                        'an empty message (used for templates)'     => array(
    … …  
    5449                                        'additional_classes' => array( 'inline', 'hidden' ),
    5550                                ),
    56                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice notice-error is-dismissible inline hidden"><p></p></div>',
     51                                'expected' => '<div id="message" class="notice notice-error is-dismissible inline hidden"><p></p></div>',
    5752                        ),
    5853                        'an empty message (used for templates) without paragraph wrapping' => array(
    … …  
    6560                                        'paragraph_wrap'     => false,
    6661                                ),
    67                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice notice-error is-dismissible inline hidden"></div>',
     62                                'expected' => '<div id="message" class="notice notice-error is-dismissible inline hidden"></div>',
    6863                        ),
    6964                        'an "error" notice'                         => array(
    … …  
    7267                                        'type' => 'error',
    7368                                ),
    74                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-error"><p>An "error" notice.</p></div>',
     69                                'expected' => '<div class="notice notice-error"><p>An "error" notice.</p></div>',
    7570                        ),
    7671                        'a "success" notice'                        => array(
    … …  
    7974                                        'type' => 'success',
    8075                                ),
    81                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-success"><p>A "success" notice.</p></div>',
     76                                'expected' => '<div class="notice notice-success"><p>A "success" notice.</p></div>',
    8277                        ),
    8378                        'a "warning" notice'                        => array(
    … …  
    8681                                        'type' => 'warning',
    8782                                ),
    88                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-warning"><p>A "warning" notice.</p></div>',
     83                                'expected' => '<div class="notice notice-warning"><p>A "warning" notice.</p></div>',
    8984                        ),
    9085                        'an "info" notice'                          => array(
    … …  
    9388                                        'type' => 'info',
    9489                                ),
    95                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-info"><p>An "info" notice.</p></div>',
     90                                'expected' => '<div class="notice notice-info"><p>An "info" notice.</p></div>',
    9691                        ),
    9792                        'a type that already starts with "notice-"' => array(
    … …  
    10095                                        'type' => 'notice-info',
    10196                                ),
    102                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-notice-info"><p>A type that already starts with "notice-".</p></div>',
     97                                'expected' => '<div class="notice notice-notice-info"><p>A type that already starts with "notice-".</p></div>',
    10398                        ),
    10499                        'a dismissible notice'                      => array(
    … …  
    107102                                        'dismissible' => true,
    108103                                ),
    109                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice is-dismissible"><p>A dismissible notice.</p></div>',
     104                                'expected' => '<div class="notice is-dismissible"><p>A dismissible notice.</p></div>',
    110105                        ),
    111106                        'no type and an ID'                         => array(
    … …  
    114109                                        'id' => 'message',
    115110                                ),
    116                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice"><p>A notice with an ID.</p></div>',
     111                                'expected' => '<div id="message" class="notice"><p>A notice with an ID.</p></div>',
    117112                        ),
    118113                        'a type and an ID'                          => array(
    … …  
    122117                                        'id'   => 'message',
    123118                                ),
    124                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice notice-warning"><p>A warning notice with an ID.</p></div>',
     119                                'expected' => '<div id="message" class="notice notice-warning"><p>A warning notice with an ID.</p></div>',
    125120                        ),
    126121                        'no type and additional classes'            => array(
    … …  
    129124                                        'additional_classes' => array( 'error', 'notice-alt' ),
    130125                                ),
    131                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice error notice-alt"><p>A notice with additional classes.</p></div>',
     126                                'expected' => '<div class="notice error notice-alt"><p>A notice with additional classes.</p></div>',
    132127                        ),
    133128                        'a type and additional classes'             => array(
    … …  
    137132                                        'additional_classes' => array( 'error', 'notice-alt' ),
    138133                                ),
    139                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-warning error notice-alt"><p>A warning notice with additional classes.</p></div>',
     134                                'expected' => '<div class="notice notice-warning error notice-alt"><p>A warning notice with additional classes.</p></div>',
    140135                        ),
    141136                        'a dismissible notice with a type and additional classes' => array(
    … …  
    146141                                        'additional_classes' => array( 'error', 'notice-alt' ),
    147142                                ),
    148                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-warning is-dismissible error notice-alt"><p>A dismissible warning notice with a type and additional classes.</p></div>',
     143                                'expected' => '<div class="notice notice-warning is-dismissible error notice-alt"><p>A dismissible warning notice with a type and additional classes.</p></div>',
    149144                        ),
    150145                        'a notice without paragraph wrapping'       => array(
    … …  
    153148                                        'paragraph_wrap' => false,
    154149                                ),
    155                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><span>A notice without paragraph wrapping.</span></div>',
     150                                'expected' => '<div class="notice"><span>A notice without paragraph wrapping.</span></div>',
    156151                        ),
    157152                        'an unsafe type'                            => array(
    … …  
    160155                                        'type' => '"><script>alert("Howdy,admin!");</script>',
    161156                                ),
    162                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-&quot;><script>alert(&quot;Howdy,admin!&quot;);</script>"><p>A notice with an unsafe type.</p></div>',
     157                                'expected' => '<div class="notice notice-&quot;><script>alert(&quot;Howdy,admin!&quot;);</script>"><p>A notice with an unsafe type.</p></div>',
    163158                        ),
    164159                        'an unsafe ID'                              => array(
    … …  
    167162                                        'id' => '"><script>alert( "Howdy, admin!" );</script> <div class="notice',
    168163                                ),
    169                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="&quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice" class="notice"><p>A notice with an unsafe ID.</p></div>',
     164                                'expected' => '<div id="&quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice" class="notice"><p>A notice with an unsafe ID.</p></div>',
    170165                        ),
    171166                        'unsafe additional classes'                 => array(
    … …  
    174169                                        'additional_classes' => array( '"><script>alert( "Howdy, admin!" );</script> <div class="notice' ),
    175170                                ),
    176                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice &quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice"><p>A notice with unsafe additional classes.</p></div>',
     171                                'expected' => '<div class="notice &quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice"><p>A notice with unsafe additional classes.</p></div>',
    177172                        ),
    178173                        'a type that is not a string'               => array(
    … …  
    181176                                        'type' => array(),
    182177                                ),
    183                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with a type that is not a string.</p></div>',
     178                                'expected' => '<div class="notice"><p>A notice with a type that is not a string.</p></div>',
    184179                        ),
    185180                        'a type with only empty space'              => array(
    … …  
    188183                                        'type' => " \t\r\n",
    189184                                ),
    190                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with a type with only empty space.</p></div>',
     185                                'expected' => '<div class="notice"><p>A notice with a type with only empty space.</p></div>',
    191186                        ),
    192187                        'an ID that is not a string'                => array(
    … …  
    195190                                        'id' => array( 'message' ),
    196191                                ),
    197                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with an ID that is not a string.</p></div>',
     192                                'expected' => '<div class="notice"><p>A notice with an ID that is not a string.</p></div>',
    198193                        ),
    199194                        'an ID with only empty space'               => array(
    … …  
    202197                                        'id' => " \t\r\n",
    203198                                ),
    204                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with an ID with only empty space.</p></div>',
     199                                'expected' => '<div class="notice"><p>A notice with an ID with only empty space.</p></div>',
    205200                        ),
    206201                        'dismissible as a truthy value rather than (bool) true' => array(
    … …  
    209204                                        'dismissible' => 1,
    210205                                ),
    211                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with dismissible as a truthy value rather than (bool) true.</p></div>',
     206                                'expected' => '<div class="notice"><p>A notice with dismissible as a truthy value rather than (bool) true.</p></div>',
    212207                        ),
    213208                        'additional classes that are not an array'  => array(
    … …  
    216211                                        'additional_classes' => 'class-1 class-2 class-3',
    217212                                ),
    218                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with additional classes that are not an array.</p></div>',
     213                                'expected' => '<div class="notice"><p>A notice with additional classes that are not an array.</p></div>',
    219214                        ),
    220215                        'additional attribute with a value'         => array(
    … …  
    223218                                        'attributes' => array( 'aria-live' => 'assertive' ),
    224219                                ),
    225                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" aria-live="assertive"><p>A notice with an additional attribute with a value.</p></div>',
     220                                'expected' => '<div class="notice" aria-live="assertive"><p>A notice with an additional attribute with a value.</p></div>',
    226221                        ),
    227222                        'additional hidden attribute'               => array(
    … …  
    230225                                        'attributes' => array( 'hidden' => true ),
    231226                                ),
    232                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" hidden><p>A notice with the hidden attribute.</p></div>',
     227                                'expected' => '<div class="notice" hidden><p>A notice with the hidden attribute.</p></div>',
    233228                        ),
    234229                        'additional attribute no associative keys'  => array(
    … …  
    237232                                        'attributes' => array( 'hidden' ),
    238233                                ),
    239                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" hidden><p>A notice with a boolean attribute without an associative key.</p></div>',
     234                                'expected' => '<div class="notice" hidden><p>A notice with a boolean attribute without an associative key.</p></div>',
    240235                        ),
    241236                        'additional attribute with role'            => array(
    … …  
    244239                                        'attributes' => array( 'role' => 'alert' ),
    245240                                ),
    246                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" role="alert"><p>A notice with an additional attribute role.</p></div>',
     241                                'expected' => '<div class="notice" role="alert"><p>A notice with an additional attribute role.</p></div>',
    247242                        ),
    248243                        'multiple additional attributes'            => array(
    … …  
    254249                                        ),
    255250                                ),
    256                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" role="alert" data-test="-1"><p>A notice with multiple additional attributes.</p></div>',
     251                                'expected' => '<div class="notice" role="alert" data-test="-1"><p>A notice with multiple additional attributes.</p></div>',
    257252                        ),
    258253                        'data attribute with unsafe value'          => array(
    … …  
    261256                                        'attributes' => array( 'data-unsafe' => '<script>alert( "Howdy, admin!" );</script>' ),
    262257                                ),
    263                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" data-unsafe="&lt;script&gt;alert( &quot;Howdy, admin!&quot; );&lt;/script&gt;"><p>A notice with an additional attribute with an unsafe value.</p></div>',
     258                                'expected' => '<div class="notice" data-unsafe="&lt;script&gt;alert( &quot;Howdy, admin!&quot; );&lt;/script&gt;"><p>A notice with an additional attribute with an unsafe value.</p></div>',
    264259                        ),
    265260                        'additional invalid attribute'              => array(
    … …  
    268263                                        'attributes' => array( 'not-valid' => 'not-valid' ),
    269264                                ),
    270                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with an additional attribute that is invalid.</p></div>',
     265                                'expected' => '<div class="notice"><p>A notice with an additional attribute that is invalid.</p></div>',
    271266                        ),
    272267                        'multiple attributes with "role", invalid, data-*, numeric, and boolean' => array(
    … …  
    281276                                        ),
    282277                                ),
    283                                 'expected' => '<div id="wp-admin-notice-%%ID%%" class="notice" role="alert" data-name="my-name" data-id="1" hidden><p>A notice with multiple attributes with "role", invalid, "data-*", numeric, and boolean.</p></div>',
     278                                'expected' => '<div class="notice" role="alert" data-name="my-name" data-id="1" hidden><p>A notice with multiple attributes with "role", invalid, "data-*", numeric, and boolean.</p></div>',
    284279                        ),
    285280                        'paragraph wrapping as a falsy value rather than (bool) false' => array(
    … …  
    288283                                        'paragraph_wrap' => 0,
    289284                                ),
    290                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with paragraph wrapping as a falsy value rather than (bool) false.</p></div>',
     285                                'expected' => '<div class="notice"><p>A notice with paragraph wrapping as a falsy value rather than (bool) false.</p></div>',
    291286                        ),
    292287                );
    … …  
    301296         */
    302297        public function test_should_throw_doing_it_wrong_with_a_type_containing_spaces() {
    303                 $next_id = array_last( explode( '-', wp_unique_prefixed_id( 'wp-admin-notice-' ) ) );
    304                 ++$next_id;
    305 
    306298                ob_start();
    307299                wp_admin_notice(
    … …  
    312304
    313305                $this->assertSame(
    314                         '<div class="notice notice-first second third fourth" data-id="wp-admin-notice-' . $next_id . '" id="wp-admin-notice-' . $next_id . '"><p>A type containing spaces.</p></div>',
     306                        '<div class="notice notice-first second third fourth"><p>A type containing spaces.</p></div>',
    315307                        $actual
    316308                );
  • trunk/tests/phpunit/tests/functions/wpGetAdminNotice.php

    r64282 r64347  
    2222         */
    2323        public function test_should_return_admin_notice( $message, $args, $expected ) {
    24                 // Replace placeholder %%ID%% in expected string, required for test isolation.
    25                 $next_id = array_last( explode( '-', wp_unique_prefixed_id( 'wp-admin-notice-' ) ) );
    26                 ++$next_id;
    27                 $expected = str_replace( '%%ID%%', $next_id, $expected );
    28 
    2924                $this->assertEqualHTML( $expected, wp_get_admin_notice( $message, $args ) );
    3025        }
    … …  
    4035                                'message'  => 'A notice with defaults.',
    4136                                'args'     => array(),
    42                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with defaults.</p></div>',
     37                                'expected' => '<div class="notice"><p>A notice with defaults.</p></div>',
    4338                        ),
    4439                        'an empty message (used for templates)'     => array(
    … …  
    5045                                        'additional_classes' => array( 'inline', 'hidden' ),
    5146                                ),
    52                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice notice-error is-dismissible inline hidden"><p></p></div>',
     47                                'expected' => '<div id="message" class="notice notice-error is-dismissible inline hidden"><p></p></div>',
    5348                        ),
    5449                        'an empty message (used for templates) without paragraph wrapping' => array(
    … …  
    6156                                        'paragraph_wrap'     => false,
    6257                                ),
    63                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice notice-error is-dismissible inline hidden"></div>',
     58                                'expected' => '<div id="message" class="notice notice-error is-dismissible inline hidden"></div>',
    6459                        ),
    6560                        'an "error" notice'                         => array(
    … …  
    6863                                        'type' => 'error',
    6964                                ),
    70                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-error"><p>An "error" notice.</p></div>',
     65                                'expected' => '<div class="notice notice-error"><p>An "error" notice.</p></div>',
    7166                        ),
    7267                        'a "success" notice'                        => array(
    … …  
    7570                                        'type' => 'success',
    7671                                ),
    77                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-success"><p>A "success" notice.</p></div>',
     72                                'expected' => '<div class="notice notice-success"><p>A "success" notice.</p></div>',
    7873                        ),
    7974                        'a "warning" notice'                        => array(
    … …  
    8277                                        'type' => 'warning',
    8378                                ),
    84                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-warning"><p>A "warning" notice.</p></div>',
     79                                'expected' => '<div class="notice notice-warning"><p>A "warning" notice.</p></div>',
    8580                        ),
    8681                        'an "info" notice'                          => array(
    … …  
    8984                                        'type' => 'info',
    9085                                ),
    91                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-info"><p>An "info" notice.</p></div>',
     86                                'expected' => '<div class="notice notice-info"><p>An "info" notice.</p></div>',
    9287                        ),
    9388                        'a type that already starts with "notice-"' => array(
    … …  
    9691                                        'type' => 'notice-info',
    9792                                ),
    98                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-notice-info"><p>A type that already starts with "notice-".</p></div>',
     93                                'expected' => '<div class="notice notice-notice-info"><p>A type that already starts with "notice-".</p></div>',
    9994                        ),
    10095                        'a dismissible notice'                      => array(
    … …  
    10398                                        'dismissible' => true,
    10499                                ),
    105                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice is-dismissible"><p>A dismissible notice.</p></div>',
     100                                'expected' => '<div class="notice is-dismissible"><p>A dismissible notice.</p></div>',
    106101                        ),
    107102                        'no type and an ID'                         => array(
    … …  
    110105                                        'id' => 'message',
    111106                                ),
    112                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice"><p>A notice with an ID.</p></div>',
     107                                'expected' => '<div id="message" class="notice"><p>A notice with an ID.</p></div>',
    113108                        ),
    114109                        'a type and an ID'                          => array(
    … …  
    118113                                        'id'   => 'message',
    119114                                ),
    120                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="message" class="notice notice-warning"><p>A warning notice with an ID.</p></div>',
     115                                'expected' => '<div id="message" class="notice notice-warning"><p>A warning notice with an ID.</p></div>',
    121116                        ),
    122117                        'no type and additional classes'            => array(
    … …  
    125120                                        'additional_classes' => array( 'error', 'notice-alt' ),
    126121                                ),
    127                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice error notice-alt"><p>A notice with additional classes.</p></div>',
     122                                'expected' => '<div class="notice error notice-alt"><p>A notice with additional classes.</p></div>',
    128123                        ),
    129124                        'a type and additional classes'             => array(
    … …  
    133128                                        'additional_classes' => array( 'error', 'notice-alt' ),
    134129                                ),
    135                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-warning error notice-alt"><p>A warning notice with additional classes.</p></div>',
     130                                'expected' => '<div class="notice notice-warning error notice-alt"><p>A warning notice with additional classes.</p></div>',
    136131                        ),
    137132                        'a dismissible notice with a type and additional classes' => array(
    … …  
    142137                                        'additional_classes' => array( 'error', 'notice-alt' ),
    143138                                ),
    144                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-warning is-dismissible error notice-alt"><p>A dismissible warning notice with a type and additional classes.</p></div>',
     139                                'expected' => '<div class="notice notice-warning is-dismissible error notice-alt"><p>A dismissible warning notice with a type and additional classes.</p></div>',
    145140                        ),
    146141                        'a notice without paragraph wrapping'       => array(
    … …  
    149144                                        'paragraph_wrap' => false,
    150145                                ),
    151                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><span>A notice without paragraph wrapping.</span></div>',
     146                                'expected' => '<div class="notice"><span>A notice without paragraph wrapping.</span></div>',
    152147                        ),
    153148                        'an unsafe type'                            => array(
    … …  
    156151                                        'type' => '"><script>alert("Howdy,admin!");</script>',
    157152                                ),
    158                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice notice-&quot;><script>alert(&quot;Howdy,admin!&quot;);</script>"><p>A notice with an unsafe type.</p></div>',
     153                                'expected' => '<div class="notice notice-&quot;><script>alert(&quot;Howdy,admin!&quot;);</script>"><p>A notice with an unsafe type.</p></div>',
    159154                        ),
    160155                        'an unsafe ID'                              => array(
    … …  
    163158                                        'id' => '"><script>alert( "Howdy, admin!" );</script> <div class="notice',
    164159                                ),
    165                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="&quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice" class="notice"><p>A notice with an unsafe ID.</p></div>',
     160                                'expected' => '<div id="&quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice" class="notice"><p>A notice with an unsafe ID.</p></div>',
    166161                        ),
    167162                        'unsafe additional classes'                 => array(
    … …  
    170165                                        'additional_classes' => array( '"><script>alert( "Howdy, admin!" );</script> <div class="notice' ),
    171166                                ),
    172                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice &quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice"><p>A notice with unsafe additional classes.</p></div>',
     167                                'expected' => '<div class="notice &quot;><script>alert( &quot;Howdy, admin!&quot; );</script> <div class=&quot;notice"><p>A notice with unsafe additional classes.</p></div>',
    173168                        ),
    174169                        'a type that is not a string'               => array(
    … …  
    177172                                        'type' => array(),
    178173                                ),
    179                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with a type that is not a string.</p></div>',
     174                                'expected' => '<div class="notice"><p>A notice with a type that is not a string.</p></div>',
    180175                        ),
    181176                        'a type with only empty space'              => array(
    … …  
    184179                                        'type' => " \t\r\n",
    185180                                ),
    186                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with a type with only empty space.</p></div>',
     181                                'expected' => '<div class="notice"><p>A notice with a type with only empty space.</p></div>',
    187182                        ),
    188183                        'an ID that is not a string'                => array(
    … …  
    191186                                        'id' => array( 'message' ),
    192187                                ),
    193                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with an ID that is not a string.</p></div>',
     188                                'expected' => '<div class="notice"><p>A notice with an ID that is not a string.</p></div>',
    194189                        ),
    195190                        'an ID with only empty space'               => array(
    … …  
    198193                                        'id' => " \t\r\n",
    199194                                ),
    200                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with an ID with only empty space.</p></div>',
     195                                'expected' => '<div class="notice"><p>A notice with an ID with only empty space.</p></div>',
    201196                        ),
    202197                        'dismissible as a truthy value rather than (bool) true' => array(
    … …  
    205200                                        'dismissible' => 1,
    206201                                ),
    207                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with dismissible as a truthy value rather than (bool) true.</p></div>',
     202                                'expected' => '<div class="notice"><p>A notice with dismissible as a truthy value rather than (bool) true.</p></div>',
    208203                        ),
    209204                        'additional classes that are not an array'  => array(
    … …  
    212207                                        'additional_classes' => 'class-1 class-2 class-3',
    213208                                ),
    214                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with additional classes that are not an array.</p></div>',
     209                                'expected' => '<div class="notice"><p>A notice with additional classes that are not an array.</p></div>',
    215210                        ),
    216211                        'additional attribute with a value'         => array(
    … …  
    219214                                        'attributes' => array( 'aria-live' => 'assertive' ),
    220215                                ),
    221                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" aria-live="assertive"><p>A notice with an additional attribute with a value.</p></div>',
     216                                'expected' => '<div class="notice" aria-live="assertive"><p>A notice with an additional attribute with a value.</p></div>',
    222217                        ),
    223218                        'additional hidden attribute'               => array(
    … …  
    226221                                        'attributes' => array( 'hidden' => true ),
    227222                                ),
    228                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" hidden><p>A notice with the hidden attribute.</p></div>',
     223                                'expected' => '<div class="notice" hidden><p>A notice with the hidden attribute.</p></div>',
    229224                        ),
    230225                        'additional attribute no associative keys'  => array(
    … …  
    233228                                        'attributes' => array( 'hidden' ),
    234229                                ),
    235                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" hidden><p>A notice with a boolean attribute without an associative key.</p></div>',
     230                                'expected' => '<div class="notice" hidden><p>A notice with a boolean attribute without an associative key.</p></div>',
    236231                        ),
    237232                        'additional attribute with role'            => array(
    … …  
    240235                                        'attributes' => array( 'role' => 'alert' ),
    241236                                ),
    242                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" role="alert"><p>A notice with an additional attribute role.</p></div>',
     237                                'expected' => '<div class="notice" role="alert"><p>A notice with an additional attribute role.</p></div>',
    243238                        ),
    244239                        'multiple additional attributes'            => array(
    … …  
    250245                                        ),
    251246                                ),
    252                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" role="alert" data-test="-1"><p>A notice with multiple additional attributes.</p></div>',
     247                                'expected' => '<div class="notice" role="alert" data-test="-1"><p>A notice with multiple additional attributes.</p></div>',
    253248                        ),
    254249                        'data attribute with unsafe value'          => array(
    … …  
    257252                                        'attributes' => array( 'data-unsafe' => '<script>alert( "Howdy, admin!" );</script>' ),
    258253                                ),
    259                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice" data-unsafe="&lt;script&gt;alert( &quot;Howdy, admin!&quot; );&lt;/script&gt;"><p>A notice with an additional attribute with an unsafe value.</p></div>',
     254                                'expected' => '<div class="notice" data-unsafe="&lt;script&gt;alert( &quot;Howdy, admin!&quot; );&lt;/script&gt;"><p>A notice with an additional attribute with an unsafe value.</p></div>',
    260255                        ),
    261256                        'multiple attributes with "role", invalid, data-*, numeric, and boolean' => array(
    … …  
    270265                                        ),
    271266                                ),
    272                                 'expected' => '<div id="wp-admin-notice-%%ID%%" class="notice" role="alert" disabled="disabled" data-name="my-name" data-id="1" hidden><p>A notice with multiple attributes with "role", invalid, "data-*", numeric, and boolean.</p></div>',
     267                                'expected' => '<div class="notice" role="alert" disabled="disabled" data-name="my-name" data-id="1" hidden><p>A notice with multiple attributes with "role", invalid, "data-*", numeric, and boolean.</p></div>',
    273268                        ),
    274269                        'paragraph wrapping as a falsy value rather than (bool) false' => array(
    … …  
    277272                                        'paragraph_wrap' => 0,
    278273                                ),
    279                                 'expected' => '<div data-id="wp-admin-notice-%%ID%%" id="wp-admin-notice-%%ID%%" class="notice"><p>A notice with paragraph wrapping as a falsy value rather than (bool) false.</p></div>',
     274                                'expected' => '<div class="notice"><p>A notice with paragraph wrapping as a falsy value rather than (bool) false.</p></div>',
    280275                        ),
    281276                );
    … …  
    291286         */
    292287        public function test_should_throw_doing_it_wrong_with_a_type_containing_spaces() {
    293                 // Replace placeholder %%ID%% in expected string, required for test isolation.
    294                 $expected = '<div class="notice notice-first second third fourth" id="wp-admin-notice-%%ID%%" data-id="wp-admin-notice-%%ID%%"><p>A type containing spaces.</p></div>';
    295                 $next_id  = array_last( explode( '-', wp_unique_prefixed_id( 'wp-admin-notice-' ) ) );
    296                 ++$next_id;
    297                 $expected = str_replace( '%%ID%%', $next_id, $expected );
    298 
    299                 $this->assertEqualHTML(
    300                         $expected,
     288                $this->assertSame(
     289                        '<div class="notice notice-first second third fourth"><p>A type containing spaces.</p></div>',
    301290                        wp_get_admin_notice(
    302291                                'A type containing spaces.',
Note: See TracChangeset for help on using the changeset viewer.