Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
wp-content
/
plugins
/
woocommerce
/
src
/
Admin
/
API
/
Reports
/
Orders
/
Stats
:
Controller.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php /** * REST API Reports orders stats controller * * Handles requests to the /reports/orders/stats endpoint. */ namespace Automattic\WooCommerce\Admin\API\Reports\Orders\Stats; defined( 'ABSPATH' ) || exit; use Automattic\WooCommerce\Admin\API\Reports\GenericStatsController; use Automattic\WooCommerce\Admin\API\Reports\OrderAwareControllerTrait; use Automattic\WooCommerce\Admin\API\Reports\Orders\Stats\Query; /** * REST API Reports orders stats controller class. * * @internal * @extends \Automattic\WooCommerce\Admin\API\Reports\GenericStatsController */ class Controller extends GenericStatsController { use OrderAwareControllerTrait; /** * Route base. * * @var string */ protected $rest_base = 'reports/orders/stats'; /** * Get data from Orders\Stats\Query. * * @override GenericController::get_datastore_data() * * @param array $query_args Query arguments. * @return mixed Results from the data store. */ protected function get_datastore_data( $query_args = array() ) { $query = new Query( $query_args ); return $query->get_data(); } /** * Maps query arguments from the REST request. * * @param array $request Request array. * @return array */ protected function prepare_reports_query( $request ) { $args = array(); $args['before'] = $request['before']; $args['after'] = $request['after']; $args['interval'] = $request['interval']; $args['page'] = $request['page']; $args['per_page'] = $request['per_page']; $args['orderby'] = $request['orderby']; $args['order'] = $request['order']; $args['fields'] = $request['fields']; $args['match'] = $request['match']; $args['status_is'] = (array) $request['status_is']; $args['status_is_not'] = (array) $request['status_is_not']; $args['product_includes'] = (array) $request['product_includes']; $args['product_excludes'] = (array) $request['product_excludes']; $args['variation_includes'] = (array) $request['variation_includes']; $args['variation_excludes'] = (array) $request['variation_excludes']; $args['coupon_includes'] = (array) $request['coupon_includes']; $args['coupon_excludes'] = (array) $request['coupon_excludes']; $args['tax_rate_includes'] = (array) $request['tax_rate_includes']; $args['tax_rate_excludes'] = (array) $request['tax_rate_excludes']; $args['customer_type'] = $request['customer_type']; $args['refunds'] = $request['refunds']; $args['attribute_is'] = (array) $request['attribute_is']; $args['attribute_is_not'] = (array) $request['attribute_is_not']; $args['category_includes'] = (array) $request['categories']; $args['segmentby'] = $request['segmentby']; $args['force_cache_refresh'] = $request['force_cache_refresh']; // For backwards compatibility, `customer` is aliased to `customer_type`. if ( empty( $request['customer_type'] ) && ! empty( $request['customer'] ) ) { $args['customer_type'] = $request['customer']; } return $args; } /** * Prepare a report data item for serialization. * * @param Array $report Report data item as returned from Data Store. * @param WP_REST_Request $request Request object. * @return WP_REST_Response */ public function prepare_item_for_response( $report, $request ) { // Wrap the data in a response object. $response = parent::prepare_item_for_response( $report, $request ); /** * Filter a report returned from the API. * * Allows modification of the report data right before it is returned. * * @param WP_REST_Response $response The response object. * @param object $report The original report object. * @param WP_REST_Request $request Request used to generate the response. */ return apply_filters( 'woocommerce_rest_prepare_report_orders_stats', $response, $report, $request ); } /** * Get the Report's item properties schema. * Will be used by `get_item_schema` as `totals` and `subtotals`. * * @return array */ protected function get_item_properties_schema() { return array( 'net_revenue' => array( 'description' => __( 'Net sales.', 'woocommerce' ), 'type' => 'number', 'context' => array( 'view', 'edit' ), 'readonly' => true, 'format' => 'currency', ), 'orders_count' => array( 'title' => __( 'Orders', 'woocommerce' ), 'description' => __( 'Number of orders', 'woocommerce' ), 'type' => 'integer', 'context' => array( 'view', 'edit' ), 'readonly' => true, 'indicator' => true, ), 'avg_order_value' => array( 'description' => __( 'Average order value.', 'woocommerce' ), 'type' => 'number', 'context' => array( 'view', 'edit' ), 'readonly' => true, 'indicator' => true, 'format' => 'currency', ), 'avg_items_per_order' => array( 'description' => __( 'Average items per order', 'woocommerce' ), 'type' => 'number', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'num_items_sold' => array( 'description' => __( 'Number of items sold', 'woocommerce' ), 'type' => 'integer', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'coupons' => array( 'description' => __( 'Amount discounted by coupons.', 'woocommerce' ), 'type' => 'number', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'coupons_count' => array( 'description' => __( 'Unique coupons count.', 'woocommerce' ), 'type' => 'number', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'total_customers' => array( 'description' => __( 'Total distinct customers.', 'woocommerce' ), 'type' => 'integer', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), 'products' => array( 'description' => __( 'Number of distinct products sold.', 'woocommerce' ), 'type' => 'number', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), ); } /** * Get the Report's schema, conforming to JSON Schema. * * @return array */ public function get_item_schema() { $schema = parent::get_item_schema(); $schema['title'] = 'report_orders_stats'; // Products is not shown in intervals. unset( $schema['properties']['intervals']['items']['properties']['subtotals']['properties']['products'] ); return $this->add_additional_fields_schema( $schema ); } /** * Get the query params for collections. * * @return array */ public function get_collection_params() { $params = parent::get_collection_params(); $params['orderby']['enum'] = $this->apply_custom_orderby_filters( array( 'date', 'net_revenue', 'orders_count', 'avg_order_value', ) ); $params['match'] = array( 'description' => __( 'Indicates whether all the conditions should be true for the resulting set, or if any one of them is sufficient. Match affects the following parameters: status_is, status_is_not, product_includes, product_excludes, coupon_includes, coupon_excludes, customer, categories', 'woocommerce' ), 'type' => 'string', 'default' => 'all', 'enum' => array( 'all', 'any', ), 'validate_callback' => 'rest_validate_request_arg', ); $params['status_is'] = array( 'description' => __( 'Limit result set to items that have the specified order status.', 'woocommerce' ), 'type' => 'array', 'sanitize_callback' => 'wp_parse_slug_list', 'validate_callback' => 'rest_validate_request_arg', 'default' => null, 'items' => array( 'enum' => self::get_order_statuses(), 'type' => 'string', ), ); $params['status_is_not'] = array( 'description' => __( 'Limit result set to items that don\'t have the specified order status.', 'woocommerce' ), 'type' => 'array', 'sanitize_callback' => 'wp_parse_slug_list', 'validate_callback' => 'rest_validate_request_arg', 'items' => array( 'enum' => self::get_order_statuses(), 'type' => 'string', ), ); $params['product_includes'] = array( 'description' => __( 'Limit result set to items that have the specified product(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'sanitize_callback' => 'wp_parse_id_list', ); $params['product_excludes'] = array( 'description' => __( 'Limit result set to items that don\'t have the specified product(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'sanitize_callback' => 'wp_parse_id_list', ); // Split assignments for PHPCS complaining on aligned. $params['variation_includes'] = array( 'description' => __( 'Limit result set to items that have the specified variation(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'sanitize_callback' => 'wp_parse_id_list', 'validate_callback' => 'rest_validate_request_arg', ); $params['variation_excludes'] = array( 'description' => __( 'Limit result set to items that don\'t have the specified variation(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'wp_parse_id_list', ); $params['coupon_includes'] = array( 'description' => __( 'Limit result set to items that have the specified coupon(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'sanitize_callback' => 'wp_parse_id_list', ); $params['coupon_excludes'] = array( 'description' => __( 'Limit result set to items that don\'t have the specified coupon(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'sanitize_callback' => 'wp_parse_id_list', ); $params['tax_rate_includes'] = array( 'description' => __( 'Limit result set to items that have the specified tax rate(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'sanitize_callback' => 'wp_parse_id_list', 'validate_callback' => 'rest_validate_request_arg', ); $params['tax_rate_excludes'] = array( 'description' => __( 'Limit result set to items that don\'t have the specified tax rate(s) assigned.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'wp_parse_id_list', ); $params['customer'] = array( 'description' => __( 'Alias for customer_type (deprecated).', 'woocommerce' ), 'type' => 'string', 'enum' => array( 'new', 'returning', ), 'validate_callback' => 'rest_validate_request_arg', ); $params['customer_type'] = array( 'description' => __( 'Limit result set to orders that have the specified customer_type', 'woocommerce' ), 'type' => 'string', 'enum' => array( 'new', 'returning', ), 'validate_callback' => 'rest_validate_request_arg', ); $params['refunds'] = array( 'description' => __( 'Limit result set to specific types of refunds.', 'woocommerce' ), 'type' => 'string', 'default' => '', 'enum' => array( '', 'all', 'partial', 'full', 'none', ), 'validate_callback' => 'rest_validate_request_arg', ); $params['attribute_is'] = array( 'description' => __( 'Limit result set to orders that include products with the specified attributes.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'array', ), 'default' => array(), 'validate_callback' => 'rest_validate_request_arg', ); $params['attribute_is_not'] = array( 'description' => __( 'Limit result set to orders that don\'t include products with the specified attributes.', 'woocommerce' ), 'type' => 'array', 'items' => array( 'type' => 'array', ), 'default' => array(), 'validate_callback' => 'rest_validate_request_arg', ); $params['segmentby'] = array( 'description' => __( 'Segment the response by additional constraint.', 'woocommerce' ), 'type' => 'string', 'enum' => array( 'product', 'category', 'variation', 'coupon', 'customer_type', // new vs returning. ), 'validate_callback' => 'rest_validate_request_arg', ); unset( $params['intervals'] ); unset( $params['fields'] ); return $params; } }