Executing Commands Inside Another Command with WP_CLI::runcommand()

Advertisement

In this article let’s learn about how to execute another WP CLI commands.

Note: If you read some recent articles then you can skip some below steps that are related to plugin creation.

Create Empty Plugin Create Empty Plugin

  • Create a new folder wordpress-examples into plugins directory /wp-content/plugins/
  • Create a file wordpress-examples.php and add the below code into it.
<?php
 /**
 Plugin Name: WordPress Examples
 */ 

Note: If you want to add some additional information then you can get it from gist snippet – WordPress Complete Plugin Readme File.

Now you can see our WordPress Examples plugin exists into the plugins list.

Executing WP CLI commands inside WP CLI command with WP_CLI::runcommand() 1
Executing WP CLI commands inside WP CLI command with WP_CLI::runcommand() 3

Now, Activate the WordPress Examples plugin.

Executing WP CLI commands inside WP CLI command with WP_CLI::runcommand() 2
Executing WP CLI commands inside WP CLI command with WP_CLI::runcommand() 4

Top ↑

Register WP CLI Command Register WP CLI Command

Register PHP class WordPress_Examples_WP_CLI e.g.

if ( ! class_exists( 'WordPress_Examples_WP_CLI' ) && class_exists( 'WP_CLI_Command' ) ) :
       class WordPress_Examples_WP_CLI extends WP_CLI_Command {

       }
endif;

Here,

We have registered a new class WordPress_Examples_WP_CLI and extend it with WP_CLI_Command.

Top ↑

Add Examples Command Add Examples Command

Now let’s register the examples. E.g.

       WP_CLI::add_command( 'examples', 'WordPress_Examples_WP_CLI' ); 

Here,

We have used the function WP_CLI::add_command() to register our examples command.

The function WP_CLI::add_command() accepts 2 parameters. The first parameter is the command name. Which is examples in our case.

And second is a callback class which is WordPress_Examples_WP_CLI.

Top ↑

Add execute_commands sub command Add execute_commands sub command

         public function execute_commands( $args, $assoc_args ) {
           WP_CLI::line( 'Hello' );
         }

Here,

We have added a function execute_commands() with two parameters.

  • $args contain the arguments.
  • $assoc_args contain the associate arguments.

Top ↑

Testing the Command Testing the Command

Open command prompt/terminal. Go to your WordPress setup. I have set up WordPress in D:\xampp\htdocs\dev.test

So, Execute the below commands:

  • cd D:\xampp\htdocs\dev.test
  • wp examples execute_commands

You can see the output something like below:

 ? wp examples execute_commands
 Hello

This command just shows the string Hello.

Top ↑

Using WP_CLI::runcommand() Using WP_CLI::runcommand()

Its time to execute another command in our WP CLI command with WP_CLI::runcommand().

public function execute_commands( $args, $assoc_args ) {
	WP_CLI::runcommand( 'cli info' );
}

Let’s execute the command wp examples execute_commands.

? wp examples execute_commands
 OS:     Windows NT 6.1 build 7601 (Windows 7 Ultimate Edition Service Pack 1) i586
 Shell:  C:\Windows\system32\cmd.exe
 PHP binary:     D:\xampp\php\php.exe
 PHP version:    7.0.8
 php.ini used:   D:\xampp\php\php.ini
 WP-CLI root dir:        phar://wp-cli.phar/vendor/wp-cli/wp-cli
 WP-CLI vendor dir:      phar://wp-cli.phar/vendor
 WP_CLI phar path:       D:\xampp\htdocs\dev.test
 WP-CLI packages dir:    C:\Users\intel/.wp-cli/packages/
 WP-CLI global config:
 WP-CLI project config:
 WP-CLI version: 2.4.0
 D:\xampp\htdocs\dev.test

Here, we see the result of the WP CLI command wp cli info.

Note: When we use the function WP_CLI::runcommand() then we don’t need to pass the prefix wp. So, wp cli info should be cli info.

Top ↑

Experiment with Examples Experiment with Examples

Example 1

public function execute_commands( $args, $assoc_args ) {
	// Execute `wp cli info` CLI command.
	WP_CLI::runcommand( 'cli info' );
	// Execute `wp plugin list --status=active` CLI command.
	WP_CLI::runcommand( 'plugin list --status=active' );
}

Lets execute command wp examples execute_commands.

