A Week in Core – February 19, 2024

Welcome back to a new issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Let’s take a look at what changed on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. between February 12 and February 19, 2024.

  • 23 commits
  • 43 contributors
  • 81 tickets created
  • 13 tickets reopened
  • 88 tickets closed

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers are based on the Trac timeline for the period above. The following is a summary of commits, organized by component and/or focus.

Code changes

Build/Test Tools

  • Ignore src/wp-content/fonts from version controlversion control A version control system keeps track of the source code and revisions to the source code. WordPress uses Subversion (SVN) for version control, with Git mirrors for most repositories.#60337
  • Remove more unnecessary direct dependencies – #59658
  • Remove unnecessary direct dependencies – #59658
  • Update several dependencies – #59658
  • Use assertSame() in WP_Query tests involving ::$max_num_pages property – #58683, #59655
  • Use assertSame() in get_comment_pages_count() tests – #58683, #59655

Bundled Themes

  • Twenty Nineteen: Update selectors used to change the primary color in the CustomizerCustomizer Tool built into WordPress core that hooks into most modern themes. You can use it to preview and modify many of your site’s appearance settings.#59922
  • Twenty Twenty-Four: Increase the color contrast of the Ember style variation – #60459
  • Support pullquote blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. typography options in Twenty Twenty-One – #57854

Canonical

  • Limit post types searched by redirect_guess_404_permalink()#59795
  • Rename admin_canonical_url filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. to wp_admin_canonical_url#59545

Coding Standards

  • Allow $newlineEscape parameter in WP_Text_Diff_Renderer_inline::_splitOnWords()#59650

Docs

  • Various improvements and corrections to inline documentation – #59651

Editor

  • Check PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 5.6.20 or higher 8.1.12 for woff/woff2 mime types in WP_Font_Utils – 60536
  • Merge uses_context defined by block bindings sources with block types – #60525
  • Prevent PHP warning when parsing duotone hue values – #59496
  • Interactivity APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.: Skip instead of bail out if HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. contains SVG or MATH#60517
  • Interactivity API: Use string instead of object in data-wp-interactive attribute – #60542, #60356

General

  • Consistently cast return value to int in functions that use ceil()#58683
  • Further improve language in SimplePie code comments – #60247

I18Ni18n Internationalization, or the act of writing and preparing code to be fully translatable into other languages. Also see localization. Often written with a lowercase i so it is not confused with a lowercase L or the numeral 1. Often an acquired skill.

  • Prevent incorrect language dropdown entries when there are .l10n.php files – #59656, #60553

Media

  • Replace media icon images with SVG – #31352

REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/.

  • Clarify documentation for methods and filters relating to REST API search endpoints – #59651

Props

Thanks to the 43 people who contributed to WordPress Core on Trac: @costdev (3), @shailu25 (3), @gziolo (3), @poena (3), @huzaifaalmesbah (3), @peterwilsoncc (2), @cbravobernal (2), @swissspidy (2), @sabernhardt (2), @jacobcassidy (1), @rahmohn (1), @mukesh27 (1), @westonruter (1), @dmsnell (1), @crstauf (1), @audrasjb (1), @manfcarlo (1), @francescocarlucci (1), @rajinsharwar (1), @Anlino (1), @richtabor (1), @itpathsolutions (1), @santosguillamot (1), @czapla (1), @thekt12 (1), @ironprogrammer (1), @afercia (1), @iseulde (1), @melchoyce (1), @joemcgill (1), @wonderboymusic (1), @ocean90 (1), @karmatosed (1), @boemedia (1), @bosskhj (1), @joedolson (1), @faisal03 (1), @ashikur698 (1), @kafleg (1), @hellofromTonya (1), @darshitrajyaguru97 (1), @harshgajipara (1), and @skyakash12 (1).

Congrats and welcome to our 3 new contributors of the week: @jacobcassidy, @francescocarlucci, @skyakash12 ♥️

Core committers: @swissspidy (8), @sergeybiryukov (5), @desrosj (3), @johnbillion (2), @hellofromtonya (2), @peterwilsoncc (1), @gziolo (1), and @joedolson (1).

#6-5, #core, #week-in-core

A Week in Core – February 12, 2024

Welcome back to a new issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Let’s take a look at what changed on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. between February 5 and February 12, 2024.

  • 71 commits
  • 245 contributors
  • 82 tickets created
  • 11 tickets reopened
  • 82 tickets closed

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers are based on the Trac timeline for the period above. The following is a summary of commits, organized by component and/or focus.

Code changes

Administration

  • Improve contrast and consistency of focus styles – #51870

Bundled Themes

  • Twenty Fifteen: Add top margin to the File blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. button styles – #58498
  • Twenty Nineteen: Add border-radius to avatarAvatar An avatar is an image or illustration that specifically refers to a character that represents an online user. It’s usually a square box that appears next to the user’s name. images in the editor – #59285
  • Twenty Nineteen: Correct line height for Button block – #58443
  • Twenty Nineteen: Restore transition property to a single line – #58443
  • Twenty Sixteen: Add border-radius to avatar images in the editor – #59253
  • Twenty Twenty-Four: Add missing translationtranslation The process (or result) of changing text, words, and display formatting to support another language. Also see localization, internationalization. functions to text strings – #60298
  • Twenty Twenty-Four: Prefix the block pattern categoryCategory The 'category' taxonomy lets you group posts / content together that share a common bond. Categories are pre-defined and broad ranging. name – #59839
  • Twenty Twenty-Three: Include Latin-extended characters in DM Sans font files – #59008
  • Twenty Twenty-Two: Prefix the pages block pattern category name – #59839
  • Twenty Twenty: Fix Table block default and custom border colors – #58022
  • Twenty Twenty: Scope .privacy-policy styles to the footer only – #60469
  • Improve focus outline in Twenty Twenty-Four – #60334
  • Cast font URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org functions to string for add_editor_style()#59704

Build/Test Tools

  • Fix bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority. pulling local environment containers on Apple silicone – #59930
  • Generate a human-readable HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. coverage report – #60476
  • Make the props bot message shorter – #60417
  • Pin a specific commit for Hosting Test Reporter – #59647
  • Revert [57551]#59647
  • Unpin PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 5.6.20 or higher 7.4 from the test coverage workflow – #59647
  • Adjust the metaMeta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. key time in wp_scheduled_delete() tests – #59938

Canonical

  • Introduce admin_canonical_url filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output.#59545

Coding Standards

  • Add missing fullstop to docblocks in wp-includes/vars.php#41877
  • Replace alias join() in WP_Font_Utils#60473

Editor

  • Add viewScriptModule handling to block.json metadata – #60233
  • Add wakeup magic method to the block bindings registry – #60282
  • Avoid double escaping on value passed for attribute in HTML tagtag A directory in Subversion. WordPress uses tags to store a single snapshot of a version (3.6, 3.6.1, etc.), the common convention of tags in version control systems. (Not to be confused with post tags.) processor
  • Expand Block Bindings for button block – #60481
  • Fix block style variation selector generation – #60453
  • Fix typo in FontUtils doc block – #59166
  • Improve code documentation for block bindings – #60282
  • Introduce WP_Block_Bindings_Source class – #60447
  • Make asset file optional for block scripts – #57234
  • Refactor block binding processing and attribute computation – #60282
  • Register the Google Font collection – #59166
  • Show the patterns page for classic themes – #58827
  • Update PHPDocPHPDoc (docblock, inline docs) for block bindings’s context arg – #59743
  • Update pattern overrides attribute format – #60456
  • Update the WordPress packages to GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses ‘blocks’ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ 17.7RC1 – #60315
  • Block HooksHooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same.: Inject hooked blocks into modified templates and parts – #59646
  • Blocks: Allow reading the script handle from asset files – #60485
  • Interactivity APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.: Integrate Server Directive Processing – #60356
  • Interactivity API: Remove empty file – #60356

Filesystem API

  • Fix typo in ftp_base::restore()#60497

General

  • Add an option to configure the site icon in general settings – #54370, #16434
  • Remove ableist language from code comments – #60247

HTML API

  • Add subclassed has_bookmark() and fix seek() – #60474
  • Join text nodes on invalidinvalid A resolution on the bug tracker (and generally common in software development, sometimes also notabug) that indicates the ticket is not a bug, is a support request, or is generally invalid.-tag-name boundaries – #60385

I18Ni18n Internationalization, or the act of writing and preparing code to be fully translatable into other languages. Also see localization. Often written with a lowercase i so it is not confused with a lowercase L or the numeral 1. Often an acquired skill.

  • Add Translator comments for Planet URLs – #58010

Media

  • Update progress spinner position on small screens – #33049
  • enable control of progressive image output – #21668

Networks and Sites

  • Improve switch_to_blog() docblockdocblock (phpdoc, xref, inline docs)#60332

Permalinks

  • Detect Caddy web server support – #41877

Plugins

  • Store pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party deletion results in temporary option – #59433

Quick/Bulk Edit

  • Pre-fill category fields with their status – #11302

REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/.

  • Add featured_media field to attachments endpoint – #41692
  • Improve error handling in REST meta fields – #48823
  • Introduce the necessary endpoints for the font library – #59166
  • Provide detailed error data in REST API response – #60014

Script Loader

  • Add a timezone offset display value to wp.date.setSettings – #60105
  • Improve translators comments for wp.date.setSettings in compat file – #60412
  • always output core block global styles after base global styles – #60280
  • Add deregister module function – #60463

Shortcodes

  • Always return an array in shortcode_parse_atts()#59249

Themes

  • Add ‘theme_files’ cache group to block pattern cache operations – #60120
  • update add_theme_support docblock – #60221

Toolbar

  • Add adminbar link for new sites in networknetwork (versus site, blog) installs – #41104

Upgrade/Install

  • Avoid update_option() calls during bootstrap – #60461, #60457, #60491
  • Upgrade/Install: Introduce Plugin Dependencies – #22316
  • Micro-optimizations for getting plugin_file in plugins loader loopLoop The Loop is PHP code used by WordPress to display posts. Using The Loop, WordPress processes each post to be displayed on the current page, and formats it according to how it matches specified criteria within The Loop tags. Any HTML or PHP code in the Loop will be processed on each post. https://codex.wordpress.org/The_Loop.#60510
  • Remove unnecessary individual subfiles from $_old_files array – #58995

Users

  • Replace table tags for color palettes in profiles – #53157

Props

Thanks to the 245 (!!) people who contributed to WordPress Core on Trac: @gziolo (14), @mukesh27 (13), @swissspidy (13), @sabernhardt (13), @poena (12), @shailu25 (11), @huzaifaalmesbah (9), @youknowriad (8), @oglekler (7), @joedolson (7), @jorbin (7), @audrasjb (7), @spacedmonkey (6), @SergeyBiryukov (6), @dmsnell (6), @get_dave (6), @hellofromTonya (5), @afercia (5), @kebbet (5), @harshgajipara (5), @johnbillion (5), @costdev (4), @nicolefurlan (4), @jonsurrell (4), @czapla (4), @TimothyBlynJacobs (3), @karmatosed (3), @pbiron (3), @desrosj (3), @afragen (3), @azaozz (3), @luisherranz (3), @dingo_d (2), @mikeschroder (2), @andraganescu (2), @johnjamesjacoby (2), @rajinsharwar (2), @nidhidhandhukiya (2), @cbravobernal (2), @dd32 (2), @wildworks (2), @pooja1210 (2), @wasiur195 (2), @scribu (2), @ajmcfadyen (2), @peterwilsoncc (2), @pitamdey (2), @santosguillamot (2), @isabel_brison (2), @bernhard-reiter (2), @mcsf (2), @ocean90 (2), @aaronrobertshaw (2), @sadpencil (1), @cfinnberg (1), @viliamkopecky (1), @ecc (1), @rcorrales (1), @cvorko (1), @flixos90 (1), @joemcgill (1), @adamsilverstein (1), @_ck_ (1), @markoheijnen (1), @Japh (1), @pmeenan (1), @derekspringer (1), @buley (1), @ericlewis (1), @bahia0019 (1), @born2webdesign (1), @kushang78 (1), @timothyblynjacobs (1), @wonderboymusic (1), @dlh (1), @obenland (1), @jameskoster (1), @kjellr (1), @stacimc (1), @h71 (1), @krupajnanda (1), @jordesign (1), @monzuralam (1), @hrrarya (1), @fnpen (1), @mhshohel (1), @bedas (1), @jeremyfelt (1), @prionkor (1), @matveb (1), @benniledl (1), @jsnajdr (1), @mnydigital (1), @onemaggie (1), @luminuu (1), @pouicpouic (1), @ugyensupport (1), @jivygraphics (1), @sumitbagthariya16 (1), @kkmuffme (1), @talldanwp (1), @dartiss (1), @upadalavipul (1), @manfcarlo (1), @mayur8991 (1), @panchalhimani711 (1), @itpathsolutions (1), @thakordarshil (1), @Ankit-K-Gupta (1), @darshitrajyaguru97 (1), @pavelevap (1), @chasedsiedu (1), @helen (1), @joshcanhelp (1), @ubernaut (1), @Cyberchicken (1), @laumindproductscomau (1), @Marcoevich (1), @tomybyte (1), @thinkluke (1), @virtality-marketing-solutions (1), @Michalooki (1), @itecrs (1), @pannelars (1), @WHSajid (1), @samba45 (1), @Mte90 (1), @tomluckies (1), @soulseekah (1), @francina (1), @webcommsat (1), @balub (1), @sarathar (1), @glendaviesnz (1), @up1512001 (1), @zodiac1978 (1), @davidbinda (1), @westonruter (1), @retrofox (1), @joefusco (1), @colorfultones (1), @acosmin (1), @alh0319 (1), @beafialho (1), @javiercasares (1), @mmaattiiaass (1), @grantmkin (1), @oandregal (1), @ajlende (1), @ahoereth (1), @alanfuller (1), @alexkingorg (1), @amykamala (1), @anonymized_10690803 (1), @apeatling (1), @ashfame (1), @atimmer (1), @aristath (1), @batmoo (1), @beaulebens (1), @blobaugh (1), @bobbingwide (1), @boonebgorges (1), @brianhenryie (1), @chanthaboune (1), @chrisdavidmiles (1), @coolmann (1), @courane01 (1), @danielbachhuber (1), @davidperez (1), @Denis-de-Bernardy (1), @DJPaul (1), @dougal (1), @DrewAPicture (1), @ethitter (1), @filosofo (1), @georgestephanis (1), @giuseppemazzapica-1 (1), @goldenapples (1), @griffinjt (1), @husobj (1), @ideag (1), @jarednova (1), @jbobich (1), @jbrinley (1), @jltallon (1), @johnciacia (1), @joppuyo (1), @jsmoriss (1), @knutsp (1), @kraftbj (1), @kraftner (1), @kurtpayne (1), @lkraav (1), @logikal16 (1), @man4toman (1), @markjaquith (1), @matt (1), @mbijon (1), @megphillips91 (1), @mikeschinkel (1), @mordauk (1), @morehawes (1), @mrwweb (1), @mte90 (1), @mzaweb (1), @nacin (1), @norcross (1), @nvwd (1), @nwjames (1), @obliviousharmony (1), @paaljoachim (1), @pauldewouters (1), @pbaylies (1), @Philipp15b (1), @pogidude (1), @retlehs (1), @rmccue (1), @ryan (1), @sabreuse (1), @sc0ttkclark (1), @sereedmedia (1), @ShaneF (1), @shidouhikari (1), @soean (1), @stephenh1988 (1), @taylorde (1), @tazotodua (1), @threadi (1), @TJNowell (1), @tollmanz (1), @toscho (1), @tropicalista (1), @Viper007Bond (1), @westi (1), @whiteshadow (1), @williamsba1 (1), @wpsmith (1), @ZaneMatthew (1), @noisysocks (1), @kevin940726 (1), and @fabiankaegy (1).

