WP_REST_Server::READABLE, 'callback' => array( __CLASS__, 'get_stats' ), 'permission_callback' => array( Agentmatica_Auth::class, 'verify_request_token' ), 'args' => array( 'after' => array( 'type' => 'string', 'required' => true, ), 'before' => array( 'type' => 'string', 'required' => false, ), ), ) ); } /** * Completed parent orders created in [after, before), GMT. Completed only, * because the plugin reports agent orders to Agentmatica on completion. * * @param WP_REST_Request $request * @return WP_REST_Response */ public static function get_stats( $request ): WP_REST_Response { if ( ! class_exists( 'WooCommerce' ) ) { return new WP_REST_Response( array( 'message' => 'WooCommerce is not active.' ), 404 ); } $after = self::parse_gmt( (string) $request->get_param( 'after' ) ); $before = self::parse_gmt( (string) $request->get_param( 'before' ) ); if ( $after === null ) { return new WP_REST_Response( array( 'message' => 'Invalid after date.' ), 400 ); } global $wpdb; $table = $wpdb->prefix . 'wc_order_stats'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $exists = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table ) ); if ( $exists !== $table ) { return new WP_REST_Response( array( 'message' => 'WooCommerce analytics table is not available.' ), 501 ); } $sql = "SELECT COUNT(*) AS orders, COALESCE(SUM(total_sales), 0) AS revenue FROM {$table} WHERE parent_id = 0 AND status = 'wc-completed' AND date_created_gmt >= %s"; $params = array( $after ); if ( $before !== null ) { $sql .= ' AND date_created_gmt < %s'; $params[] = $before; } // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared $row = $wpdb->get_row( $wpdb->prepare( $sql, $params ), ARRAY_A ); if ( ! is_array( $row ) ) { return new WP_REST_Response( array( 'message' => 'Order stats query failed.' ), 500 ); } return new WP_REST_Response( array( 'orders' => (int) $row['orders'], 'revenue' => round( (float) $row['revenue'], 2 ), 'currency' => (string) get_woocommerce_currency(), 'status' => 'completed', ), 200 ); } private static function parse_gmt( string $value ): ?string { $value = trim( $value ); if ( $value === '' ) { return null; } $timestamp = strtotime( $value ); if ( $timestamp === false ) { return null; } return gmdate( 'Y-m-d H:i:s', $timestamp ); } }