Repository navigation
--skip-plugins is ignored on WordPress 7.0.4 and higher under specific circumstances. #548
Description
Activity
- addedcommand:plugin-updateRelated to 'plugin update' commandRelated to 'plugin update' command
on Sep 4, 2026 I think this is less about
--skip-pluginsnot working, but more about transients changing between update runs, as a different set of plugins is running.We're working on WP-CLI v3 which contains a bunch of improvements in this area (see below). I'd recommend keeping an eye on this again after updating. You may also try WP-CLI nightly to test it already now.
Related:
I reproduced this without any premium plugin or license, and narrowed it down, so sharing the full picture.
Repro fixture: a 20 line plugin whose only job is to mimic an unlicensed premium updater, it filters
pre_set_site_transient_update_pluginsand injects an update entry with an empty package. With that active, the reported sequence reproduces exactly:wp plugin update premium-simfails honestly, the first--skip-pluginsrun fails honestly, and the second--skip-pluginsrun printsSuccess: Plugin already updated.while the old version is still installed.Mechanism, verified by dumping the stored transient between runs: the first
--skip-pluginsrun itself rewrites the transient, the entry is gone andlast_checkedis bumped during that run. The failed bulk update still reaches plugin update-cache cleanup, and theupgrader_process_completepath can immediately callwp_update_plugins()with timeout0. With--skip-plugins, that refetch happens without the premium updater code, so the refreshed transient loses the premium update entry. The next run reads that transient, finds no update for the plugin, and reports it as already updated.I also checked several real premium products locally to see how representative the fixture is. Both updater architectures are in use: some hook
pre_set_site_transient_update_plugins, the write-time shape the fixture models, Elementor Pro among them, some inject only at read time throughsite_transient_update_plugins, and one hooks both. A theme with the same two hooks onupdate_themesshows--skip-themescarries the same shapes. The two classes fail differently under skip flags: write-time entries survive in the stored transient until a failed skipped run rewrites it, which is the three run sequence above, while read-time entries are never in the stored transient at all, so the false already updated can appear on the first skipped run. I observed exactly that once with one extension, its update showed in a fresh loaded check while--skip-pluginsreported already updated, but its update API became flaky before I could script a reliable repeat. Both classes converge on the same gap: with skip flags active, the requested plugin or theme can be absent from bothresponseandno_updatewhile a skipped updater would have supplied an update.On the version claim: I could not confirm the 7.0.4 boundary. The identical sequence behaves the same way on a clean WordPress 7.0.3 official Docker image, and the 7.0.4 release contains no changes to the update or upgrader code paths, it was an Imagick security release. So the observation may have started around August 20, but a 7.0.4 core change is probably not the cause.
Also tested on the current v3 alpha build from the framework main branch: same false success, so the v3 improvements do not seem to cover this case.
One possible direction: when
--skip-pluginsor--skip-themesis active and the requested plugin or theme appears in neitherresponsenorno_update, the update command could warn that the update status is unknown because the plugin's own code is skipped, instead of reporting success. That path is shared with real no-update cases, so it needs careful implementation.Reacted by Pascal BirchlerReacted by Brecht Ryckaert- linked a pull request that will close this issueFix update checks when --skip-plugins or --skip-themes is used #553
on Sep 15, 2026
Bug Report
Describe the current, buggy behavior
We have automated updates using WP-CLI on our hosting-cluster. We notice that since August 20th, this behaviour is occurring on a lot of sites of customer that have built their sites with a premium plugin but lack a valid license or have an expired license.
How it occurs
Every night we run several wp-cli commands to deploy updates of plugins and themes. We use WP-CLI for this, obviously.
So at this point, to ensure we do not hit a blocking factor due to a plugin conflict, we'll repeat the command with the --skip-plugins option:
Now here's the weird thing. If you then run that same command again, this suddenly declares that the plugin did update (even when it did not):
This only occurs on the second time you run the same command with the --skip-plugins option.
We have seen this occur consistently on several premium plugins in combination with WordPress 7.0.4 or 7.1. We did not see this behaviour in combination with earlier versions of core.
Describe how other contributors can replicate this bug
To replicate you'll need these things:
How to replicate:
(for this example I'll assume you are also testing with js_composer, update your plugin name accordingly when testing with another plugin)
Expected outcome
The first two commands will result in:
Error: No plugins updated (1 failed).The third command will result in:
Success: Plugin already updated.Let us know what environment you are running this on
Sadly I'm not able to provide a solution just yet, as I am still trying to figure out where the cause originates.