? wp examples execute_commands
 OS:     Windows NT 6.1 build 7601 (Windows 7 Ultimate Edition Service Pack 1) i586
 Shell:  C:\Windows\system32\cmd.exe
 PHP binary:     D:\xampp\php\php.exe
 PHP version:    7.0.8
 php.ini used:   D:\xampp\php\php.ini
 WP-CLI root dir:        phar://wp-cli.phar/vendor/wp-cli/wp-cli
 WP-CLI vendor dir:      phar://wp-cli.phar/vendor
 WP_CLI phar path:       D:\xampp\htdocs\dev.test
 WP-CLI packages dir:    C:\Users\intel/.wp-cli/packages/
 WP-CLI global config:
 WP-CLI project config:
 WP-CLI version: 2.4.0
 +--------------------+--------+--------+---------+
 | name               | status | update | version |
 +--------------------+--------+--------+---------+
 | wordpress-examples | active | none   |         |
 +--------------------+--------+--------+---------+

Here, we have executed two commands.

  • wp cli info – It displays the WP CLI information.
  • wp plugin list --status=active – It displays active plugins.

Example 2

public function execute_commands( $args, $assoc_args ) {
	WP_CLI::runcommand( 'plugin list --format=json --status=active' );
}
? wp examples execute_commands
 [{"name":"wordpress-examples","status":"active","update":"none","version":""}]

Example 3

Lets, Get the result of the command in a variable to perform some operations like:

public function execute_commands( $args, $assoc_args ) {
	$options = array(
	  'return'     => true,   // Return 'STDOUT'; use 'all' for full object.
	  'parse'      => 'json', // Parse captured STDOUT to JSON array.
	  'launch'     => false,  // Reuse the current process.
	  'exit_error' => true,   // Halt script execution on error.
	);
	$plugins = WP_CLI::runcommand( 'plugin list --format=json --status=active', $options );
	foreach ($plugins as $key => $plugin) {
		WP_CLI::line( $plugin['name'] . ' status is ' . $plugin['status'] );
	}
}
? wp examples execute_commands
 wordpress-examples status is active

Here, In function WP_CLI::runcommand() we have passed 2 arguments.

  • First is plugin list --format=json --status=active which is the WP CLI command.
  • And second is the $options which is the array of configuration values.

Example 4

public function execute_commands( $args, $assoc_args ) {
	$options = array(
	  'return'     => true,   // Return 'STDOUT'; use 'all' for full object.
	  'parse'      => 'json', // Parse captured STDOUT to JSON array.
	  'launch'     => false,  // Reuse the current process.
	  'exit_error' => true,   // Halt script execution on error.
	);
	$posts = WP_CLI::runcommand( 'post list --format=json', $options );
	foreach ($posts as $key => $post) {
		WP_CLI::line( $post['ID'] . ' | ' . $post['post_title'] );
	}
}
? wp examples execute_commands
 162 | Sample Post
 160 | Sample Post
 89 | Another Post
 1 | Hello world!

Oh! Don’t forget that we learned about the class \WP_CLI\Formatter(). It displays the well-formatted data.

Let’s try to implement it in the above example.

public function execute_commands( $args, $assoc_args ) {
	$options = array(
	  'return'     => true,   // Return 'STDOUT'; use 'all' for full object.
	  'parse'      => 'json', // Parse captured STDOUT to JSON array.
	  'launch'     => false,  // Reuse the current process.
	  'exit_error' => true,   // Halt script execution on error.
	);
	$posts = WP_CLI::runcommand( 'post list --format=json', $options );
	$display_fields = array(
		'ID',
		'post_title',
	);
	$formatter      = new \WP_CLI\Formatter( $assoc_args, $display_fields );
	$formatter->display_items( $posts );
}

Now, Execute wp examples execute_commands.

? wp examples execute_commands
 +-----+--------------+
 | ID  | post_title   |
 +-----+--------------+
 | 162 | Sample Post  |
 | 160 | Sample Post  |
 | 89  | Another Post |
 | 1   | Hello world! |
 +-----+--------------+

We can see the data in the table format. To demonstrate the WP_CLI::runcommand() I have used posts example.

You can use the command wp post list to list the posts. E.g.

? wp post list                                                            
 +-----+--------------+---------------+---------------------+-------------+
 | ID  | post_title   | post_name     | post_date           | post_status |
 +-----+--------------+---------------+---------------------+-------------+
 | 162 | Sample Post  | sample-post-2 | 2019-11-05 02:11:16 | publish     |
 | 160 | Sample Post  | sample-post   | 2019-11-05 02:10:05 | publish     |
 | 89  | Another Post | another-post  | 2019-10-15 23:32:57 | publish     |
 | 1   | Hello world! | hello-world   | 2019-10-05 08:23:44 | publish     |
 +-----+--------------+---------------+---------------------+-------------+

Executing WP CLI commands inside WP CLI command with WP_CLI::runcommand().

Leave a Reply