<?php
if (!defined('ABSPATH')) {
exit;
}
class WC_CLI_Runner
{
private static $disabled_endpoints = array('settings', 'settings/(?P<group_id>[\\w-]+)', 'settings/(?P<group_id>[\\w-]+)/batch', 'settings/(?P<group_id>[\\w-]+)/(?P<id>[\\w-]+)', 'system_status', 'system_status/tools', 'system_status/tools/(?P<id>[\\w-]+)', 'reports', 'reports/sales', 'reports/top_sellers');
private static $target_rest_version = 'v2';
public static function after_wp_load()
{
global $wp_rest_server;
$wp_rest_server = new WP_REST_Server();
do_action('rest_api_init', $wp_rest_server);
$request = new WP_REST_Request('GET', '/');
$request->set_param('context', 'help');
$response = $wp_rest_server->dispatch($request);
$response_data = $response->get_data();
if (empty($response_data)) {
return;
}
foreach ($response_data['routes'] as $route => $route_data) {
if (substr($route, 0, 4 + strlen(self::$target_rest_version)) !== '/wc/' . self::$target_rest_version) {
continue;
}
if (empty($route_data['schema']['title'])) {
WP_CLI::debug(sprintf(__('No schema title found for %s, skipping REST command registration.', 'woocommerce'), $route), 'wc');
continue;
}
if ('batch' === $route_data['schema']['title']) {
continue;
}
$route_pieces = explode('/', $route);
$endpoint_piece = str_replace('/wc/' . $route_pieces[2] . '/', '', $route);
if (in_array($endpoint_piece, self::$disabled_endpoints, true)) {
continue;
}
self::register_route_commands(new WC_CLI_REST_Command($route_data['schema']['title'], $route, $route_data['schema']), $route, $route_data);
}
}
private static function register_route_commands($rest_command, $route, $route_data, $command_args = array())
{
$supported_ids = array('product_id' => __('Product ID.', 'woocommerce'), 'customer_id' => __('Customer ID.', 'woocommerce'), 'order_id' => __('Order ID.', 'woocommerce'), 'refund_id' => __('Refund ID.', 'woocommerce'), 'attribute_id' => __('Attribute ID.', 'woocommerce'), 'zone_id' => __('Zone ID.', 'woocommerce'), 'instance_id' => __('Instance ID.', 'woocommerce'), 'id' => __('The ID for the resource.', 'woocommerce'), 'slug' => __('The slug for the resource.', 'woocommerce'));
$rest_command->set_supported_ids($supported_ids);
$positional_args = array_keys($supported_ids);
$parent = "wc {$route_data['schema']['title']}";
$supported_commands = array();
foreach ($route_data['endpoints'] as $endpoint) {
preg_match_all('#\\([^\\)]+\\)#', $route, $matches);
$resource_id = !empty($matches[0]) ? array_pop($matches[0]) : null;
$trimmed_route = rtrim($route);
$is_singular = substr($trimmed_route, -strlen($resource_id)) === $resource_id;
if (array('GET') === $endpoint['methods'] && !$is_singular) {
$supported_commands['list'] = !empty($endpoint['args']) ? $endpoint['args'] : array();
}
if (array('POST') === $endpoint['methods'] && !$is_singular) {
$supported_commands['create'] = !empty($endpoint['args']) ? $endpoint['args'] : array();
}
if (array('GET') === $endpoint['methods'] && $is_singular) {
$supported_commands['get'] = !empty($endpoint['args']) ? $endpoint['args'] : array();
}
if (in_array('POST', $endpoint['methods'], true) && $is_singular) {
$supported_commands['update'] = !empty($endpoint['args']) ? $endpoint['args'] : array();
}
if (array('DELETE') === $endpoint['methods'] && $is_singular) {
$supported_commands['delete'] = !empty($endpoint['args']) ? $endpoint['args'] : array();
}
}
foreach ($supported_commands as $command => $endpoint_args) {
$synopsis = array();
$arg_regs = array();
$ids = array();
foreach ($supported_ids as $id_name => $id_desc) {
if (strpos($route, '<' . $id_name . '>') !== false) {
$synopsis[] = array('name' => $id_name, 'type' => 'positional', 'description' => $id_desc, 'optional' => false);
$ids[] = $id_name;
}
}
foreach ($endpoint_args as $name => $args) {
if (!in_array($name, $positional_args, true) || strpos($route, '<' . $id_name . '>') === false) {
$arg_regs[] = array('name' => $name, 'type' => 'assoc', 'description' => !empty($args['description']) ? $args['description'] : '', 'optional' => empty($args['required']));
}
}
foreach ($arg_regs as $arg_reg) {
$synopsis[] = $arg_reg;
}
if (in_array($command, array('list', 'get'), true)) {
$synopsis[] = array('name' => 'fields', 'type' => 'assoc', 'description' => __('Limit response to specific fields. Defaults to all fields.', 'woocommerce'), 'optional' => true);
$synopsis[] = array('name' => 'field', 'type' => 'assoc', 'description' => __('Get the value of an individual field.', 'woocommerce'), 'optional' => true);
$synopsis[] = array('name' => 'format', 'type' => 'assoc', 'description' => __('Render response in a particular format.', 'woocommerce'), 'optional' => true, 'default' => 'table', 'options' => array('table', 'json', 'csv', 'ids', 'yaml', 'count', 'headers', 'body', 'envelope'));
}
if (in_array($command, array('create', 'update', 'delete'), true)) {
$synopsis[] = array('name' => 'porcelain', 'type' => 'flag', 'description' => __('Output just the id when the operation is successful.', 'woocommerce'), 'optional' => true);
}
$methods = array('list' => 'list_items', 'create' => 'create_item', 'delete' => 'delete_item', 'get' => 'get_item', 'update' => 'update_item');
$before_invoke = null;
if (empty($command_args['when']) && \WP_CLI::get_config('debug')) {
$before_invoke = function () {
wc_maybe_define_constant('SAVEQUERIES', true);
};
}
WP_CLI::add_command("{$parent} {$command}", array($rest_command, $methods[$command]), array('synopsis' => $synopsis, 'when' => !empty($command_args['when']) ? $command_args['when'] : '', 'before_invoke' => $before_invoke));
}
}
}