Hello 2015! Here’s your first release for the new year.

Update WP-CLI using WP-CLI

We’ve made it even easier to keep WP-CLI up to date. If you’re using the Phar file and it’s writable, you can call wp cli update to install the latest version.

$ ./wp-cli.0.17.1.phar cli update
You have version 0.17.1. Would you like to update to 0.18.0? [y/n] y
Downloading from https://github.com/wp-cli/wp-cli/releases/download/v0.18.0/wp-cli.phar...
New version works. Proceeding to replace.
Success: Updated WP-CLI to 0.18.0

Of course, if you’ve installed WP-CLI via Composer or Git, you should run master to always get the latest and greatest.

Manage post and user terms

WP-CLI supports managing terms associated with posts and users:

$ wp post term add 1 post_tag foo
Success: Added term.

$ wp post term add 1 post_tag bar
Success: Added term.

$ wp post term list 1 post_tag
| term_id | name | slug | taxonomy |
| 4       | bar  | bar  | post_tag |
| 3       | foo  | foo  | post_tag |

$ wp post term remove 1 post_tag foo bar
Success: Deleted term.

Consistent behavor for plugin activation and deactivation

We’ve cleaned up the behavior for activating and deactivating plugins:

  • If a plugin is already active, it’s allowed to become network active.
  • If a plugin is already network active, it’s not allowed to become active.
  • Network active plugins must be deactivated with the --network flag.
  • A warning will be thrown when an inactive plugin is attempted to be deactivated.

Previously, the behavior was quite inconsistent — sometimes you’d get errors, sometimes silent success, etc.

What’s coming in 2015

If I may editorialize a bit, I think 2015 could be an interesting year for WP-CLI.

The WP-API project has more overlap than you may think. The task of building a RESTful API for WordPress is also a task of preparing a useful abstraction to interact with WordPress internals. Instead of directly calling wp_update_post(), the API uses WP_JSON_Posts_Controller::update_item(), which is a consistent interface with WP_JSON_Terms_Controller::update_item() and WP_JSON_Users_Controller::update_item().

Similarly, we too have had to invent our own pattern of abstraction for interacting with WordPress internals. It would be nice if we could drop much of our code, and leverage WP-API instead. And, what if WP_JSON_Controller was the pattern we adopted for listing, getting, creating, updating, or deleting any WordPress primitive, which means that plugins implementing it would automatically have WP-CLI commands?

Plus, I’d think it would be quiet useful to have feature parity between what I can do locally with WP-CLI, and what I can do against a remote site via WP-API.

Other changes


  • Migrate users between sites in one go — wp user import-csv <file> supports CSV produced by wp user list --format=csv > <file>.
  • Use wp user list --network to list all users in your network.
  • All subcommand help docs also include global parameters, to give those global parameters more visibility.
  • If --help flag is passed, a command will now show the help screen instead of erroring on invalid parameters. Useful for debugging aforementioned errored parameters.
  • Similar to --skip-plugins=<plugin>,<plugin>, the --skip-themes global parameter allows you to skip loading specific themes when using WP-CLI. If you run a hosting company, this can be a useful way to blacklist known problem themes when performing maintenance.
  • wp core language improvements: Use wp core language list --fields=language --status=active to get the active language; install and activate a language with wp core language install <language> --activate; active language can’t be uninstalled.
  • wp (post|comment|term|user) get <object-id> supports --fields parameter for getting specific fields.
  • Use wp post update <object-id> to update a post’s content from a <file>.
  • Activate all installed plugins at once with wp plugin activate --all.
  • wp plugin list now indicates version numbers for mu plugins when they have properly formatted plugin headers.
  • Added support for specifying any version for wp plugin update <plugin>... --version=<version>. Previously, the parameter only supported ‘dev’.
  • wp option update <name> <value> will supply a friendly message when the option is already set to the supplied value.
  • Added alias from wp theme uninstall to wp theme delete, giving greater parity between theme and plugin interfaces.
  • Adopted a Debian package build script.

Bug fixes:

  • Resolved a nasty file cache collision between wp core update and wp core download. WP_CLI\CoreUpgrader was renaming ZIP files to .tar.gz, which wp core download would then attempt to use.
  • If a file required by wp-cli.yml or --require is missing, WP-CLI will throw a human-friendly error instead of fataling.
  • wp cli info runs early to protect from invalid runtime configurations.
  • wp core config will only define WPLANG for WP < 4.0.
  • /bin/install-wp-tests.sh fixes: Properly marked executable when scaffolding plugin unit tests; works on older versions of Bash; added support for WP_CORE_DIR environment variable.
  • wp comment (approve|unapprove) will actually change comment status.
  • wp_is_mobile() is defined, avoiding fatals in some themes and plugins.
  • Windows fixes: disabled colors by default; allows deleting plugins that aren’t in folders (e.g. Hello Dolly).
  • Throws an error when trying to get meta on a missing object, instead of silently failing.
  • Throws an error when trying to install multisite with subdomains when domain is localhost.
  • Doesn’t force update check on wp plugin install to reduce dependency on WordPress.org.

You can browse the full list of resolved issues on Github.

Contributors to this release: viper007bond, boonebgorges, borekb, bparbs, danielbachhuber, here, miya0001, nyordanov, oneumyvakin, ozh, pippinsplugins, rodrigoprimo, spacedmonkey, ntwb, lordspace, szepeviktor, tiagohillebrandt, wturrell