Congrats and welcome to our 28 (!!) new contributors of the week: @sadpencil, @cfinnberg, @viliamkopecky, @ecc, @cvorko, @pmeenan, @derekspringer, @born2webdesign, @kushang78, @hrrarya, @fnpen, @mhshohel, @benniledl, @mnydigital, @up1512001, @alh0319, @anonymized_10690803, @blobaugh, @chrisdavidmiles, @giuseppemazzapica-1, @jltallon, @johnciacia, @logikal16, @pbaylies, @Philipp15b, @pogidude, @tropicalista, @whiteshadow ♥️

Core committers: @gziolo (11), @youknowriad (10), @sergeybiryukov (8), @audrasjb (7), @joedolson (7), @swissspidy (5), @desrosj (5), @spacedmonkey (3), @jorbin (3), @costdev (3), @hellofromtonya (2), @dmsnell (2), @isabel_brison (2), @adamsilverstein (1), @davidbaumwald (1), and @bernhard-reiter (1).

#6-5, #core, #week-in-core

A Week in Core – February 5, 2024

Welcome back to a new issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Let’s take a look at what changed on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. between January 29 and February 5, 2024.

  • 66 commits
  • 117 contributors
  • 79 tickets created
  • 8 tickets reopened
  • 56 tickets closed

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers are based on the Trac timeline for the period above. The following is a summary of commits, organized by component and/or focus.

Code changes

Administration

  • AccessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both “direct access” (i.e. unassisted) and “indirect access” meaning compatibility with a person’s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility): Use the default cursor style for labels and disabled form controls – #59733

Build/Test Tools

  • Introduce Props Bot workflow – #60417
  • Mock pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. response in WP_REST_Plugins_Controller_Test#59647
  • Pass a token to the Codecov action – #59658
  • Some improvements to the Props Bot workflow – #60417
  • Test against MySQLMySQL MySQL is a relational database management system. A database is a structured collection of data where content, configuration and other options are stored. https://www.mysql.com/. 8.3 – #59779
  • Update the codecov/codecov-action action – #59658
  • Update third-party SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/. action – #59805
  • Remove redundant unregister call in blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. bindings tear down – #60282

Bundled Themes

  • Twenty Eleven: Fix typo in twentyeleven_widgets_init() description – #60383
  • Twenty Fifteen: Fix typo in css/blocks.css#60383
  • Twenty Twenty-Three: Rename Comments template part – #56999

Coding Standards

  • Remove unnecessary access and internal annotations from two functions in WP_REST_Templates_Controller – #60358
  • Rename the $ID parameter to $post_id in trackback()#59650
  • Rename the $expires_offset variable in cache_javascript_headers()#59650
  • Update PHPCSPHP Code Sniffer PHP Code Sniffer, a popular tool for analyzing code quality. The WordPress Coding Standards rely on PHPCS. to version 3.8.1 – #60279
  • Use strict comparison for functions lookup in plugin/theme editors – #60415
  • Use strict comparison in wp-admin/update-core.php#58061, #60415

Docs

  • Fix typo in do_robots() docblockdocblock (phpdoc, xref, inline docs)#60405

Editor

  • Add Block Bindings API helpers – #60282
  • Add allowed_blocks field to block registration and REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/.#60403
  • Add viewStyle property to block.json for frontend-only block style – #59673
  • Add deprecated functions from interactivity core blocks – #60380
  • Add registry for block binding sources – #60282
  • Add the Block Bindings API – #60282
  • Fix PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 5.6.20 or higher warning in Layout block support – #60327
  • Fix Theme.jsonJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. font settings in unit testunit test Code written to test a small piece of code or functionality within a larger application. Everything from themes to WordPress core have a series of unit tests. Also see regression.#60341
  • Fix Theme.json font settings unit test – #60341
  • Refactor the way block bindings sources are handled – #60282
  • Remove shadow support via direct attribute – #60377
  • Sanitize nested array in theme.json properly – #60360
  • Update WordPress packages to GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses ‘blocks’ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ 16.7 RC3 – #60315
  • Update the WordPress packages to the Gutenberg 16.7 RC2 version – #60315
  • Update the minimum compatible version of Gutenberg – #60315
  • fix small typos in block bindings API docblocks – #60282, #60386
  • introduce dimensions.aspectRatio block support – #60365
  • reduce specificity of block style variation selector – #60312

General

  • Add tests for array_is_list polyfill added in r57337#55105

HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. API

  • Fix CDATA lookalike matching invalidinvalid A resolution on the bug tracker (and generally common in software development, sometimes also notabug) that indicates the ticket is not a bug, is a support request, or is generally invalid. CDATA – #60406
  • Fix splitting single text node – #60385
  • Fix typo setting the wrong self-closing flag
  • Fix void tagtag A directory in Subversion. WordPress uses tags to store a single snapshot of a version (3.6, 3.6.1, etc.), the common convention of tags in version control systems. (Not to be confused with post tags.) nesting with next_token – #60382
  • Reset parser state after seeking to bookmark – #60428
  • Test cleanup – #59647

HTTPHTTP HTTP is an acronym for Hyper Text Transfer Protocol. HTTP is the underlying protocol used by the World Wide Web and this protocol defines how messages are formatted and transmitted, and what actions Web servers and browsers should take in response to various commands. API

  • Ensure cookie names are cast to strings – #58566

I18Ni18n Internationalization, or the act of writing and preparing code to be fully translatable into other languages. Also see localization. Often written with a lowercase i so it is not confused with a lowercase L or the numeral 1. Often an acquired skill.

  • Add missing space after foreach keyword – #59656
  • Add type declaration to new method missed in [57518]#59656
  • Delete .l10n.php files when deleting a theme – #59656
  • Ensure .l10n.php files are deleted when upgrading language packs – #59656
  • Fix plural forms parsing in WP_Translation_File#59656
  • Improve singular lookup of pluralized strings – #59656
  • Improve singular lookup of pluralized strings – #59656
  • Load new translationtranslation The process (or result) of changing text, words, and display formatting to support another language. Also see localization, internationalization. library in wp_load_translations_early()#59656
  • Revert [57386] pending further investigation – #59656
  • Support loading .l10n.php translation files on their own – #59656

Upgrade/Install

  • When populating options, maybe_serialize instead of always serialize

Media

REST API

  • Add route for single styles revisionsRevisions The WordPress revisions system stores a record of each saved draft or published update. The revision system allows you to see what changes were made in each revision by dragging a slider (or using the Next/Previous buttons). The display indicates what has changed in each revision.#59810
  • Support assigning terms when creating attachments – #57897

Script Loader

  • Remove unused WP_Scripts::get_unaliased_deps() method – #60438
  • Use a global variable in wp_script_modules()#56313
  • Add import map polyfill for older browsers – #60348

Upload

  • Fallback to PclZip to validate ZIP file uploads – #60398
  • Check for and verify ZIP archives

Props

Thanks to the 117 (!) people who contributed to WordPress Core on Trac: @mukesh27 (12), @swissspidy (11), @gziolo (7), @peterwilsoncc (6), @jonsurrell (6), @costdev (5), @jorbin (5), @dmsnell (4), @youknowriad (4), @santosguillamot (4), @desrosj (4), @talldanwp (4), @czapla (4), @luisherranz (4), @azaozz (3), @joemcgill (3), @lgladdy (3), @sc0ttkclark (3), @artemiosans (3), @fabiankaegy (3), @shailu25 (3), @cbravobernal (3), @get_dave (3), @jeffpaul (2), @johnbillion (2), @kevin940726 (2), @joedolson (2), @dharm1025 (2), @harshgajipara (2), @isabel_brison (2), @audunmb (1), @britner (1), @cdevroe (1), @colorful-tones (1), @courane01 (1), @endymion00 (1), @feastdesignco (1), @halounsbury (1), @jsandtro (1), @karinclimber (1), @kevincoleman (1), @koesper (1), @maartenbelmans (1), @mathewemoore (1), @melcarthus (1), @mujuonly (1), @nerdpressteam (1), @olegfuture (1), @otto42 (1), @room34 (1), @sayful (1), @schutzsmith (1), @stephencronin (1), @svitlana41319 (1), @tnolte (1), @tobiasbg (1), @vikram6 (1), @welaunchio (1), @wpfy (1), @viralsampat (1), @adamsilverstein (1), @lukefiretoss (1), @ayeshrajans (1), @navjotjsingh (1), @Tyrannous (1), @jb510 (1), @gregbenz (1), @nickpagz (1), @JavierCasares (1), @yguyon (1), @mamaduka (1), @upadalavipul (1), @jsnajdr (1), @afercia (1), @Chouby (1), @dd32 (1), @pento (1), @noisysocks (1), @chrisdavidmiles (1), @wpscholar (1), @annezazu (1), @chanthaboune (1), @Chrystl (1), @codepo8 (1), @oglekler (1), @nicolefurlan (1), @antpb (1), @syamraj24 (1), @wildworks (1), @madhudollu (1), @westonruter (1), @mikachan (1), @poena (1), @nosilver4u (1), @darssen (1), @kraftbj (1), @engahmeds3ed (1), @barry-hughes (1), @schlessera (1), @aaronrobertshaw (1), @mmaattiiaass (1), @ramonopoly (1), @gaambo (1), @andrewserong (1), @flixos90 (1), @xknown (1), @tykoted (1), @afragen (1), @hellofromtonya (1), @ocean90 (1), @amieiro (1), @Dharm1025 (1), @Ankit-K-Gupta (1), @tanjimtc71 (1), @timothyblynjacobs (1), @spacedmonkey (1), @jrf (1), and @antonvlasenko (1).

Congrats and welcome to our 25 (!!) new contributors of the week: @audunmb, @cdevroe, @endymion00, @feastdesignco, @halounsbury, @kevincoleman, @koesper, @maartenbelmans, @mathewemoore, @melcarthus, @nerdpressteam, @olegfuture, @room34, @sayful, @svitlana41319, @vikram6, @welaunchio, @navjotjsingh, @gregbenz, @nickpagz, @chrisdavidmiles, @codepo8, @nosilver4u, @darssen, @barry-hughes ♥️

Core committers: @swissspidy (18), @youknowriad (11), @sergeybiryukov (7), @gziolo (7), @desrosj (6), @dmsnell (6), @peterwilsoncc (2), @adamsilverstein (2), @isabel_brison (2), @jorbin (2), @afercia (1), @joedolson (1), and @jorgefilipecosta (1).

#6-5, #core, #week-in-core

A Year in Core – 2023

Happy new year, everyone! Here’s some aggregate data for 2023 about WordPress CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. contribution on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress..

Please note:

  • These data only include code contributions to WordPress codebase, not contributions on GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the ‘pull request’ where code changes done in branches by contributors can be reviewed and discussed before being merged be the repository owner. https://github.com/ repositories such as GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses ‘blocks’ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/.
  • The raw data for this post are available on this public spreadsheet. You might find that much easier to read if you have low vision or colorblindness; the graphics below are a snapshot pulled together to include as much information as possible in this blogpost, but they are hard to make accessible to everyone.
  • You can also compare these stats with last year’s data and data from 2021.
  • All the links for the graphics below open a new tab to display them in full size.

General Trac overview

