WP_CLI::runcommandpublic staticWP-CLI 1.0

Run a WP-CLI command.

Launches a new child process to run a specified WP-CLI command. Optionally:

  • Run the command in an existing process.
  • Prevent halting script execution on error.
  • Capture and return STDOUT, or full details about command execution.
  • Parse JSON output if the command rendered it.
  • Include additional arguments that are passed to the command.
$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.
  'command_args' => [ '--skip-themes' ], // Additional arguments to be passed to the $command.
);
$plugins = WP_CLI::runcommand( 'plugin list --format=json', $options );

Method of the class: WP_CLI{}

No Hooks.

Returns

Mixed.

Usage

$result = WP_CLI::runcommand( $command, $options );
$command(string) (required)
WP-CLI command to run, including arguments.
$options(array)

Configuration options for command execution.

Default: []

  • launch(true|false)
    Launches a new process (true) or reuses the existing process (false).
    Default: true

  • exit_error(true|false)
    Halts the script on error.
    Default: true

  • return(true|false|string)
    Returns output as an object when set to 'all' (string), return just the 'stdout', 'stderr', or 'return_code' (string) of command, or print directly to stdout/stderr (false).
    Default: false

  • parse(true|false|string)
    Parse returned output as 'json' (string); otherwise, output is unchanged (false).
    Default: false

WP_CLI::runcommand() code WP-CLI 2.13.0-alpha

public static function runcommand( $command, $options = [] ) {
	$defaults     = [
		'launch'       => true,  // Launch a new process, or reuse the existing.
		'exit_error'   => true,  // Exit on error by default.
		'return'       => false, // Capture and return output, or render in realtime.
		'parse'        => false, // Parse returned output as a particular format.
		'command_args' => [],    // Include optional command arguments.
	];
	$options      = array_merge( $defaults, $options );
	$launch       = $options['launch'];
	$exit_error   = $options['exit_error'];
	$return       = $options['return'];
	$parse        = $options['parse'];
	$command_args = $options['command_args'];

	if ( ! empty( $command_args ) ) {
		$command .= ' ' . implode( ' ', $command_args );
	}

	$retval = null;
	if ( $launch ) {
		Utils\check_proc_available( 'launch option' );

		$descriptors = [
			0 => STDIN,
			1 => STDOUT,
			2 => STDERR,
		];

		if ( $return ) {
			$descriptors = [
				0 => STDIN,
				1 => [ 'pipe', 'w' ],
				2 => [ 'pipe', 'w' ],
			];
		}

		$php_bin     = escapeshellarg( Utils\get_php_binary() );
		$script_path = $GLOBALS['argv'][0];

		// Persist runtime arguments unless they've been specified otherwise.
		$configurator = self::get_configurator();
		$argv         = array_slice( $GLOBALS['argv'], 1 );

		list( $ignore1, $ignore2, $runtime_config ) = $configurator->parse_args( $argv );
		foreach ( $runtime_config as $k => $v ) {
			if ( preg_match( "|^--{$k}=?$|", $command ) ) {
				unset( $runtime_config[ $k ] );
			}
		}
		$runtime_config = Utils\assoc_args_to_str( $runtime_config );

		$runcommand = "{$php_bin} {$script_path} {$runtime_config} {$command}";

		$pipes = [];
		$proc  = Utils\proc_open_compat( $runcommand, $descriptors, $pipes, getcwd() );

		$stdout = '';
		$stderr = '';

		if ( $return ) {
			$stdout = stream_get_contents( $pipes[1] );
			fclose( $pipes[1] );
			$stderr = stream_get_contents( $pipes[2] );
			fclose( $pipes[2] );
		}
		$return_code = proc_close( $proc );
		if ( -1 === $return_code ) {
			self::warning( 'Spawned process returned exit code -1, which could be caused by a custom compiled version of PHP that uses the --enable-sigchild option.' );
		} elseif ( $return_code && $exit_error ) {
			exit( $return_code );
		}
		if ( true === $return || 'stdout' === $return ) {
			$retval = trim( $stdout );
		} elseif ( 'stderr' === $return ) {
			$retval = trim( $stderr );
		} elseif ( 'return_code' === $return ) {
			$retval = $return_code;
		} elseif ( 'all' === $return ) {
			$retval = (object) [
				'stdout'      => trim( $stdout ),
				'stderr'      => trim( $stderr ),
				'return_code' => $return_code,
			];
		}
	} else {
		$configurator                               = self::get_configurator();
		$argv                                       = Utils\parse_str_to_argv( $command );
		list( $args, $assoc_args, $runtime_config ) = $configurator->parse_args( $argv );
		if ( $return ) {
			$existing_logger = self::$logger;
			self::$logger    = new Execution();
			self::$logger->ob_start();
		}
		if ( ! $exit_error ) {
			self::$capture_exit = true;
		}
		try {
			self::get_runner()->run_command(
				$args,
				$assoc_args,
				[
					'back_compat_conversions' => true,
				]
			);
			$return_code = 0;
		} catch ( ExitException $e ) {
			$return_code = $e->getCode();
		}
		if ( $return ) {
			$execution_logger = self::$logger;
			$execution_logger->ob_end();
			self::$logger = $existing_logger;
			$stdout       = $execution_logger->stdout;
			$stderr       = $execution_logger->stderr;
			if ( true === $return || 'stdout' === $return ) {
				$retval = trim( $stdout );
			} elseif ( 'stderr' === $return ) {
				$retval = trim( $stderr );
			} elseif ( 'return_code' === $return ) {
				$retval = $return_code;
			} elseif ( 'all' === $return ) {
				$retval = (object) [
					'stdout'      => trim( $stdout ),
					'stderr'      => trim( $stderr ),
					'return_code' => $return_code,
				];
			}
		}
		if ( ! $exit_error ) {
			self::$capture_exit = false;
		}
	}
	if ( ( true === $return || 'stdout' === $return )
		&& 'json' === $parse ) {
		$retval = json_decode( $retval, true );
	}
	return $retval;
}