namespace, '/' . $this->rest_base . '/network', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'network_orders' ), 'permission_callback' => array( $this, 'network_orders_permissions_check' ), 'args' => $this->get_collection_params(), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); } } /** * Retrieves the item's schema for display / public consumption purposes. * * @return array Public item schema data. */ public function get_public_item_schema() { $schema = parent::get_public_item_schema(); $schema['properties']['blog'] = array( 'description' => __( 'Blog id of the record on the multisite.', 'woocommerce-rest-api' ), 'type' => 'integer', 'context' => array( 'view' ), 'readonly' => true, ); $schema['properties']['edit_url'] = array( 'description' => __( 'URL to edit the order', 'woocommerce-rest-api' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ); $schema['properties']['customer'][] = array( 'description' => __( 'Name of the customer for the order', 'woocommerce-rest-api' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ); $schema['properties']['status_name'][] = array( 'description' => __( 'Order Status', 'woocommerce-rest-api' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ); $schema['properties']['formatted_total'][] = array( 'description' => __( 'Order total formatted for locale', 'woocommerce-rest-api' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ); return $schema; } /** * Does a permissions check for the proper requested blog * * @param WP_REST_Request $request Full details about the request. * * @return bool $permission */ public function network_orders_permissions_check( $request ) { $blog_id = $request->get_param( 'blog_id' ); $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id(); switch_to_blog( $blog_id ); $permission = $this->get_items_permissions_check( $request ); restore_current_blog(); return $permission; } /** * Get a collection of orders from the requested blog id * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response */ public function network_orders( $request ) { $blog_id = $request->get_param( 'blog_id' ); $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id(); $active_plugins = get_blog_option( $blog_id, 'active_plugins', array() ); $network_active_plugins = array_keys( get_site_option( 'active_sitewide_plugins', array() ) ); $plugins = array_merge( $active_plugins, $network_active_plugins ); $wc_active = false; foreach ( $plugins as $plugin ) { if ( substr_compare( $plugin, '/woocommerce.php', strlen( $plugin ) - strlen( '/woocommerce.php' ), strlen( '/woocommerce.php' ) ) === 0 ) { $wc_active = true; } } // If WooCommerce not active for site, return an empty response. if ( ! $wc_active ) { $response = rest_ensure_response( array() ); return $response; } switch_to_blog( $blog_id ); add_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) ); $items = $this->get_items( $request ); remove_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) ); foreach ( $items->data as &$current_order ) { $order = wc_get_order( $current_order['id'] ); $current_order['blog'] = get_blog_details( get_current_blog_id() ); $current_order['edit_url'] = get_admin_url( $blog_id, 'post.php?post=' . absint( $order->get_id() ) . '&action=edit' ); /* translators: 1: first name 2: last name */ $current_order['customer'] = trim( sprintf( _x( '%1$s %2$s', 'full name', 'woocommerce-rest-api' ), $order->get_billing_first_name(), $order->get_billing_last_name() ) ); $current_order['status_name'] = wc_get_order_status_name( $order->get_status() ); $current_order['formatted_total'] = $order->get_formatted_order_total(); } restore_current_blog(); return $items; } /** * Filters the post statuses to on hold and processing for the network order query. * * @param array $args Query args. * * @return array */ public function network_orders_filter_args( $args ) { $args['post_status'] = array( 'wc-on-hold', 'wc-processing', ); return $args; } }