/** * Set the logger instance. * * @param object $logger */ public static function set_logger($logger) { self::$logger = $logger; }
/** * Run a WP-CLI command. * * Launch a new child process, or run the command in the current process. * Optionally: * * Prevent halting script execution on error. * * Capture and return STDOUT, or full details about command execution. * * Parse JSON output if the command rendered it. * * ``` * $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', $options ); * ``` * * @access public * @category Execution * * @param string $command WP-CLI command to run, including arguments. * @param array $options Configuration options for command execution. * @return mixed */ public static function runcommand($command, $options = array()) { $defaults = array('launch' => true, 'exit_error' => true, 'return' => false, 'parse' => false); $options = array_merge($defaults, $options); $launch = $options['launch']; $exit_error = $options['exit_error']; $return = $options['return']; $parse = $options['parse']; $retval = null; if ($launch) { if ($return) { $descriptors = array(0 => STDIN, 1 => array('pipe', 'w'), 2 => array('pipe', 'w')); } else { $descriptors = array(0 => STDIN, 1 => STDOUT, 2 => STDERR); } $php_bin = self::get_php_binary(); $script_path = $GLOBALS['argv'][0]; // Persist runtime arguments unless they've been specified otherwise. $configurator = \WP_CLI::get_configurator(); $argv = array_slice($GLOBALS['argv'], 1); list($_, $_, $runtime_config) = $configurator->parse_args($argv); foreach ($runtime_config as $k => $v) { if (preg_match("|^--{$key}=?\$|", $command)) { unset($runtime_config[$k]); } } $runtime_config = Utils\assoc_args_to_str($runtime_config); $runcommand = "{$php_bin} {$script_path} {$runtime_config} {$command}"; $env_vars = array('HOME', 'WP_CLI_AUTO_CHECK_UPDATE_DAYS', 'WP_CLI_CACHE_DIR', 'WP_CLI_CONFIG_PATH', 'WP_CLI_DISABLE_AUTO_CHECK_UPDATE', 'WP_CLI_PACKAGES_DIR', 'WP_CLI_PHP_USED', 'WP_CLI_PHP', 'WP_CLI_STRICT_ARGS_MODE'); $env = array(); foreach ($env_vars as $var) { $env[$var] = getenv($var); } $proc = proc_open($runcommand, $descriptors, $pipes, getcwd(), $env); 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."); } else { if ($return_code && $exit_error) { exit($return_code); } } if (true === $return || 'stdout' === $return) { $retval = trim($stdout); } else { if ('stderr' === $return) { $retval = trim($stderr); } else { if ('return_code' === $return) { $retval = $return_code; } else { if ('all' === $return) { $retval = (object) array('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) { ob_start(); $existing_logger = self::$logger; self::$logger = new WP_CLI\Loggers\Execution(); } if (!$exit_error) { self::$capture_exit = true; } try { self::get_runner()->run_command($args, $assoc_args, array('back_compat_conversions' => true)); $return_code = 0; } catch (ExitException $e) { $return_code = $e->getCode(); } if ($return) { $execution_logger = self::$logger; self::$logger = $existing_logger; $stdout = trim(ob_get_clean()); $stderr = $execution_logger->stderr; if (true === $return || 'stdout' === $return) { $retval = trim($stdout); } else { if ('stderr' === $return) { $retval = trim($stderr); } else { if ('return_code' === $return) { $retval = $return_code; } else { if ('all' === $return) { $retval = (object) array('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; }