[wp-trac] [WordPress Trac] #65288: Use the semantic HTML <search> element in core search markup

WordPress Trac noreply at wordpress.org
Thu May 21 01:29:12 UTC 2026


#65288: Use the semantic HTML <search> element in core search markup
----------------------------------------+-----------------------------
 Reporter:  adamsilverstein             |      Owner:  (none)
     Type:  enhancement                 |     Status:  new
 Priority:  normal                      |  Milestone:  Awaiting Review
Component:  General                     |    Version:  trunk
 Severity:  normal                      |   Keywords:  needs-patch
  Focuses:  accessibility, performance  |
----------------------------------------+-----------------------------
 == Summary ==

 The HTML [https://developer.mozilla.org/en-
 US/docs/Web/HTML/Reference/Elements/search <search>] element is now part
 of [https://web.dev/baseline Baseline] and is supported in all evergreen
 browsers (Chrome 118+, Firefox 118+, Safari 17+, Edge 118+). It is a
 semantic landmark element that represents a group of search/filtering
 controls and has an implicit ARIA role of search.

 WordPress currently produces search markup by adding role="search" to the
 surrounding <form> in several places:

 get_search_form() in wp-includes/general-template.php (both the html5 and
 xhtml formats).
 The core/search block render callback in wp-includes/blocks/search.php.
 Bundled classic themes that override searchform.php (Twenty Sixteen,
 Twenty Seventeen, Twenty Twenty, Twenty Twenty-One).
 This ticket proposes updating core search markup and bundled themes to use
 the native <search> element, which removes the need for the explicit
 role="search" attribute and brings WordPress in line with current HTML
 semantics.

 == Background ==

 The <search> element was added to the HTML Living Standard to provide a
 dedicated semantic container for search functionality, similar to how
 <nav> covers navigation and <main> covers primary content. Per the HTML
 spec:

 ''The search element represents a part of a document or application that
 contains a set of form controls or other content related to performing a
 search or filtering operation.''

 Today, the equivalent semantics are conveyed by adding role="search" to
 the surrounding <form>. With the new element widely available, the role
 attribute can be dropped in favor of native markup.

 == Current state in core ==

 wp-includes/general-template.php (get_search_form(), html5 format):

 {{{ #!html

 Search for:
 Search …

 }}}
 wp-includes/blocks/search.php (render_block_core_search()):

 {{{ #!php sprintf( '<form role="search" method="get" action="%1s" %2s
 %3s>%4s', esc_url( home_url( '/' ) ), $wrapper_attributes,
 $form_directives, $label . $field_markup ); }}}

 Bundled themes with their own searchform.php follow the same <form
 role="search"> pattern:

 src/wp-content/themes/twentysixteen/searchform.php
 src/wp-content/themes/twentyseventeen/searchform.php
 src/wp-content/themes/twentytwenty/searchform.php
 src/wp-content/themes/twentytwentyone/searchform.php
 Newer block themes (Twenty Twenty-Two through Twenty Twenty-Five) inherit
 markup from the core/search block and need no theme-level change.

 == Proposal ==

 Wrap each search form in a <search> element and drop the now-redundant
 role="search" attribute on the inner <form>:

 {{{ #!html

 Search for:

 }}}
 For get_search_form(), the optional aria_label argument moves from the
 <form> to the new <search> landmark element, since the landmark is what
 assistive technology exposes.

 The xhtml fallback in get_search_form() is left unchanged because XHTML
 1.x does not include the <search> element.

 Why drop role="search"? Keeping it on the inner <form> while the <search>
 wrapper also carries the implicit search role would produce nested search
 landmarks, which assistive technology may announce twice or report as a
 structural error. The HTML spec's intent is that <search> replaces the
 manual role.

 == Patch ==

 Patch and full test plan in the linked GitHub PR:

 [https://github.com/WordPress/wordpress-develop/pull/11913 wordpress-
 develop#11913] — General: Use the semantic <search> element in core search
 markup
 Two atomic commits:

 General: get_search_form() (html5) + core/search block.
 Bundled Themes: Twenty Sixteen, Twenty Seventeen, Twenty Twenty, Twenty
 Twenty-One searchform.php.
 == Backward compatibility ==

 The <form> element, its class="search-form", and all input markup are
 unchanged. Theme CSS targeting form.search-form or .wp-block-search
 continues to work.
 For the core/search block, block wrapper attributes (block class names,
 user-added classes) and Interactivity API directives remain on the <form>
 to preserve block CSS, hydration boundaries, and event handling.
 Browsers that pre-date <search> support treat it as a generic inline
 container with no landmark role. Forms still function and remain
 accessible via the <form> itself; the only loss is the explicit landmark
 announcement, which is no worse than the current state where role="search"
 is unsupported.
 Custom themes that override searchform.php are unaffected; this change
 only touches core defaults and bundled classic themes.
 The get_search_form and search_form_format filters continue to operate on
 the final HTML.
 == Accessibility ==

 <search> has the implicit ARIA role search, replacing the manual
 role="search".
 Screen readers that already announce the search landmark will continue to
 do so via the native element on supporting UAs.
 The aria_label argument now labels the <search> landmark directly, which
 is the standard pattern for distinguishing multiple search landmarks on
 the same page.
 == Tasks ==

  Patch get_search_form() (html5 format).
  Patch render_block_core_search().
  Patch bundled classic themes (Sixteen, Seventeen, Twenty, Twenty-One).
  Audit Twenty Twenty-Two through Twenty Twenty-Five for any inline search
 markup outside core/search.
  Update unit and E2E tests if any assert on role="search" markup (initial
 scan found none).
  Update developer documentation referencing <form role="search">.
  Confirm screen reader behavior across VoiceOver, NVDA, JAWS, and TalkBack
 on the patched markup.
 == Open questions ==

 Should we keep an explicit role="search" attribute on the <search> element
 for assistive technology that doesn't yet map <search> to the search
 landmark role? It would be redundant for compliant UAs but defensive for
 older AT during a transition period.
 Should the core/search block bump its apiVersion or expose a version flag
 so theme/block consumers can detect the markup change?
 Should the searchform.php change also be backported to Twenty Sixteen /
 Seventeen, given their long support tail, or limited to Twenty Twenty and
 later?
 == References ==

 MDN: [https://developer.mozilla.org/en-
 US/docs/Web/HTML/Reference/Elements/search HTML <search> element]
 HTML spec: [https://html.spec.whatwg.org/multipage/grouping-content.html
 #the-search-element 4.4.14 The search element]
 Baseline: [https://web.dev/baseline <search> is widely available]
 GitHub PR: [https://github.com/WordPress/wordpress-develop/pull/11913
 wordpress-develop#11913]

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/65288>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list