In 2023, the WordPress Core team shipped 2211 commits (2597 in 2022). 2751 tickets were opened, 2545 tickets were closed, and 365 were reopened.

Also, 1079 people contributed to WordPress source code using Trac (988 in 2022), and 472 people made their very first contribution to WordPress Core ♥️ (398 in 2022).

JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecemberTotal
Commits14826517984174246209173250288108872211
Tickets closed1812972181561792592112772392681481122545
Tickets reopened253636192540422935402810365
Tickets created1852342081882082552563102502702121752751
New contributors18912318257451317546128472
Contributors13729515587150279217182295249111931079
This chart shows the number of commits per month in 2023, and the number of closed, reopened and created tickets per month. It also shows the number of contributors per month in 2023. It can be scrolled horizontally.

Check out the Trac timeline in the graphs below:

2023 Core Trac tickets by month (opens in a new tab)
2023 Core commits by month (opens in a new tab)

Here’s how many props and new contributors the Core project had per month. The most prolific months were February and September with 295 contributors each, followed by June and October. 42 of the new contributors received their first props on a commit related to the Twenty Twenty-Four theme.

2023 WordPress Core contributors by month (opens in a new tab)

Components activity

How did 2023’s commits break out by Core Component?

The most prolific components were:

  • Editor with 284 commits (12.8% of all listed commits)
  • Build/Test Tools with 265 commits (12% of all listed commits)
  • Docs with 188 commits (8.5% of all listed commits)
  • Coding Standards with 154 commits (7% of all listed commits)
  • Bundled Themes with 130 commits (5.9% of all listed commits)
  • Then came MediaHelp/About, Code Modernization (which is not an official component), Themes, Administration, General, HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways., Internationalization, REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/. and Upgrade/Install. The other components each had fewer than 30 commits this year.

Contributors data retrieved from WordPress.orgWordPress.org The community site where WordPress code is created and shared by the users. This is where you can download the source code for WordPress core, plugins and themes as well as the central location for community conversations and organization. https://wordpress.org/ profiles

The data below comes from matching contributors’ usernames, as mentioned in Trac props, with their profiles on WordPress.org.

One caveat: this ignores usernames that did not match a profile on dotorg, plus any that had blank or unusable country/company information (“The Universe” or “Unicorn land” are not known countries 🙂).

Contributions by country

The next graph shows the number of props received by country. The top eight countries, based on the number of props received, are these:

  • United States with 2062 contributions (1255 in 2022)
  • Russia with 795 contributions (1152 in 2022)
  • India with 683 contributions (317 in 2022)
  • France with 680 contributions (739 in 2022)
  • Australia with 611 contributions (386 in 2022)
  • United Kingdom with 471 contributions (216 in 2022)
  • Ireland with 403 contributions
  • Bangladesh with 340 contributions (145 in 2022)
Contributions by country (opens in a new tab)

Contributors (people) by country

In 2023, people from at least 62 countries contributed to WordPress Core (57 countries in 2022).

Here are the top eight countries by number of contributors:

  • United States with 164 people (152 in 2022)
  • Bangladesh with 105 people (only 43 in 2022)
  • India with 93 people (77 in 2022)
  • United Kingdom with 31 people (38 in 2022)
  • France with 30 people (22 in 2022)
  • Canada with 25 people (17 in 2022)
  • Germany with 21 people (25 in 2022)
  • Netherlands with 21 people (23 in 2022)
  • Spain with 19 people (12 in 2022)
Contributors by country (opens in a new tab)

Contributions by company

In 2023, people from at least 286 companies contributed to WP Core.

These companies (well, their employees) each contributed to more than 100 commits:

  • Automattic with 1770 contributions (866 in 2022)
  • Yoast with 985 contributions (1452 in 2022)
  • 10up with 904 contributions (501 in 2022)
  • Whodunit with 561 contributions (676 in 2022)
  • Google with 404 contributions (130 in 2022)
  • Bluehost with 238 contributions (226 in 2022)
  • XWP with 224 contributions (14 in 2022)
  • Human Made with 177 contributions (126 in 2022)
  • Advies en zo with 143 contributions (220 in 2022)
  • Dream Encode with 128 contributions (124 in 2022)
  • Emilia Capital with 123 contributions
  • Accessible WD with 120 contributions (53 in 2022)
  • GoDaddy with 111 contributions (42 in 2022)
Contributions by company (opens in a new tab)

Contributors (people) by company

A huge number of companies have only one contributor—or very few contributors. The exceptions are Automattic, with 108 core contributorsCore Contributors Core contributors are those who have worked on a release of WordPress, by creating the functions or finding and patching bugs. These contributions are done through Trac. https://core.trac.wordpress.org. on Trac in 2023, WPDeveloper (39 contributors), 10up with 25 contributors, AuthLab (21 contributors), rtCamp (17 contributors), Awsm (12 contributors), Human Made (12 contributors), Multidots (12 contributors), and Yoast (10 contributors). Only these 9 companies had at least 10 people credited on Trac in 2023.

Contributors by company (opens in a new tab)

What did 2022 hold for Core Committers?

39 Core Committers committed code to the WordPress SVNSVN Subversion, the popular version control system (VCS) by the Apache project, used by WordPress to manage changes to its codebase. repository this year (32 in 2022):

@sergeybiryukov (552), @audrasjb (413), @desrosj (148), @hellofromtonya (134), @joedolson (93), @isabel_brison (88), @spacedmonkey (88), @flixos90 (87), @peterwilsoncc (82), @davidbaumwald (77), @bernhard-reiter (67), @jorbin (44), @johnbillion (43), @joemcgill (39), @swissspidy (30), @azaozz (27), @costdev (25), @westonruter (25), @karmatosed (24), @gziolo (22), @oandregal (15), @ryelle (15), @adamsilverstein (9), @danielbachhuber (9), @jorgefilipecosta (8), @zieladam (7), @kadamwhite (6), @youknowriad (6), @antpb (4), @drewapicture (4), @mikeschroder (4), @afercia (3), @timothyblynjacobs (3), @clorith (2), @dd32 (2), @helen (2), @ocean90 (2), @johnjamesjacoby (1), and @whyisjake (1).

Of the 2211 commits, 555 (25%) were made by people working at Yoast, 413 (19%) from people working at Whodunit, 399 (18%) from employees of Automattic, followed by Google (151 commits), Bluehost (148 commits) and 10up (123 commits).

Core Committers by company (opens in a new tab)

Automattic is the only company with more than 10 active Core Committers, and 12 of them committed code in 2023. Google has 4 people allowed to commit code to WordPress, followed by 10up with 3 Core Committers.

Worth noting that 15 of the 39 active committers come from the US, which represents 38% of the Core Committers squad. Australia, Canada, Italy, Poland and United Kingdom each had 2 committers.

More than 30% of the commits were handled by committers located in the United States, 26% by committers located in Russia, and 19% by committers located in France.

Core Committers by country (opens in a new tab)

Sponsorship

In 2023, 21.6% of the contributors and 23.1% of the committers indicated that a company sponsors their contributions.

Sponsorship of contributors in 2023 (pie chart opens in a new tab)
Sponsorship of committers in 2023 (pie chart opens in a new tab)

Many thanks to @audrasjb for help collecting the 2023 data and for adding several graphics.

#contributions, #contributors, #team-update, #week-in-core, #year-in-core

Two Weeks in Core – September 4, 2023

Welcome back to a new issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Let’s take a look at what changed on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. between August 21 and September 4, 2023.

  • 75 commits
  • 150 contributors (!)
  • 25 new contributors (!)
  • 129 tickets created
  • 13 tickets reopened
  • 117 tickets closed

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers are based on the Trac timeline for the period above. The following is a summary of commits, organized by component and/or focus.

Code changes

Administration

  • Escape post type output as field attribute – #59190

Build/Test Tools

  • Avoid doing copy:dynamic when running grunt watch when using --dev option – #59196
  • Change the version of Node.js in the Codespaces container – #56658
  • Compare results in performance measurement workflow – #58358, #58359
  • Enable running the tests on PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 5.6.20 or higher 8.3 – #59231
  • Ensure database containers are prepared for commands – #30462, #58867
  • Expand database testing to account for all supported versions and types – #30462
  • Implicitly pass secrets to the called workflow – #30462
  • Merge pre-commit changes missed in [56439]#30462
  • Revert unintentional .env change in [56449]#56594
  • Tests_Formatting_MakeClickable should use data providors – #57660
  • Correct uses of ReflectionProperty::setValue() for static properties – #59231
  • Fix coding standards for Tests_Admin_wpUserSearch#41125
  • Remove webfonts tests – #59165

Bundled Theme

  • Twenty Nineteen: Improve social media icon dimension attributes – #45950
  • Ensure that pull quotes are able to use the correct font size – #57854

Coding Standards

  • Remove unused global variables in various /wp-admin/includes/ files – #59254
  • Use strict comparison in wp-includes/class-wp-hook.php#58831
  • Use strict comparison in wp-includes/class-wp-widget.php#58831
  • Use strict comparison in wp-includes/ms-files.php#58831
  • Use strict comparison in wp-includes/ms-site.php#58831

CustomizerCustomizer Tool built into WordPress core that hooks into most modern themes. You can use it to preview and modify many of your site’s appearance settings.

  • use the correct X-Robots-Tag headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitor’s opinion about your content and you/ your organization’s brand. It may also look different on different screen sizes.#58865

Database

  • Improve the documentation for various methods in the wpdb class – #58833
  • Remove support for the mysql extension – #59118

Docs

  • Add missing param description in WP_Comment class – #58890
  • Clarify post_date_column_time filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. description – #59029
  • Correct default post type in page_template_dropdown() docblockdocblock (phpdoc, xref, inline docs)#58972
  • Docblock improvements in _deprecated_class() function, as per docblocks standards – #58833
  • Fix typo in a translator comment in _deprecated_class()#58833
  • Improve PHPCSPHP Code Sniffer PHP Code Sniffer, a popular tool for analyzing code quality. The WordPress Coding Standards rely on PHPCS. comments general consistency – #58833
  • Use third-person singular verbs in various function descriptions, as per docblocks standards – #58833
  • Wrap inline @see tags in curly braces – #58858

Editor

  • Add relative time strings for the wp-date inline script output – #59219, #47373
  • Don’t use fluid layout value in typography – #58754
  • Ensure main query loopLoop The Loop is PHP code used by WordPress to display posts. Using The Loop, WordPress processes each post to be displayed on the current page, and formats it according to how it matches specified criteria within The Loop tags. Any HTML or PHP code in the Loop will be processed on each post. https://codex.wordpress.org/The_Loop. is entered for singular content in blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. themes – #58154
  • Optimize wp_get_block_css_selector to remove array_merge calls for better performance – #59178
  • Preserve block style variations when securing theme – #59108
  • Introduce font-face styles generator and printer – #59165

External Libraries

  • Update jQuery to version 3.7.1 – #59227
  • Upgrade PHPMailer to version 6.8.1 – #59238 – #58833

General

  • Fix coding standards for translatable _deprecated_class() message strings – #41125
  • Introduce a _deprecated_class() function – #41125
  • Replace two esc_url_raw() calls in core with sanitize_url()#59247
  • Use regular core button styles for page header actions – #41986

HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.

  • Stop processing HTML when encountering unsupported markup – #59167
  • Update WP_Http class to avoid PHP deprecation warnings – #58876

Help/About

  • Match icon and text in Help for bulk edit button – #58785

Login and Registration

  • Improve test coverage for sign on related functions – #36476

Media

  • Add a filter to the get_available_post_mime_types() function to allow overriding its database query – #52759
  • Prevent warning if shortcodeShortcode A shortcode is a placeholder used within a WordPress post, page, or widget to insert a form or function generated by a plugin in a specific location on your site. is used without attributes – #59206
  • Remove unused $is_IE and $is_opera globals in media_upload_form()#59254

Menus

  • Fix proximity of controls to Save and Delete menus – #56594
  • Revert unintentional changes in [56449]#56594

Options, MetaMeta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. APIs

  • Introduce prime_options() to load multiple options with a single database request – #58962
  • Introduce wp_set_option_autoload_values()#58964

Performance

  • Add fallback for $script_uri to prevent firing plugins_url() unnecessarily – #59181

Plugins

  • Correctly display spaces in new plugins search results – #59143

Posts, Post Types

  • Avoid redundant SQL query in get_pages() – #59224
  • Reinstate missing sort_column options in get_pages() – #59226
  • Remove redundant function calls in get_body_class()#43661

REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/.

  • Remove misleading comment in WP_REST_Blocks_Controller->get_item_schema – #59193

RevisionsRevisions The WordPress revisions system stores a record of each saved draft or published update. The revision system allows you to see what changes were made in each revision by dragging a slider (or using the Next/Previous buttons). The display indicates what has changed in each revision.

  • Add missing escaping function for $post_edit_link in wp-admin/revision.php#59141

Rewrite Rules

  • Prevent stampedes when flush_rewrite_rules() is called – #58998

Site Health

  • Show correct debug value for file uploads – #58737
  • fix check name used for REST API permission checks – #59236

Upgrade/Install

  • Add missing escaping function for get_option( 'home' ) in upgrade.php#59199
  • Remove unused globals in core_upgrade_preamble()#59254

Upload

  • Add a MIME type exception for .docx generated by Google Docs – #57898
  • Correct duplicate MIME type for .xlsx files generated by Google Docs – #57898

Users

  • Call add_user_meta() instead of update_user_meta() when adding metadata to a new user – #59212
  • Properly deprecate both constructors in WP_User_Search#41125
  • Remove unused wpdb global in check_password_reset_key()#59185

