A new release of WP-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/, WP-CLI v2.12.0, is now available. For this release, we had 68 contributors collaborate to get 382 pull requests merged. 
As always, big thanks to the WP-CLI sponsors that make the continued maintenance possible.
This release includes numerous bug fixes and compatibility improvements, but we still could teach WP-CLI a few new tricks which I’ll highlight below. As always, you can also skip directly to the detailed changelog if you prefer.
If you already use WP-CLI, updating is as simple as wp cli update. Else, check out our website for recommended installation methods.
Pluck & patch commands for caches and transients
The cache and transient commands have now also learned the subtle art of plucking and patching. This means that you can directly manipulate individual entries in an array of values that these commands let you manage.
Here’s an example of how such an operation can look and how it compare to the regular cache/transient operations:
# Transient structure
# 'some_key' => ['foo' => ['bar' => 'baz']]
# Retrieve the transient value
$ wp transient get some_key --format=json
{'foo':{'bar':'baz'}}
# Retrieve the value of the foo => bar subkey
$ wp transient pluck some_key foo bar
baz
# Replace baz with bazzer
$ wp transient patch update some_key foo bar bazzer
Success: Updated transient 'some_key'.
Post lists can now handle complex query flags
When using post list, you can now use JSON 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. notation to provide complex query arguments to the --tax_query, --meta_query and --post_date fields.
$ wp post list --field=post_title --date_query='{"before":{"year":"2024"}}
+--------------------------+
| post_title               |
+--------------------------+
| My year in review - 2021 |
| My year in review - 2022 |
| My year in review - 2023 |
+--------------------------+
$ wp post list --field=post_title --tax_query='[{"taxonomy":"category","field":"slug","terms":"first-category"}]'
...
$ wp post list --field=post_title --meta_query='[{"key":"key2","value":"value2b"}]'
...
Post meta 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. can be forced to only return a single value
The post meta get command now has a --single flag defaulting to true which can be negated with --no-single. This flag tells WordPress whether to only return a single value or all existing values for a given key.
# Create a post meta key for post with ID 123 that has multiple values
$ wp post meta add 123 my_meta_key value_1
$ wp post meta add 123 my_meta_key value_2
$ wp post meta add 123 my_meta_key value_4
# Retrieve a single value
$ wp post meta get 123 my_meta_key --single
value_1
# Retrieve all values
$ wp post meta get 123 my_meta_key --no-single --format=json
["value_1","value_2","value_3"]
Exclude files on core checksum verification
When running a core checksum verification, you can exclude one or more files from the checksum verification with the new --exclude=<files> flag, which takes a comma-separated list of filepaths relative to the current root.
# Make a change to the README file in the WordPress core root folder
$ echo "nonsense" > readme.html
# Run the core checksum verification
$ wp core verify-checksums --exclude='readme.html'
Success: WordPress installation verifies against checksums.
Respect requires and requires_php tags for plugins and themes
The plugin 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 commands now understand and respect the requires and requires_php header 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. tags when trying ot install or update extensions. A new state unavailable has been introduced to denote the updates that are newer that your current installation but for which your site does not fulfill the requirements.
This also adds new fields requires and requires_php which are displayed if they contain relevant information and otherwise hidden by default.
$ wp plugin list
+----------------+----------+-------------+---------+----------------+-------------+----------+--------------+
| name           | status   | update      | version | update_version | auto_update | requires | requires_php |
+----------------+----------+-------------+---------+----------------+-------------+----------+--------------+
| akismet        | inactive | available   | 5.1     | 5.3.5          | off         | 5.8      | 5.6.20       |
| edit-flow      | inactive | none        | 0.9.9   |                | off         | 6.0      | 8.0          |
| wp-super-cache | inactive | unavailable | 1.9.4   | 1.12.4         | off         | 6.5      | 7.0          |
+----------------+----------+-------------+---------+----------------+-------------+----------+--------------+
$ wp plugin update wp-super-cache
Warning: wp-super-cache: This update requires WordPress version 6.5, but the version installed is 6.2.
Error: No plugins updated.
More control over make-json generation
The make-json command was made more powerful again. You can not only set a custom text domain to be used, you can also define the file extension to parse.
# Use a custom text domain
$ wp i18n make-json foo-theme --domain=my-custom-domain
Success: Created 1 file.
# Include typescript files
$ wp i18n make-json foo-theme --extensions=".ts, .tsx"
Success: Created 2 files.
Force update checks on plugin|theme list
When displaying the list of plugins or themes, WP-CLI now always ensures you get fresh data. No need to manually clear transients anymore! The existing --skip-update-check flag can be used to prevent this behavior.
# Clears any update transients to trigger an update check and display results
$ wp plugin list --fields=name,status,update --force-check
+-------------+----------+--------+
| name        | status   | update |
+-------------+----------+--------+
| hello-dolly | inactive | none   |
+-------------+----------+--------+
PHP PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. https://www.php.net/manual/en/preface.php. 8.4 Compatiblity
WP-CLI is now fully compatible with PHP 8.4. This has required quite a bit of trickery and hacks to maintain compatibility with our current minimum of PHP 5.6+ at the same time. With the next release, we’ll bump the minimum PHP version to 7.2.24+, which will allow us to get rid of all these workarounds again.
Detailed Change Log
- Fix Phar path resolution with renamed binaries [#752]
 
- Deployment: Fix 
FILENAME env var [#696] 
- Address deprecation warnings in Behat tests [#663]
 
- Replace 
duplicate-post plugin with debug-bar in feature tests [#6091] 
- Use forked 
mustache library [#6090] 
- Escape CSV output [#6089]
 
- Make sure existing 
esc_like() takes precedence [#6088] 
- Set 
display_errors to stderr (lowercase) instead of STDERR [#6084] 
- Fix update step for nightlies [#6075]
 
- Detect MariaDB vs MySQL 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/. [#6072]
 
- Update WP-CLI update message [#6071]
 
- Add 
WP_CLI_REQUIRE environment variable for including extra PHP files [#6070] 
- Remove 
array_column() compatibility function [#6068] 
- Support multiple files in 
WP_CLI_EARLY_REQUIRE [#6065] 
- Properly create missing WP-CLI configuration file when needed [#6062]
 
- Improve command suggestions for taxonomies and post types [#6059]
 
- Fix undefined variable issue [#6058]
 
- Pass 
working-directory and stdin to docker scheme [#5974] & [#6057] 
- Add test for line breaks in table view [#6055]
 
- Ensure code after 
wp-settings.php call is loaded [#6042] 
- Allow collecting PHPUnit coverage [#6041]
 
- don’t forcefully 
exec() docker version [#6040] 
- Improve regular expression for detecting 
wp-settings.php [#6039] 
- Check PHP version requirement in update check [#6037]
 
- Add hook to 
http_request() utility function [#6036] 
- Add PHPDoc for 
cmd_starts_with() method [#6034] 
- Update expected error message in unit tests [#6032]
 
- Update outdated AJAX documentation link [#6031]
 
- Add global documentation [#6017]
 
- Allow remote binary customization [#6013]
 
- Add configurable user agent to WP-CLI to detect in firewall logs [#5998]
 
- Convert PHPUnit deprecations into exceptions [#5994]
 
- Remove unused automerge workflow [#5992]
 
- Fix CSV escaping deprecation notices [#5991]
 
- Check for root earlier [#5987]
 
- Remove use of 
E_STRICT  for wp_debug_mode() [#5986] 
- Fix deprecation notices for 
ReflectionProperty::setValue() [#5984] 
- Fix “missing return type” deprecation warnings in 
WP_CLI\Iterators\CSV [#5983] 
- Fix implicitly nullable parameters [#5982]
 
- Update Requests to v2.0.12 [#5981]
 
- Update log and warning logger functions comment according to the actual functionality [#5979]
 
- Add defaults and accepted values for 
runcommand() options in documentation [#5953] 
- Update documentation to include new 
WP_CLI_SSH_BINARY value [#559] 
- Add documentation for newly supported 
ENV vars [#556] 
- Update URL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org for True-False Hosting [#553]
 
- Fix expired transients tests [#104]
 
- Allow manually dispatching tests workflow [#99]
 
- Make transient test more robust against added transients by core Core is the set of software required to run WordPress. The Core Development Team builds WordPress. [#98]
 
- Add 
pluck & patch commands for caches and transients [#89] 
- Add blank space when trimming the version [#130]
 
- Add 
--exclude argument for verifying checksums [#123] 
- Remove unused variable [#134]
 
- Don’t check missing files [#131]
 
- Don’t require file to be writable for 
config has [#187] 
- Suppress output of 
eval(get_wp_config_code) preventing errors printing twice [#188] 
- Fix flaky tests due to changing download URL [#277]
 
- Allow installing major version with trailing zero [#276]
 
- Use existing 
WpOrgApi helper class [#283] 
- Add doc comment for 
$insecure [#281] 
- Host shouldn’t include 
http:// [#279] 
- Harden test checking for log file [#111]
 
- Correct error message in 
db search for --format=count [#267] 
- Update 
db search documentation [#265] 
- Add 
--add-drop-table to export command options [#263] 
- Improve MariaDB detection/compatibility [#280]
 
- Add affected rows count for queries that can modify data in 
db query [#277] 
- Don’t hardcode MySQL command names [#275]
 
- Add missing options header in 
signup list command [#508] 
- Ensure 
user update returns non-zero exit code for invalid users [#527] 
- Make 
term-migrate test more robust [#524] 
- Add a flag for getting post meta as a single value or not [#523]
 
- Add JSON input support for 
tax_query and meta_query [#522] 
- Add JSON input support for 
date_query argument [#520] 
wp option – new autoload values in autoload filter 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. [#515] 
- Return a proper 
WP_Error object when failing to update a comment [#514] 
- Add test cases asserting 
post/term update error exit codes [#513] 
- Safeguard 
remove cap from collisions with roles [#530] 
- Use 
get_post_stati() instead of get_post_statuses() to support all registered post statuses in export [#121] 
- Use 
strpos() instead of str_contains() in get_wporg_data() function [#432] 
- Don’t use transient values when doing 
plugin|theme list [#446] 
- Fix fatal error issue in 
in_array() function [#445] 
- Support 
requires and requires_php in plugin|theme list and plugin|theme update commands [#440] 
- Update logic when deleting and uninstalling plugins [#438]
 
- Check WordPress and PHP requirements before installing a theme or plugin [#436]
 
- Add 
--force-check flag to wp plugin list and wp theme list. [#426] 
- Cache certain GitHub 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/ URLs [#385]
 
- Convert PHPUnit deprecations to exceptions [#413]
 
make-pot: scan any theme.json file in any level [#424] 
- Add ability to pass extensions to 
make-json command [#439] 
- Update schema fallback files [#431]
 
make-json: Add new --domain argument [#430] 
update-po: merge X-Domain header [#429] 
- Add 
php-format and js-format flags [#428] 
- Mention 
site switch-language in readme [#159] 
- Allow filtering languages by multiple statuses [#162]
 
- Example code: remove use of 
E_STRICT [#175] 
- Fix implicitly nullable parameters [#173]
 
- Replace tabs in tables with 4 spaces [#181]
 
- Properly handle line breaks in column value [#179]
 
- Support line breaks and tab replacement in tabular table values [#182]
 
- Fix removal of trailing tab / whitespace in tabular table [#184]
 
- Avoid deprecation warnings in newer PHP [#185]
 
- Improve warning message in 
rewrite flush [#69] 
- Convert PHPUnit deprecations to exceptions [#348]
 
- Add dependency checks and error handling for 
svn and download tools [#345] 
- Accept Bitbucket as valid CI in 
scaffold plugin [#340] 
- Update Bitbucket CI [#339]
 
- Update templates for child 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/. scaffolding [#342]
 
- Update custom post type WordPress can hold and display many different types of content. A single item of such a content is generally called a post, although post is also a specific post type. Custom Post Types gives your site the ability to have templated posts, to simplify the concept. and taxonomy 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. scaffolding [#341]
 
- Update GitLab CI configuration file [#338]
 
- Remove 
grunt from plugin scaffolding [#337] 
- Add missing 
do construct [#68] 
- Add read-only option for 
WPConfigTransformer [#54] 
- Add a 
branch-alias for dev-main [#55] 
- Deletion of constants deletes more lines than expected [#53]
 
Contributors
@9ete, @amirhmoradi, @baizmandesign, @benjaminprojas, @BhargavBhandari90, @cliffordp, @daalderp, @dac514, @danielbachhuber, @dd32, @dkoston, @dlind1, @drzraf, @elenachavdarova, @ernilambar, @gedex, @gitlost, @greatislander, @herregroen, @i-am-chitti, @iDschepe, @imrraaj, @itsmekopila, @janw-me, @jenkoian, @jkrrv, @jrfnl, @karthick-murugan, @l3ku, @localheinz, @marksabbath, @matiasbenedetto, @matzeeable, @meszarosrob, @michaelw85, @michaelzangl, @mostafasoufi, @mrsdizzie, @oandregal, @ocean90, @ouikhuan, @PARTHVATALIYA, @pbiron, @peterwilsoncc, @petitphp, @pfefferle, @pmbaldha, @ponsfrilus, @pwtyler, @ramonjd, @rodrigoprimo, @Roy-Orbison, @saas786, @sabithahmd, @sdnunca, @shendy-a8c, @shreya0204, @siliconforks, @strarsis, @swissspidy, @todeveni, @Tug, @tyrann0us, @wojsmol, @wpeople-dev, @WPprodigy, @yousan
#release, #v2-12-0