Widgets

  • Improve performance of has_content method in WP_Widget_Media_Gallery class – #58757

XML-RPC

  • Remove unused wpdb global in wp_xmlrpc_server::mw_newMediaObject()#59185

Props

Thanks to the 150 (!) people who contributed to WordPress Core on Trac last week:

@mukesh27 (14), @costdev (11), @sergeybiryukov (10), @joemcgill (8), @flixos90 (7), @jrf (7), @poena (6), @aristath (5), @afercia (5), @upadalavipul (5), @spacedmonkey (5), @rajinsharwar (4), @desrosj (4), @azaozz (4), @Presskopp (4), @jorbin (3), @oglekler (3), @ramonopoly (3), @swissspidy (3), @david.binda (3), @westonruter (2), @hellofromTonya (2), @oandregal (2), @boonebgorges (2), @tabrisrp (2), @gziolo (2), @daxelrod (2), @johnbillion (2), @hztyfoon (2), @davidbaumwald (2), @sabernhardt (2), @jeffpaul (2), @nidhidhandhukiya (2), @niravsherasiya7707 (1), @michelleblanchette (1), @dhruvishah2203 (1), @matthewfarlymn (1), @elrae (1), @DrewAPicture (1), @rmccue (1), @ohryan (1), @wvega (1), @ahardyjpl (1), @nekojonez (1), @dilipbheda (1), @TobiasBg (1), @Synchro (1), @aslamdoctor (1), @maltfield (1), @szepeviktor (1), @bvreeman22 (1), @johnregan3 (1), @johnjamesjacoby (1), @iammehedi1 (1), @jordanpak (1), @adhun (1), @nithi22 (1), @huzaifaalmesbah (1), @deepakvijayan (1), @zunaid321 (1), @olliejones (1), @laurelfulford (1), @maxinacube (1), @l1nuxjedi (1), @pento (1), @netweb (1), @nacin (1), @crstauf (1), @armondal (1), @tahmidulkarim (1), @crunnells (1), @TimothyBlynJacobs (1), @JordanPak (1), @emailjoey (1), @melchoyce (1), @michaelarestad (1), @danieltj (1), @helen (1), @viralsampat (1), @adamsilverstein (1), @iCaleb (1), @maciejmackowiak (1), @archon810 (1), @rcorrales (1), @varjodesigns (1), @jivygraphics (1), @whyisjake (1), @90lines (1), @sc0ttkclark (1), @jakariaistauk (1), @djcowan (1), @arena (1), @askdesign (1), @bph (1), @bradley2083 (1), @colorfultones (1), @dingo_d (1), @domainsupport (1), @annezazu (1), @dryanpress (1), @elmastudio (1), @francina (1), @garrett-eclipse (1), @gigitux (1), @grantmkin (1), @antonvlasenko (1), @andraganescu (1), @ironprogrammer (1), @Michi91 (1), @youknowriad (1), @jastos (1), @aurooba (1), @dsas (1), @jonoaldersonwp (1), @grapplerulrich (1), @jb510 (1), @annashopina (1), @soean (1), @wildworks (1), @zaguiini (1), @winterstreet (1), @mujuonly (1), @mi5t4n (1), @audrasjb (1), @simison (1), @mikeschroder (1), @manzoorwanijk (1), @adrianduffell (1), @ipajen (1), @dmsnell (1), @skorasaurus (1), @shiloey (1), @jeremyyip (1), @mburridge (1), @jffng (1), @joostdevalk (1), @jorgefilipecosta (1), @juanmaguitar (1), @mamaduka (1), @matveb (1), @mitogh (1), @scruffian (1), @ndiego (1), @ntsekouras (1), @ocean90 (1), @paaljoachim (1), @pagelab (1), @peterwilsoncc (1), @priethor (1), and @mattkeys (1).

Congrats and welcome to our 25 (!) new contributors of the week: @niravsherasiya7707, @michelleblanchette, @matthewfarlymn, @wvega, @ahardyjpl, @aslamdoctor, @maltfield, @bvreeman22, @iammehedi1, @jordanpak, @maxinacube, @l1nuxjedi, @JordanPak, @emailjoey, @varjodesigns, @jivygraphics, @90lines, @djcowan, @askdesign, @Michi91, @jastos, @winterstreet, @mi5t4n, @adrianduffell, @shiloey ♥️

Core committers: @sergeybiryukov (15), @audrasjb (13), @johnbillion (6), @desrosj (5), @swissspidy (4), @drewapicture (4), @jorbin (3), @peterwilsoncc (3), @joedolson (3), @joemcgill (3), @flixos90 (2), @isabel_brison (2), @hellofromtonya (2), @timothyblynjacobs (1), @davidbaumwald (1), @antpb (1), @kadamwhite (1), @spacedmonkey (1), @westonruter (1), @adamsilverstein (1), @bernhard-reiter (1), @costdev (1), and @whyisjake (1).

#6-4, #core, #week-in-core

What’s new in Gutenberg 16.6? (06 September)

“What’s new in GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses ‘blocks’ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/…” posts (labeled with the #gutenberg-new tag) are posted following every Gutenberg release on a biweekly basis, showcasing new features included in each release. As a reminder, here’s an overview of different ways to keep up with Gutenberg and the Site Editor project (formerly called Full Site Editing).

Gutenberg 16.6 has been released and is available for download!

This latest release comes packed with improvements and bugfixes, including an enhancementenhancement Enhancements are simple improvements to WordPress, such as the addition of a hook, a new feature, or an improvement to an existing feature. to the List View in the post editor, introducing a horizontal scrollbar for heavily nested list views, a fix for the Cover BlockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. on Safari on iPad, addressing an issue where images with a “Fixed background” were zoomed in excessively, and more!

Table of Contents

  1. PluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party-inserted blocks.
  2. Captured toolbars.
  3. Changelog.

Block hooksHooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same., formerly known as Auto-inserted blocks

On activation, plugins are now equipped with the capability to auto-insert blocks, enhancing the integration and automation between plugins and the Gutenberg editor. Early versions of this experiment were called Auto-inserted blocks, but after some discussion, they have now been dubbed Block hooks. (#52969, #54029, #54024, #54147)

Captured toolbars for an easier editing experience

Toolbars for child blocks are now seamlessly attached to their parent blocks, offering a more intuitive and organized editing experience. This feature is currently supported for Navigation, List, and Quote blocks. (#53699, #53697)

Other Notable Highlights:

  • Make mid size parameter settable for Query Pagination block. (#51216)
  • Add keyboard shortcut for duplicating blocks. (#53559)
  • Add toggle list view command in site editor. (53983)

Changelog

Features

Interactivity APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.

  • Add Slot and Fill directives. (53958)
  • Query block: Client-side pagination. (53812)
  • Update data-wp-bind directive logic. (54003)
  • Query block: Move “Enhance pagination” toggle under Settings. (54198)

Enhancements

  • Bundle ObserveTyping within the BlockList component. (53875)
  • Default appender: Hide the dashed indicator until ancestor is selected. (53761)
  • Register the block editor keyboard shortcuts automatically when using BlockEditorProvider. (53910)
  • [Commands]: Add toggle list view command in site editor. (53983)

Components

  • Bundle SlotFillProvider within BlockEditorProvider. (53940)
  • Make the Popover.Slot optional. (53889)
  • Popover: Update @floating-ui to latest version, remove custom fix for iframeiframe iFrame is an acronym for an inline frame. An iFrame is used inside a webpage to load another HTML document and render it. This HTML document may also contain JavaScript and/or CSS which is loaded at the time when iframe tag is parsed by the user’s browser. positioning and scaling. (46845)
  • AlignmentMatrixControl: Replace act() with userEvent. (53703)
  • ProgressBar: Add transition to determinate indicator. (53877)

Block Library

  • Blocks: Move bootstrapped block types to Redux state. (53807)
  • Capture toolbars in navigation block. (53697)
  • Content Block: Change placeholder and end-to-end test to refer to Content block. (53902)
  • Make mid size parameter settable for Query Pagination block. (51216)

Block Editor

  • Capture toolbars in quote block. (53699)
  • Improve writing flow for lists by capturing list item toolbars. (53306)
  • RichTextValue: Typescript Adjustment. (54002)

Typography

  • Font Face: Prepare for merge into CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. (53858)
  • Renames “Fonts Library” to “Font Library”. (53780)

Post Editor

  • Edit Post: Use hooks instead of HoCs in TaxonomyPanel. (53773)

List View

  • Add keyboard shortcut for duplicating blocks. (53559)

Patterns

New APIs

Interactivity API

  • Router with region-based client-side navigation. (53733)

Bug Fixes

  • Add missing aria roles for block locking toolbar and menu buttons. (53734)
  • Block Editor: Fix cleanup in the ‘useNavModeExit’ hook. (53795)
  • Command Palette: Fix crash on block-related commands. (53923)
  • Date: Add relative time translations for moment.js. (53931)
  • Date: Update translationtranslation The process (or result) of changing text, words, and display formatting to support another language. Also see localization, internationalization. domains for strings to be translatable. (53995)
  • Iframe: Set character encoding to utf-8. (53519)
  • Replace horizontal ellipsis icon with vertical ellipsis icon. (52731)
  • Toggle Distraction free mode mode based on compatibility. (54030)
  • Warning: Introduce SCRIPT_DEBUG to make the package compatible with webpack 5. (50122)
  • [Commands]: Fix move to command condition for registering. (54049)
  • [Commands]: Fix block editor commands availability. (53994)
  • [Format library]: Fix language popover position. (53841)

Block Library

  • Add init.js module for the Footnotes block. (53763)
  • Adding center align css for social icon issue. (43120)
  • Cover block: Fix exception when adding video background. (53961)
  • List View: Allow replacing template part when a block isn’t selected. (53757)
  • Post Navigation Link: Remove unnecessary space between arrows and label. (53572)
  • Search block: Fix width input field. (53952)
  • Simplify check for no posts in query-no-results block. (53772)
  • Site Logo: Remove line-height for the anchor element. (53909)

Components

  • Always render the fallback Popover anchor within the Popover’s parent element. (53982)
  • Fix the cleanup method for SandBox. (53796)
  • PaletteEdit: Fix component height. (54000)

Post Editor

  • Edit Post: Fix tab border conflicts in the Document Overview panel. (53711)
  • EditPostPreferencesModal: Fix intermittently failing tests. (53814)
  • getInsertionPoint: Fix type check for the state value. (53793)

npm Packages

  • Workflow: Run Learn directly from GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the ‘pull request’ where code changes done in branches by contributors can be reviewed and discussed before being merged be the repository owner. https://github.com/ action when publishing to npm targeting WP core. (53762)
  • Workflows: Fix issues with the npm publishing workflow when using locally. (53565)

Themes

  • Command Palette: Proper handling of page/post links in all themes. (53718)
  • Fix query loopLoop The Loop is PHP code used by WordPress to display posts. Using The Loop, WordPress processes each post to be displayed on the current page, and formats it according to how it matches specified criteria within The Loop tags. Any HTML or PHP code in the Loop will be processed on each post. https://codex.wordpress.org/The_Loop. bugs by correctly relying on the main query and removing problematic workaround. (49904)

Block Editor

  • Fix: Indicator style when block moving mode. (53972)

Icons

  • Fix invalidinvalid A resolution on the bug tracker (and generally common in software development, sometimes also notabug) that indicates the ticket is not a bug, is a support request, or is generally invalid. namespaces. (53955)

Patterns

  • Disable the preview option button when editing. (53913)

Global Styles

  • Gallery: Re-enable block spacing at block level while still hiding in global styles. (53900)

Layout

  • BlockList: Ensure element styles (and svg) are always appended at the end of the document. (53859)

Interactivity API

  • Add “supports.interactivity” to Image block. (53850)

Style Variations

  • Block Styles: Fix misplaced preview popover on RTL site. (53726)

List View

  • Recalculate window list when expanded state changes (fix logic for long nested lists). (53716)

Widgets Editor

  • Block WidgetWidget A WordPress Widget is a small block that performs a specific function. You can add these widgets in sidebars also known as widget-ready areas on your web page. WordPress widgets were originally created to provide a simple and easy-to-use way of giving design and structure control of the WordPress theme to the user.: Fix content cutoff in the keyboard shortcut modal. (53638)

Rich Text

  • Fix cleanup in useRemoveBrowserShortcuts. (52225)

AccessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both “direct access” (i.e. unassisted) and “indirect access” meaning compatibility with a person’s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility)

  • Edit site: Add missing label to post status password protected input field. (52885)
  • [a11yAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both “direct access” (i.e. unassisted) and “indirect access” meaning compatibility with a person’s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility)] Fix: Aria-haspop, aria-expanded attributes on the link format button. (53691)

Site Editor

  • Add missing aria roles to the ‘Create template part’ menu item. (53754)
  • Unify the delete button style in the dropdown menu with red. (52597)

Block Library

  • Add missing aria roles to the ‘Replace template part’ menu item. (53755)

Patterns

  • Add missing aria roles to the ‘Create pattern’ menu item. (53739)

List View

  • [a11y] Fix: Aria-haspop and aria-expanded attributes on list view button. (53693)

Block Editor

  • [a11y] Fix: Aria-haspop and aria-expanded attributes on the inserter button. (53692)

Performance

  • Revert “Switch performance tests to Playwright (#52022)”. (53741)
  • StartPageOptions: Load and parse patterns only after establishing the need for them. (53673)
  • Switch performance tests to Playwright: Take 2. (53768)

Experiments

Block API

  • Auto-inserting blocks: Add block inspector panel. (52969)
  • – Auto-inserting blocks: Add block icon to block inspector panel toggles. (54029)
  • Auto-inserting blocks: Remove toggle if block is present elsewhere. (54024)
  • Rename “auto inserting blocks” to “block hooks”. (54147)

Documentation

  • Add juanmaguitar as codeowner of /packages/interactivity/docs. (53845)
  • Add new How-to Guide for enqueueing assets in the Editor. (53828)
  • Adds example for useBlockProps hook. (53646)
  • Adds explanatory text to view.js template. (53870)
  • Clarification for parent and ancestor hierarchical relationships. (53855)
  • Docs: Extend the information about using render with block.json. (53973)
  • Docs: Remove duplicate sections from FAQ page. (53830)
  • Document the naming convention for block-library PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 5.6.20 or higher functions. (53777)
  • Fix ‘lerna’ links in the release documentation. (53770)
  • Fix typo in code sample for Interactivity API. (53916)
  • MenuItem: Add Storybook stories. (53613)
  • Shortcut: Add Storybook stories. (53627)
  • Storybook: Add back subcomponents to props table. (53751)
  • Storybook: Fix default source visibility. (53749)
  • Storybook: Show main story before description. (53753)
  • Update local instructions on the dev env documentation. (53924)
  • Update the Block Variations API doc. (53817)
  • Update to node 16 and npm 8 in the getting started with code contribution doc. (53912)
  • docs: Fix report-flaky-test link. (53848)

Code Quality

  • Components: Update Popover per reviews. (53907)
  • Edit Site: Rename CanvasSpinner to CanvasLoader. (53728)
  • Enforce valid function names in the packages/block-library/src//.php files. (53438)
  • Fonts Library: Update properties name from snake case to camel case to match the rest of the properties. (53746)

Block API

  • Auto-inserting blocks: Remove obsolete TODO, fix REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/. field description. (54208)

Post Editor

  • Editor: Fix the ‘useSelect’ warning in the ‘useIsDirty’ hook. (53759)
  • Fix browser console error when changing device preview mode. (53969)
  • Refactor latest content selectors in ‘CopyContentMenuItem’ components. (53676)

Components

  • Remove unnecessary utils. (53679)
  • SlotFill: Refactor <Slot bubblesVirtually />. (53272)
  • Storybook: Update TypeScript types. (53748)

List View

  • Fix warning error when the gallery block has the same image URLs. (53809)

Typography

  • Font Face API: Use gutenberg_get_global_settings instead of private API. (53805)

Tools

  • Try: Change PR label enforcer automation not to work on draft PRs by default. (53417)

Testing

  • Attempt to fix intermittent end-to-end test failure. (53905)
  • Fonts Library: Test improvements. (53702)
  • Make fonts test files use Core approach. (53856)
  • Migrate shortcut help end-to-end tests to Playwright. (53832)
  • Relocates Font Face and Fonts Library PHP files into Core’s fonts directory. (53747)
  • ColorPalette: Refine test query. (53704)
  • end-to-end Playwright Utils: Automatically detect canvas type. (53744)
  • test: Automate mobile editor tests. (53991)

Build Tooling

  • Update Jest to latest version, and use optimized JSDOM. (53736)

Plugin

  • Backportbackport A port is when code from one branch (or trunk) is merged into another branch or trunk. Some changes in WordPress point releases are the result of backporting code from trunk to the release branch. themes is_block_theme collection param from core. (53846)

First time contributors

The following PRs were merged by first time contributors:

  • @JEverhart383: Fix typo in code sample for Interactivity API. (53916)
  • @krokodok: Make mid size parameter settable for Query Pagination block. (51216)
  • @mklute101: Update local instructions on the dev env documentation. (53924)

Contributors

The following contributors merged PRs in this release:

@afercia @andrewserong @anton-vlasenko @bangank36 @brookewp @ciampo @colorful-tones @DAreRodz @dcalhoun @derekblank @ellatrix @felixarntz @geriux @glendaviesnz @gziolo @hellofromtonya @jasmussen @jblz @JEverhart383 @jordesign @jorgefilipecosta @jsnajdr @juanmaguitar @krokodok @luisherranz @Mamaduka @margolisj @matiasbenedetto @mburridge @mirka @mklute101 @mokagio @ndiego @ntsekouras @oandregal @ocean90 @ockham @priethor @ramonjd @richtabor @SiobhyB @Smit2808 @stokesman @t-hamano @torounit @tyxla @walbo @WunderBart @youknowriad

Many thanks to @jameskoster for the release assets, @annezazu and @priethorfor the general support and help collecting highlights, and @jeffikus for the copy check!

#block-editor, #core-editor, #gutenberg, #gutenberg-new

I18N Performance Analysis

A recent in-depth performance analysis of WordPress core showed that loading translations had a significant hit on a site’s server response time. Given that more than half of all WordPress sites use a language other than English (US), the performance team identified this as an area worth looking into more closely. The team spent the last couple of months exploring this in more detail and the results are now shared in this blogblog (versus network, site) post.

This is merely an analysis of the current i18ni18n Internationalization, or the act of writing and preparing code to be fully translatable into other languages. Also see localization. Often written with a lowercase i so it is not confused with a lowercase L or the numeral 1. Often an acquired skill. system in WordPress with some proposed under-the-hood performance improvements. No decisions have been made on any of these proposals.

Context

Initial benchmarks showed that the median loading time for a localized site can be up to 50% slower than for non-localized sites, depending on which themes and plugins are being used. This was measured using both the wpp-research CLI tool and also a dedicated benchmark environment (as elaborated in the Comparison section towards the end).

The WordPress i18n system is based on gettext, which uses source .po (Portable Object) files and binary .mo (Machine Object) files for storing and loading translations. It is not using the C gettext APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. itself but a custom userland implementation that works without any external dependencies.

In addition to coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. itself, each pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party and theme has its own translationtranslation The process (or result) of changing text, words, and display formatting to support another language. Also see localization, internationalization. file, which has to be loaded and parsed on every request. Loading and parsing all these translation files is an expensive task.

In the past, various solutions have been discussed and explored to improve the i18n performance of WordPress. A non-exhaustive list:

  • Use a more lightweight MO parser
  • Improve translation lookups by using the hash map in MO files (e.g. with DynaMo)
  • Caching translations in the object cache
  • Caching translations in APCu (an in-memory key-value store for PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 5.6.20 or higher)
  • Other more elaborated forms of caching (e.g. per request)
  • Using the native PHP gettext extension
  • Use a custom PHP extension to handle the MO file parsing)
  • Using lazily evaluated translation calls (see #41305 for details)
  • Using a different file format than .mo files, e.g. plain .php files

A more recent discussion touching on all of these solutions can be found over at the wordpress/performance repository. It’s a great way to get some context on this topic.

For this analysis, many of these solutions were looked at, focusing on their advantages and disadvantages. At the end of this post there is a comparison table with some much needed numbers as well, based on custom-built benchmarks.

Solutions

Solution A: Use different file format

Use a different file format for translations instead of .mo files to avoid the overhead of loading and parsing binary files.

Design considerations

With this solution, translations will be stored in plain .php files returning an associative array of translation strings. Whenever a .php file is available, it will be preferred over the .mo file, which is still used as a fallback. The rest of the architecture remains the same.

When a localized WordPress site downloads language packs from the translate.wordpress.org translation platform, it downloads .po and .mo files containing all the translations. This will be modified to include .php files. GlotPress, which the platform is built on, will be updated to support this new output format. Additionally, WordPress core itself could be modified to generate PHP files whenever they are missing.

In theory, nothing is faster in PHP than loading and executing another PHP file. .json, .ini, or .xml would all be much slower.

Proof of concepts using the PHP files can be found at swissspidy/wp-php-translation-files and swissspidy/ginger-mo.

Benefits

  • Initial benchmarks show consistent significant performance improvements
  • Relatively trivial to implement
  • Maintains backward compatibility thanks to graceful fallback
  • Makes it easier for users to inspect and change translations (no need to compile .po to .mo)
  • Avoids loading and parsing binary .mo files, which is the main bottleneck
  • Lets PHP store translations in OPcache for an additional performance benefit
  • Battle-tested approach in the PHP ecosystem (for example in Laravel)

Caveats and risks

  • Requires not only changes to WordPress core, but also tools like GlotPress and WP-CLIWP-CLI WP-CLI is the Command Line Interface for WordPress, used to do administrative and development tasks in a programmatic way. The project page is http://wp-cli.org/ https://make.wordpress.org/cli/
  • Adds maintenance overhead by introducing a new file format on top of the existing one
    • As shown by the proof of concept, the overhead is minimal
    • In the long term, .mo support could be deprecated
  • Security considerations due to essentially executing remotely fetched PHP files
    • Not really different from downloading plugins/themes from WordPress.org
    • WordPress considers translations to be trusted
    • Hosting providers could be blocking PHP execution in wp-content/languages
    • Could potentially use checksum verifications or static analysis at install time to detect anomalies

Effort and timeline

The proof of concept using PHP files is in a very solid state already. There are also examples for changes to WP-CLI (PR) and GlotPress (PR). This makes it suitable for a feature project to expand testing with very little effort required. Even a core merge would be very straightforward in a relatively short time, potentially already in Q4 2023. The security aspect when using PHP files could be a potential blockerblocker A bug which is so severe that it blocks a release., so it’s important to loopLoop The Loop is PHP code used by WordPress to display posts. Using The Loop, WordPress processes each post to be displayed on the current page, and formats it according to how it matches specified criteria within The Loop tags. Any HTML or PHP code in the Loop will be processed on each post. https://codex.wordpress.org/The_Loop. in the WordPress security team and hosting providers early on.

More time is required to test other file formats and compare results.

Solution B: Native gettext extension

Use the native gettext PHP extension written in C when available, instead of the custom built-in parser in WordPress.

Design considerations

WordPress has always used a custom MO file parser, because the native gettext extension is not necessarily available on the server. With this solution, the existing system is adapted to use the extension whenever available and falling back to the custom implementation if not.

This has been previously explored in #17268 and implemented in WP Performance Pack and Native Gettext. These implementations can serve as inspiration for the initial design. They all work similarly in that they symlink or copy the translation files to a new directory structure that is compatible with the gettext extension.

As of July 2023, around 66% of all localized WordPress sites have the gettext extension installed, according to information from the WordPress update requests.

Benefits

  • Significant performance improvements for eligible sites
    • Initial benchmarks show that loading time and memory usage basically do not differ from non-localized sites

Caveats and risks

  • The gettext extension is not commonly available
    • Smaller incentive to implement and lower impact overall
  • Requires locales to be installed on the server
    • Servers rarely have many installed locales
      • Locales often need to be compiled first and take up a lot of space
      • WordPress on the other hand supports over 200 locales
    • Potential clashes with the custom locales WordPress supports
      • For example, locales like pt_PT_ao90, de_DE_formal or roh might not even be supported
    • Outreach to hosting providers would be necessary
  • Adds maintenance overhead by essentially adding a second gettext implementation
  • Poor API
    • Requires setting environment variables (such as LC_MESSAGES and LANGUAGE), which might not be possible or cause conflicts on certain servers/sites
  • Requires symlinks or hard file copies
    • Symlinks might not be possible on the server; copying all translation files means doubling disk usage
  • Translation files are cached by PHP, thus any translation change requires restarting the web server
    • There are workarounds such as cache busting using random file names or fstat, however they might not work on all environments
  • Has not been tested on a wider scale, despite being discussed for years

Check out the code of WP Performance Pack and Native Gettext to get a better idea of the extension’s poor API.

Effort and timeline

While there are existing implementations that could be leveraged for this solution, further field testing is required to assess whether the extension actually works under all circumstances. Given the limitations around the poor API and requirements for installing locales, it does not seem like a viable solution at all.

Solution C: Cache translations

Cache translations somehow to avoid expensive .mo parsing.

Design considerations

Cache translations either on disk, in the database, or the object cache to avoid expensive .mo file parsing on subsequent requests. This can be done in a generalized manner or also on a per-request basis to only load translations required for the current URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org.

Many different caching strategies have been explored in various forms in the past, each with their own pros and cons. Some could even be combined. Defining the exact implementation requires further exploration and testing, which warrants its own exploration post.

Benefits

  • Caching translations after one time .mo parsing potentially improves performance for future requests

Caveats and risks

  • Caching using persistent object cache (e.g. Memcached, Redis) or APCu:
    • Not available on most sites, making this not an ideal solution
      • Availability according to data from WordPress update requests:
        • Memcached: ~25%
        • Redis: ~25%
        • APCu: ~6%
    • Can potentially significantly increase cache size or exceed cache key limits
  • Database caching:
    • Moves the problem from disk reads to database reads
    • Can potentially significantly increase database size
    • Alternatively, use sqlite as a cache backend
      • Untested approach
      • Available on around 90% of sites
  • Disk caching:
    • Not always possible, depending on server environment
    • Still causes file reads, only with fewer or other files
  • Multiple cache groups (e.g. per-request or frontend/adminadmin (and super admin) split)
    • Smarter cache logic to only load translations that are needed for the majority of requests
    • Can potentially significantly increase cache size
    • Unlikely that different requests use very different translations
  • Cache retrieval adds overhead
    • Exact performance gains depend on implementation method and need to be measured first
    • No performance gains with cold cache
    • Cache invalidation logic TBD

Effort and timeline

Given the existing solutions in the ecosystem, the engineering effort itself would not be too big, but the right caching implementation (e.g. disk cache or object cache) needs to be evaluated first.

However, the right caching strategy probably does not exist because of all the different hosting environments. Since it’s unrealistic for core to support multiple types of caching, this solution seems better suited for plugins rather than core.

Solution D: Lazily evaluated translation calls

Use lazily evaluated translation calls to reduce the number of function calls in certain cases, leading to improved performance.

Design considerations

The idea of lazily evaluated translation calls has been first discussed in #41305. It enables avoiding string-specific expensive translation lookups until the translations are actually needed, by passing around proxy objects.

In other words: beyond just-in-time loading of translation files (which WordPress already does), this would add just-in-time lookup of individual strings in the translations. Check out this proof of concept to get a better picture.

It can be integrated essentially in two ways, both of which are explained on the core ticketticket Created for both bug reports and feature development on the bug tracker.:

  1. Change all translation calls to be lazily evaluated by default
  2. Make this opt-in, either with new function arguments or new functions altogether

Benefits

  • Reduces the number of translation lookups, in some scenarios drastically
    • On a regular home page request there are ~60% less translation calls, saving around ~10ms (as measured by XHProf)
  • As a side effect, solves UXUX User experience issues such as #38643

Caveats and risks

  • Depending on implementation this either breaks backward compatibility or risks not gaining enough adoption
    • Documentation, tooling, and developer education can help mitigate this to a certain extent
    • Adoption could be done gradually, e.g. starting with an opt-in approach and eventually making it the default
  • Likely will not have a significant impact on typical frontend page loads, as it’s mostly useful for areas like the REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/. schema output, where a lot of translation calls are made without actually using the translations
    • Needs analysis in more scenarios to measure impact
    • The REST API schema already has a workaround by using a cache in a static variable
  • Does not improve situation for actually loading translation files
  • Initial testing shows that this actually hurts performance due to the additional thousands of proxy objects being created

Effort and timeline

Gradual adoption would mean a multi-year effort to establish lazily evaluated translation calls, while enabling this by default is a significant backward compatibility break that could affect thousands of plugins and themes in the ecosystem. And since it does actually slow down performance in some cases, this solution is not a great candidate for implementation.

Solution E: Optimize/Rewrite existing MO parser

Refactor the existing MO parser in WordPress to be more performant.

Design considerations

Completely overhaul the existing MO translation file parser in WordPress with performance in mind. For example by using Ginger MO, WP Performance Pack, or other existing solutions as a base.

While for instance Altis DXP (Human Made) have actually replaced the existing MO parser with a custom-made PHP extension written in Rust, such an approach is obviously not feasible for core. The new solution needs to be written in userland PHP.

Initial testings with an updated fork of Ginger MO show some noticeable speedups and lower memory usage. It also supports multiple translation files per text domain and multiple locales loaded at once, which could prove beneficial for improving the localeLocale A locale is a combination of language and regional dialect. Usually locales correspond to countries, as is the case with Portuguese (Portugal) and Portuguese (Brazil). Other examples of locales include Canadian English and U.S. English. switching functionality in WordPress core.

Besides that, plugins like WP Performance Pack and DynaMo have implemented partial lookups using the MO hash table or binary search, avoiding reading the whole file and storing it in memory. That slightly reduces memory usage and performance.

Benefits

  • Can be used without necessarily introducing another file format
  • Opens up potential performance enhancements in other areas, i.e. locale switching
  • Mostly maintains backward compatibility

Caveats and risks

  • Still a risk of breaking backward compatibility

Effort and timeline

There already is a working proof of concept for this solution, but more testing is required to further refine it and improve its backward compatibility layer. With such an effort being an ideal candidate for a feature pluginFeature Plugin A plugin that was created with the intention of eventually being proposed for inclusion in WordPress Core. See Features as Plugins., this could be achieved relatively quickly in a few months.

Solution F: Splitting up translation files

Split translation files from plugins and themes into smaller chunks to make loading them more efficient.

Design considerations

Depending on the project’s size, translation files can be quite big. That’s why WordPress itself uses separate translation files for the admin and everything else, so that not too many strings are unnecessarily loaded.

This strategy could be applied to plugins and themes as well. Either by allowing them to use multiple text domains (which would require developer education and changes to tooling), or by somehow doing this automatically (exact method TBD)

Benefits

  • Faster loading times due to loading smaller files

Caveats and risks

  • Risk of breaking backward compatibility
  • Opt-in approach requires tooling and distribution changes and risks slow adoption

Effort and timeline

Further research is required to evaluate this properly.

Comparison

At first glance, solution A (PHP translation files) is a relatively straightforward enhancementenhancement Enhancements are simple improvements to WordPress, such as the addition of a hook, a new feature, or an improvement to an existing feature. that maintains backward compatibility and shows promising improvements. However, it does not only require changes to core itself, but also to the translation platform. The security aspect remains a risk, although discussing it early on with stakeholders and gathering more testers would help mitigate it.

Leveraging the native gettext extension as in solution B shows stunning results, but the lack of availability and the non-ideal API are a concern. Still, it’s a progressive enhancement that cannot be ignored. Especially since it could pretty much eliminate the need for additional caching as in solution C.

Caching already loaded translations as in solution C does not eliminate the root cause of the i18n slowness, but can speed up subsequent requests. Unfortunately, persistent object caches or APCu are rather uncommon (though we do not have exact data on the former yet, see #58808), and implementing more complex types of caching (e.g. per-request caching) would require significant exploration effort before becoming a viable option.

Lazily evaluated translation calls (solution D) can shave time off translation calls in some situations, but overall actually decrease performance. While it could help solve some actual UX issues in core, the backward compatibility and adoption concerns make it even less of a suitable solution.

Existing plugins like Ginger MO and WP Performance Pack show that the existing MO parser in WordPress can be further improved (solution E).

Benchmarks

Now to the most interesting part: the hard numbers!

These benchmarks are powered by a custom-built performance testing environment using @wordpress/env and Playwright. The environment has been configured with some additional plugins and the PHP extensions required for some of the solutions. Tests have been performed against the 6.3 RCrelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta). by visiting the home page and the dashboard 30 times each and then using the median values.

You can find the exact setup in this wp-i18n-benchmarks GitHub repository.

BlockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. Theme

LocaleScenarioObject CacheMemory UsageTotal Load Time
en_USDefault15.60 MB133.58 ms
de_DEDefault29.14 MB181.95 ms
de_DEGinger MO (MO)19.24 MB159.18 ms
de_DEGinger MO (PHP)16.98 MB138.14 ms
de_DEGinger MO (JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML.)19.24 MB153.39 ms
de_DENative Gettext15.99 MB142.12 ms
de_DEDynaMo19.62 MB157.93 ms
de_DECache in APCu50.37 MB181.51 ms
en_USDefault15.67 MB121.53 ms
de_DEDefault29.01 MB167.67 ms
de_DEGinger MO (MO)19.11 MB147.19 ms
de_DEGinger MO (PHP)16.85 MB127.97 ms
de_DEGinger MO (JSON)19.11 MB144.43 ms
de_DENative Gettext15.86 MB129.19 ms
de_DEDynaMo18.57 MB133.46 ms
de_DECache in APCu50.30 MB170.19 ms
de_DECache in object cache29.07 MB173.19 ms
Benchmarks using the Twenty Twenty-Three block theme

Classic Theme

LocaleScenarioObject CacheMemory UsageTotal Load Time
en_USDefault15.35 MB120.79 ms
de_DEDefault28.79 MB172.10 ms
de_DEGinger MO (MO)18.85 MB145.68 ms
de_DEGinger MO (PHP)16.56 MB124.73 ms
de_DEGinger MO (JSON)18.84 MB140.78 ms
de_DENative Gettext15.58 MB128.26 ms
de_DEDynaMo19.24 MB146.09 ms
de_DECache in APCu50.13 MB167.28 ms
en_USDefault15.19 MB107.26 ms
de_DEDefault28.59 MB154.30 ms
de_DEGinger MO (MO)18.64 MB133.21 ms
de_DEGinger MO (PHP)16.37 MB112.94 ms
de_DEGinger MO (JSON)18.64 MB128.94 ms
de_DENative Gettext15.38 MB115.11 ms
de_DEDynaMo18.10 MB120.72 ms
de_DECache in APCu49.99 MB151.82 ms
de_DECache in object cache28.65 MB156.36 ms
Benchmarks using the Twenty Twenty-One classic theme

Admin

LocaleScenarioObject CacheMemory UsageTotal Load Time
en_USDefault15.42 MB139.83 ms
de_DEDefault31.92 MB187.76 ms
de_DEGinger MO (MO)20.07 MB164.94 ms
de_DEGinger MO (PHP)17.09 MB139.66 ms
de_DEGinger MO (JSON)20.06 MB160.87 ms
de_DENative Gettext15.95 MB143.43 ms
de_DEDynaMo20.58 MB166.79 ms
de_DECache in APCu58.13 MB190.38 ms
en_USDefault15.66 MB112.69 ms
de_DEDefault31.84 MB164.26 ms
de_DEGinger MO (MO)19.99 MB140.70 ms
de_DEGinger MO (PHP)17.01 MB118.52 ms
de_DEGinger MO (JSON)19.98 MB138.49 ms
de_DENative Gettext15.87 MB120.01 ms
de_DEDynaMo19.73 MB120.26 ms
de_DECache in APCu58.07 MB162.41 ms
de_DECache in object cache31.86 MB164.28 ms
Benchmarks visiting the WordPress admin

Conclusion

Finding the right path forward means weighing all the pros and cons of each solution and looking at both horizontal and vertical impact, i.e. how much faster can i18n be made for how many sites.

When looking at all these factors, it appears that a revamped translations parser (solution E) could bring the most significant improvements to all localized WordPress sites. Especially when combined with a new PHP translation file format (solution A), which Ginger MO supports, the i18n overhead becomes negligible. Of course the same risks associated with introducing a new format apply.

On top of that, a revamped i18n library like Ginger MO could also be combined with other solutions such as caching or dynamic MO loading to potentially gain further improvements. However, those routes have yet to be explored.

Next steps

The WordPress performance team wants to further dive into this topic and test some of the above solutions (and combinations thereof) on a wider scale through efforts like the Performance Lab feature project. We are looking forward to hearing your feedback on this analysis and welcome any additional comments, insights, and tinkering.

Deadline August 6, 2023

After the deadline passes, the performance team will discuss the received feedback and determine next steps.


Thank you to @flixos90, @westonruter, @joemcgill, @spacedmonkey, and @adamsilverstein for reviewing and helping with this post. Thank you to @nbachiyski, @ocean90, @akirk, @rmccue, @dd32 for providing valuable insights and context.

#core, #i18n, #performance

A Week in Core – July 10, 2023

Welcome back to a new issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Let’s take a look at what changed on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. between July 3 and July 10, 2023.

  • 80 commits
  • 100 contributors
  • 77 tickets created
  • 10 tickets reopened
  • 58 tickets closed

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers are based on the Trac timeline for the period above. The following is a summary of commits, organized by component and/or focus.

Code changes

Administration

  • Adjust the “No private directive present in cache control when user not logged in” test so the assertions won’t fail if the headers don’t contain a cache-control key at all – #21938
  • Administration: CSSCSS Cascading Style Sheets. selector correction for list table checkboxes – #21516

Boostrap/Load

  • Incorrect condition in wp_check_php_mysql_versions()#58201

Build/Test Tools

  • Prevent 404 errors in the E2E tests – #58777
  • Suppress E2E test suite SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/. notifications – #58779
  • Fix dynamic property deprecation warning in object cache drop-in – #58736
  • Fix incorrect hook being used to separate Server-Timing metrics in performance tests – #58674

Bundled Themes

  • Twenty Fifteen: Reintroduce HTML5 Shiv – #56699
  • Twenty Seventeen: Reintroduce HTML5 Shiv – #56699
  • Twenty Seventeen: Use wp_register_script() to register HTML5 Shiv script – #56699
  • Twenty Thirteen: Reintroduce HTML5 Shiv – #56699
  • Twenty Twenty-One: Add b and strong elements to editor styles – #58383
  • Twenty Twenty-One: Replace the experimental link color theme support – #58702
  • Twenty Twenty-Three: Add a border to Quote blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience.#57506
  • Twenty Twenty-Three: Allow changing Site Title font size in Marigold and Whisper styles – #57971
  • Twenty Twenty-Three: Fix Separator Block default styling – #57667
  • Twenty Twenty: Fix left margin in Latest Posts & Latest Comments blocks – #58396

Coding Standards

  • Add missing newline at the end of wp-admin/user.php#58194
  • Use strict comparison in wp-includes/class-wp-simplepie-file.php#57839
  • Use strict comparison in wp-includes/class-wp-tax-query.php#57839
  • Use strict comparison in wp-includes/class-wp-user-query.php#57839
  • Use strict comparison in wp-includes/class-wp-user.php#57839

Docs

  • Correct the formatting of various filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. documentation – #57840
  • Docblockdocblock (phpdoc, xref, inline docs) correction in WP_REST_Attachments_Controller::upload_from_data()#57840
  • Document the return value of wp_check_php_version() using hash notation – #57840
  • Fix incorrect type for $crop param is various WP_Image_Editor classes and methods – #58271
  • Replace multiple single line comments with multi-line comments – #58459
  • Update link to MovableType docs (on Internet Archive) – #58760
  • Update link to MovableType documentation – #58760
  • Use third-person singular verbs in various function descriptions of load.php, as per docblocks standards – #57840

Editor

  • Enqueue commands package styles – #58667
  • Ensure blocks registered within parent theme are available when child themeChild theme A Child Theme is a customized theme based upon a Parent Theme. It’s considered best practice to create a child theme if you want to modify the CSS of your theme. https://developer.wordpress.org/themes/advanced-topics/child-themes/. is activated – #57566
  • Fix font paths in iframed editor – #58672
  • Fix layout of no-js state in site editor – #56228
  • Normalize paths in register_core_block_style_handles()#58711
  • Typo correction in Author block template description
  • adds deprecation for deleted block_core_navigation_submenu_build_css_colors function – #58623
  • fix comment indentation – #58586
  • opt out of Navigation fallback – #58750
  • rename sync_status and move it to top level – #58677
  • update npm packages with bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority. fixes and blessed tasks – #58701
  • update npm packages with bug fixes and blessed tasks – #58745
  • update string incorrectly marked for translationtranslation The process (or result) of changing text, words, and display formatting to support another language. Also see localization, internationalization. in Chrome – #58716
  • update template titles in browse mode – #58713

Filesystem APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.

  • Ensure wp_tempnam() does not produce file names longer than 255 characters as this is the limit on most filesystems – #35755

General

  • Compare values as strings in WP_List_Util::filter() and ::sort_callback()#57839
  • Fix an error introduced in [56179]
  • Increase the minimum supported version of PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 5.6.20 or higher to 7.0.0 – #57345
  • Revert strict comparison in WP_List_Util for now – #57839
  • add nonce for block theme preview activation – #58712
  • fix botched file move in r56199#58712

HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. API

  • Fix a fatal error when processing malformed document with unclosed attribute – #58637

HTTPHTTP HTTP is an acronym for Hyper Text Transfer Protocol. HTTP is the underlying protocol used by the World Wide Web and this protocol defines how messages are formatted and transmitted, and what actions Web servers and browsers should take in response to various commands. API

  • Declare a few default parameters in WP_Http_Curl and WP_Http_Streams#52622

Help/About

  • Add Help text for Rollback feature – #58199

I18ni18n Internationalization, or the act of writing and preparing code to be fully translatable into other languages. Also see localization. Often written with a lowercase i so it is not confused with a lowercase L or the numeral 1. Often an acquired skill.

  • Move translator comments inside sprintf for tagline field description – #57675

Media

  • Avoid programmatically created images within post content from incorrectly receiving fetchpriority="high"#58235
  • Ensure custom headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitor’s opinion about your content and you/ your organization’s brand. It may also look different on different screen sizes. image tagtag A directory in Subversion. WordPress uses tags to store a single snapshot of a version (3.6, 3.6.1, etc.), the common convention of tags in version control systems. (Not to be confused with post tags.) supports loading optimization attributes – #58680
  • Ensure that large images before the main query loopLoop The Loop is PHP code used by WordPress to display posts. Using The Loop, WordPress processes each post to be displayed on the current page, and formats it according to how it matches specified criteria within The Loop tags. Any HTML or PHP code in the Loop will be processed on each post. https://codex.wordpress.org/The_Loop. are counted towards lazy-loading threshold – #58635
  • Ensure that the image widgetWidget A WordPress Widget is a small block that performs a specific function. You can add these widgets in sidebars also known as widget-ready areas on your web page. WordPress widgets were originally created to provide a simple and easy-to-use way of giving design and structure control of the WordPress theme to the user. supports loading optimization attributes – #58704
  • Fix responsive views in image editor – #58692

Options, MetaMeta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. APIs

  • Check if the gmt_offset value is numeric in sanitize_option()#57728

REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/.

  • Correct some filter docblocks – #57752

RevisionsRevisions The WordPress revisions system stores a record of each saved draft or published update. The revision system allows you to see what changes were made in each revision by dragging a slider (or using the Next/Previous buttons). The display indicates what has changed in each revision.

  • return existing autosave after saving with unchanged data – #58739

Themes

  • Improved caching in wp_theme_has_theme_json()#58758

Users

  • Remove password reset links when the feature is not allowed for a specific user – #58194

Props

Thanks to the 100 (!) people who contributed to WordPress Core on Trac last week:

@audrasjb (22), @costdev (21), @poena (11), @mukesh27 (10), @sabernhardt (10), @sergeybiryukov (9), @spacedmonkey (8), @afercia (5), @wildworks (4), @peterwilsoncc (4), @flixos90 (4), @aristath (4), @thekt12 (3), @oglekler (3), @ramonopoly (3), @westonruter (3), @jrf (2), @azaozz (2), @mrinal013 (2), @kebbet (2), @nithins53 (2), @robinwpdeveloper (2), @joemcgill (2), @hellofromTonya (2), @masteradhoc (1), @knutsp (1), @thunderdw (1), @samiamnot (1), @JavierCasares (1), @dingo_d (1), @chanthaboune (1), @felipeelia (1), @ntsekouras (1), @kraftbj (1), @tahmina1du (1), @cshark (1), @garyjones (1), @antonvlasenko (1), @Cybr (1), @adi3890 (1), @sjoerdlinders (1), @shailu25 (1), @alvitazwar052 (1), @shuvoaftab (1), @ryelle (1), @hasanmisbah (1), @hrdelwar (1), @dhrupo (1), @dmsnell (1), @bhi3315 (1), @dlh (1), @kafleg (1), @david.binda (1), @jeremyfelt (1), @shuvo247 (1), @ndiego (1), @hztyfoon (1), @ironprogrammer (1), @ocean90 (1), @marybaum (1), @mikeyzm (1), @vivekawsm (1), @doems (1), @andraganescu (1), @dhrumilk (1), @mikinc860 (1), @zoonini (1), @akrocks (1), @nidhidhandhukiya (1), @syamraj24 (1), @jacknotman (1), @jomonthomaslobo1 (1), @nithi22 (1), @scruffian (1), @Toro_Unit (1), @eric.7186 (1), @andrewserong (1), @get_dave (1), @mikeschroder (1), @Levdbas (1), @aaronrobertshaw (1), @iamfarhan09 (1), @glendaviesnz (1), @johnbillion (1), @mrfoxtalbot (1), @jeroenrotty (1), @Mamaduka (1), @mujuonly (1), @afragen (1), @pavanpatil1 (1), @guillaumeturpin (1), @nkeller15 (1), @mikachan (1), @Rahmohn (1), @sakibmd (1), @haritpanchal (1), @isabel_brison (1), @whaze (1), @leprincenoir (1), and @Clorith (1).

Congrats and welcome to our 11 (!) new contributors of the week: @thunderdw, @tahmina1du, @cshark, @vivekawsm, @doems, @mikinc860, @akrocks, @jacknotman, @jomonthomaslobo1, @eric7186, @iamfarhan09 ♥️

Core committers: @audrasjb (39), @isabel_brison (11), @sergeybiryukov (9), @flixos90 (5), @johnbillion (4), @davidbaumwald (3), @peterwilsoncc (2), @joedolson (2), @azaozz (2), @spacedmonkey (2), @adamsilverstein (1).

#6-3, #core, #week-in-core

A Week in Core – June 26, 2023

Welcome back to a new issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Let’s take a look at what changed on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. between June 19 and June 26, 2023.

  • 112 commits
  • 192 contributors
  • 68 tickets created
  • 16 tickets reopened
  • 107 tickets closed

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers are based on the Trac timeline for the period above. The following is a summary of commits, organized by component and/or focus.

Code changes

Administration

  • Add the no-store and private directives to the Cache-Control headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitor’s opinion about your content and you/ your organization’s brand. It may also look different on different screen sizes. when preventing caching for logged in users – #21938, #57627
  • Backwards compatibility for new sortable keys – #32170
  • Consistent positioning and size of search form – #57949
  • Fix password layout for RTL and mobile – #9883
  • Fix visual regressionregression A software bug that breaks or degrades something that previously worked. Regressions are often treated as critical bugs or blockers. Recent regressions may be given higher priorities. A "3.6 regression" would be a bug in 3.6 that worked as intended in 3.5. in media search input – #57949
  • Hide password in options/writing – #9883
  • Make checkbox column clickable – #21516
  • Reduce translationtranslation The process (or result) of changing text, words, and display formatting to support another language. Also see localization, internationalization. calls after [55969]#57675
  • Replace Tagline option placeholder with a description – #57675
  • Replace contracted verb forms for better consistency – #30796
  • Set accessible state for list table headers – #32170

Bootstrap/Load

  • Require wp-includes/compat.php earlier in wp-settings.php#58206
  • Require wp-includes/compat.php in wp-load.php#58206

Build/Test Tools

  • Store artefacts of failing E2E test runs – #58596
  • Update URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org of theme unit testunit test Code written to test a small piece of code or functionality within a larger application. Everything from themes to WordPress core have a series of unit tests. Also see regression. data – #58569
  • Update the test for pre_wp_setup_nav_menu_item filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output.#56577

Bundled Themes

  • Twenty Fifteen: Fix Letter Case implementation – #58526
  • Twenty Fifteen: Remove IE specific resources – #56699
  • Twenty Fourteen: Fix Letter Case implementation – #58526
  • Twenty Nineteen: Always set background color and foreground color together – #45916
  • Twenty Nineteen: Ensure Separator blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. supports theme colors in editor – #58558
  • Twenty Nineteen: Fix a JSJS JavaScript, a web scripting language typically executed in the browser. Often used for advanced user interfaces and behaviors. coding standard issue found after [55970]#46474
  • Twenty Nineteen: Prevent a console error related to the main navigation on Firefox – #46474
  • Twenty Nineteen: Remove unused function parameters and variables – #57397
  • Twenty Nineteen: Revert [55960]#45916
  • Twenty Seventeen: Make twentyseventeen_is_static_front_page() an alias of twentyseventeen_is_frontpage()#43515
  • Twenty Seventeen: Remove IE specific resources – #56699
  • Twenty Sixteen: Fix Letter Case implementation – #58526
  • Twenty Sixteen: Fix List block padding in the editor – #58409
  • Twenty Ten: Improve Pullquote block line height for better readability – #52546
  • Twenty Thirteen: Remove IE specific resources – #56699
  • Twenty Thirteen: Remove an unnecessary border from Table block – #56538
  • Twenty Twenty-Two: Add missing subject tags and feature tags – #58437
  • Twenty Twenty: Fix Letter Case implementation – #58526
  • Twenty Twenty: Fix an RTL style issue leading to failed Test Default Themes & Create ZIPs workflow – #58396
  • Twenty Twenty: Fix left margin in Latest Posts & Latest Comments blocks – #58396
  • Twenty Twenty: Inherit Quote block’s paragraph custom letter spacing in the editor – #58033
  • Twenty Twenty: Remove various unused function parameters and variables – #57371
  • Twenty Twenty: Revert [56034] pending further investigation – #58396

Cache APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.

  • Remove unused usermeta global cache group – #58175

Code Modernization

  • Replace usage of strpos() with str_contains()#58206
  • Replace usage of substr() with str_starts_with() and str_ends_with()#58220
  • Use str_contains() in a few more places – #58206
  • Use str_contains() in a few more places – #58206
  • Use str_contains() in a few more places – #58220
  • Use str_ends_with() in a few more places – #58220
  • Use str_starts_with() and str_ends_with() in a few more places – #58220
  • Use str_starts_with() and str_ends_with() in a few more places – #58220
  • Use str_starts_with() in WP_Theme_JSON class methods – #58012

Coding Standards

  • Fix missing semicolon after [56009]#40966
  • Fix undeclared variable issue – #40966
  • Use Yoda condition in str_ends_with()#58220
  • Use strict comparison in wp-includes/pomo/translations.php#57839

Database

  • Replace str_contains() and str_ends_with() usage in wpdb methods – #58206

Docs

  • Add missing param description to update_menu_item_cache in wp_get_nav_menu_items()#58468, #57840
  • register_block_style() docblockdocblock (phpdoc, xref, inline docs) improvement – #58562, #57840

Editor

  • Add a description key to theme.json style variations – #58614
  • Add no-js fallback for site editor – #56228
  • Fix block editor styles being registered with frontend stylesheets – #58605
  • Fix block template utils test: use template part instead of template object – #58540
  • Improve accessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both “direct access” (i.e. unassisted) and “indirect access” meaning compatibility with a person’s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility) of new custom fieldCustom Field Custom Field, also referred to as post meta, is a feature in WordPress. It allows users to add additional information when writing a post, eg contributors’ names, auth. WordPress stores this information as metadata. Users can display this meta data by using template tags in their WordPress themes. UIUI User interface#15631
  • Introduce WP_Theme_JSON::prepend_to_selector() to improve code quality and performance – #58193, #58457
  • Register core block styles in one place – #58528
  • Rename wp_get_remote_patterns to wp_get_theme_directory_pattern_slugs#58460
  • Use static closures to avoid memory leaks – #58323
  • `wp_get_global_styles`: allow transforming the CSSCSS Cascading Style Sheets. Custom Properties into the values they represent – #58588
  • `wp_get_global_styles`: return the standard format for CSS Custom Properties – #58467
  • add Post Content attributes to block editor settings – #58534
  • add grid layout type – #58554
  • add grid layout type – #58554
  • add support for block-level link hover colors – #58575
  • add text columns to typography support – #58549
  • fix site editor layout bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority.#56228
  • rename reusable blocks to patterns – #58577
  • revert add grid layout type – #58554
  • update layout classnames and specificity – #58548
  • use layout.wideSize as max viewport width – #58522
  • use logarithmic scale for fluid typography – #58523

Embeds

  • Add Anghami as a trusted oEmbed provider – #49850

Filesystem API

  • Attempt to create directory in copy_dir()#41855

General

  • Introduce WP_DEVELOPMENT_MODE constant to signify context-specific development mode – #57487
  • Replace substr_compare() usage in the str_ends_with() polyfill – #58220
  • Replace some instances of “blogblog (versus network, site)” with “site” in documentation, translator comments, and user-facing text strings – #58117
  • Return early from str_ends_with() polyfill if both haystack and needle are empty – #58220
  • fix overridden typos – #58464

Help/About

  • Improve Dashboard screen options behavior on small screens – #57977

I18Ni18n Internationalization, or the act of writing and preparing code to be fully translatable into other languages. Also see localization. Often written with a lowercase i so it is not confused with a lowercase L or the numeral 1. Often an acquired skill.

  • Ensure determine_locale() does not potentially return an empty string – #58317

KSES

  • Add support for CSS repeat() function – #58551

Login and Registration

  • Add required to Username/password inputs – #32510

Media

  • Automatically add fetchpriority="high" to hero image to improve load time performance – #58235
  • Display the “Copy URL” and “Download file” row actions when the “Unattached” filter is applied – #57890, #57893
  • Redirect deprecated wp-admin/media.php file – #57612

Posts, Post Types

  • Add a $previous_status parameter to wp_trash_post() related hooksHooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same.#58392

Quick/Bulk Edit

  • Don’t set publish date when editing drafts – #19907

REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/.

  • Indicate when a theme supports the Site editor in the Themes REST API response – #58123
  • Return post modified datetime for Templates – #58540

Script Loader

  • Add support for HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. 5 “async” and “defer” attributes – #12009
  • Replace str_contains() usage in wp-includes/script-loader.php#58206

Themes

  • Allow non-block themes to add theme support for border settings – #58598
  • Allow non-block themes to add theme support for link color settings – #58597
  • Change the order of path check in is_block_theme method – #58520
  • Fix caching issue in get_post_templates method in WP_Theme#57886

Tools

  • Fix unresolvable conflicts computation in package sync script – #58628

Upgrade/Install

  • Add aria-describedby for input descriptions – #58613
  • Move location of $upgrade_notice for better consistency – #57939
  • Prevent users from sending multiple bulk pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party updates – #40966
  • Show/hide toggle on password fields – #3534
  • Update ‘show details’ button change – #44714

Props

Thanks to the 192 (!!) people who contributed to WordPress Core on Trac last week:

@sabernhardt (28), @audrasjb (21), @mukesh27 (20), @costdev (19), @spacedmonkey (16), @joedolson (14), @oglekler (13), @ramonopoly (11), @sergeybiryukov (11), @poena (10), @peterwilsoncc (8), @azaozz (8), @swissspidy (8), @flixos90 (8), @afercia (6), @tb1909 (5), @isabel_brison (5), @andrewserong (5), @dd32 (5), @zunaid321 (5), @kebbet (5), @joemcgill (5), @thakordarshil (4), @pateljaymin (4), @ugyensupport (4), @panchalhimani711 (4), @nidhidhandhukiya (4), @desrosj (3), @westonruter (3), @neychok (3), @pooja1210 (3), @ironprogrammer (3), @nihar007 (3), @clorith (3), @alexstine (3), @rutviksavsani (2), @karmatosed (2), @pbiron (2), @soulseekah (2), @hellofromtonya (2), @bgoewert (2), @kafleg (2), @Cybr (2), @ryelle (2), @samnajian (2), @Soean (2), @jane (2), @upadalavipul (2), @thekt12 (2), @dhruvishah2203 (2), @NekoJonez (2), @wpnook (2), @oandregal (2), @timothyblynjacobs (2), @10upsimon (2), @kapilpaul (1), @ignatggeorgiev (1), @jorbin (1), @krupalpanchal (1), @tacoverdo (1), @ramonopoly (1), @aristath (1), @maxcgparis (1), @rianrietveld (1), @bor0 (1), @boniu91 (1), @renyot (1), @kjellr (1), @zgrkaralar (1), @sabreuse (1), @wojtek.szkutnik (1), @pamprn09 (1), @brookedot (1), @ryan (1), @denis-de-bernardy (1), @mastrup (1), @jrf (1), @otto42 (1), @williampatton (1), @maniu (1), @hellofromTonya (1), @johnjamesjacoby (1), @dimijazz (1), @laurelfulford (1), @samful (1), @monzuralam (1), @azizantoun (1), @bacoords (1), @allancole (1), @d-signed (1), @nant82 (1), @sanchothefat (1), @matmoe (1), @ronakganatra (1), @jeremyfelt (1), @aznadesign (1), @mitchoyoshitaka (1), @lessbloat (1), @ogleker (1), @Boniu91 (1), @dilipbheda (1), @joostdevalk (1), @luehrsen (1), @ianbelanger (1), @grantmkin (1), @McAlyster (1), @janpaulkleijn (1), @rehanali (1), @pavanpatil1 (1), @Dharm1025 (1), @Ankit K Gupta (1), @markdoliner (1), @ayeshrajans (1), @paulkevan (1), @andy786 (1), @johnbillion (1), @pouicpouic (1), @joyously (1), @afragen (1), @Heiko_Mamerow (1), @Denis-de-Bernardy (1), @subrataemfluence (1), @nrqsnchz (1), @fencermonir (1), @zebaafiashama (1), @rudlinkon (1), @uxtremist (1), @rfischmann (1), @youknowriad (1), @mista-flo (1), @batmoo (1), @franrosa (1), @annashopina (1), @hareesh-pillai (1), @bitnissen (1), @krupajnanda (1), @kevin940726 (1), @xkon (1), @nkeller15 (1), @mujuonly (1), @hugod (1), @davidbaumwald (1), @shailu25 (1), @harshgajipara (1), @dmsnell (1), @nadimcse (1), @glendaviesnz (1), @adamsilverstein (1), @mukeshpanchal27 (1), @mor10 (1), @scep (1), @vanaf1979 (1), @Otto42 (1), @MarcGuay (1), @bookdude13 (1), @melchoyce (1), @aaronrobertshaw (1), @adeltahri (1), @chouby (1), @Clorith (1), @ocean90 (1), @dingo_d (1), @mikeschroder (1), @dhrumilk (1), @markparnell (1), @prashantbhivsane (1), @marybaum (1), @ababir (1), @chiragrathod103 (1), @jahidcse (1), @ntsekouras (1), @ryokuhi (1), @Narthur (1), @simonemanfre (1), @intoxination (1), @vasilism (1), @xmarcos (1), @matt (1), @markjaquith (1), @nazgul (1), @akbigdog (1), @rob1n (1), @DrewAPicture (1), @MichaelH (1), @empireoflight (1), @rmccue (1), @markoheijnen (1), @r0uter (1), @amansurov (1), @bi0xid (1), @caraffande (1)

.

Congrats and welcome to our 37 (!!) new contributors of the week: @thakordarshil, @pateljaymin, @panchalhimani711, @samnajian, @dhruvishah2203, @wpnook, @maxcgparis, @renyot, @mastrup, @dimijazz, @azizantoun, @bacoords, @aznadesign, @McAlyster, @janpaulkleijn, @markdoliner, @Heiko_Mamerow, @fencermonir, @uxtremist, @rfischmann, @franrosa, @annashopina, @bitnissen, @shailu25, @harshgajipara, @nadimcse, @scep, @vanaf1979, @ababir, @jahidcse, @Narthur, @simonemanfre, @vasilism, @xmarcos, @akbigdog, @r0uter, @amansurov, and @caraffande ♥️

Core committers: @audrasjb (37), @sergeybiryukov (21), @joedolson (14), @isabel_brison (13), @peterwilsoncc (5), @flixos90 (4), @oandregal (4), @spacedmonkey (3), @swissspidy (2), @johnbillion (2), @westonruter (1), @bernhard-reiter (1), @joemcgill (1).

#6-3, #core, #week-in-core

A Week in Core – June 19, 2023

Welcome back to a new issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Let’s take a look at what changed on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. between June 12 and June 19, 2023.

  • 41 commits
  • 61 contributors
  • 66 tickets created
  • 7 tickets reopened
  • 40 tickets closed

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers are based on the Trac timeline for the period above. The following is a summary of commits, organized by component and/or focus.

Code changes

Build/Test Tools

  • Revert accidental change to .env – #50523
  • Add @covers annotation to wp_set_object_terms() tests – #57841
  • Various term related test improvements – #57841

Bundled Themes

  • Fix Twenty Fourteen button blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. line-height – #58444
  • Remove load_theme_textdomain() calls from default themes – #58318
  • Twenty Seventeen: Improve Grid View variation rendering in the editor for the Post List block – #58531

Cache APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.

  • Remove unused usermeta global cache group – #58175

Coding Standards

  • Use strict comparison in wp-includes/class-wp-list-util.php#57839
  • Use strict comparison in wp-includes/class-wp-oembed.php#57839
  • Use strict comparison in wp-includes/pomo/entry.php#57839
  • Use strict comparison in wp-includes/pomo/mo.php#57839
  • Use strict comparison in wp-includes/pomo/streams.php#57839
  • Use strict comparison in wp-includes/pomo/translations.php#57839

Docs

  • Use third-person singular verbs in various function descriptions, as per docblocks standards – #57840
  • Use third-person singular verbs in various function descriptions, as per docblocks standards – #57840
  • Use third-person singular verbs in various function descriptions, as per docblocks standards – #57840
  • Use third-person singular verbs in various function descriptions, as per docblocks standards – #57840

Editor

  • Skip file_exist check for core blocks. – #58385
  • use layout.wideSize as max viewport width – #58522
  • use logarithmic scale for fluid typography – #58523
  • Fix lint issues in WP_Theme_JSON::sanitize method – #58462
  • Ignore unregistered block style variations from theme.json#58462

Filesystem API

  • Attempt to create directory in copy_dir()#41855

Formatting

  • Support aria content attributes – #55370

General

  • Replace some instances of “blogblog (versus network, site)” with “site” in documentation, translator comments, and user-facing text strings – #58117
  • fix overridden typos – #58464

I18Ni18n Internationalization, or the act of writing and preparing code to be fully translatable into other languages. Also see localization. Often written with a lowercase i so it is not confused with a lowercase L or the numeral 1. Often an acquired skill.

  • Allow to short-circuit load_textdomain()#58035

KSES

  • Add support for CSSCSS Cascading Style Sheets. repeat() function – #58551

Media

  • Deprecate the ‘edit_custom_thumbnail_sizes’ filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. and disable the “Apply changes to [Thumbnail|All|All except thumbnail]” UIUI User interface in the image editor. Add a (boolean) filter to reenable that UI – #57685
  • Display the “Copy URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org” and “Download file” row actions when the “Unattached” filter is applied – #57890, #57893
  • Redirect deprecated wp-admin/media.php file – #57612
  • Remove duplicate div containers – #50523
  • Update adminadmin (and super admin) image editor design – #50523

Posts, Post Types

  • Introduce item_trashed post type label – #51387

Script Loader

  • Add a check to see in style is registered in wp_maybe_inline_styles – #58394

TaxonomyTaxonomy A taxonomy is a way to group things together. In WordPress, some common taxonomies are category, link, tag, or post format. https://codex.wordpress.org/Taxonomies#Default_Taxonomies.

  • Prevent deprecation notices clearing terms – #57923

Themes

  • Change the order of path check in is_block_theme method – #58520
  • Fix caching issue in get_post_templates method in WP_Theme#57886
  • Inline render blocking CSS classic-themes.css#58480
  • add wp_get_remote_theme_patterns function – #58460

Upgrade/Install

  • Log in link should look like a link – #40470

Props

Thanks to the 61 people who contributed to WordPress Core on Trac last week:

@costdev (12), @sergeybiryukov (11), @afercia (9), @poena (7), @audrasjb (7), @peterwilsoncc (6), @spacedmonkey (6), @aristath (6), @joedolson (5), @oglekler (4), @azaozz (4), @mukesh27 (3), @sabernhardt (3), @kebbet (3), @swissspidy (2), @joemcgill (2), @ntsekouras (2), @nrqsnchz (2), @NekoJonez (2), @antpb (2), @isabel_brison (2), @prashantbhivsane (2), @nihar007 (2), @piyushtekwani (1), @algorithmsunlocks (1), @mayur8991 (1), @flixos90 (1), @adamsilverstein (1), @nkeller15 (1), @drw158 (1), @chaion07 (1), @ocean90 (1), @chouby (1), @karmatosed (1), @james-roberts (1), @jrf (1), @talldanwp (1), @nidhidhandhukiya (1), @crs1138 (1), @johnbillion (1), @ignatggeorgiev (1), @pbiron (1), @ramonopoly (1), @ramonopoly.
(1), @Aristath (1), @kapilpaul (1), @oandregal (1), @krupalpanchal (1), @jorbin (1), @pamprn09 (1), @rianrietveld (1), @maniu (1), @hellofromTonya (1), @caraffande (1), @zunaid321 (1), @rsiddharth (1), @ryokuhi (1), @nataliat2004 (1), @xavortm (1), @menakas (1), @dd32 (1)

.

Congrats and welcome to our 9 new contributors of the week: @prashantbhivsane, @piyushtekwani, @algorithmsunlocks, @mayur8991, @nkeller15, @crs1138, @maniu, @caraffande, @nataliat2004 ♥️

Core committers: @sergeybiryukov (9), @peterwilsoncc (6), @joedolson (6), @spacedmonkey (5), @audrasjb (5), @isabel_brison (3), @oandregal (3), @swissspidy (2), @johnbillion (1), @azaozz (1).

#6-3, #core, #week-in-core