XYZ File Manager
Current Path:
/var/cache/hostinger-wp-cli-packages/src/Woocommerce
var
/
cache
/
hostinger-wp-cli-packages
/
src
/
Woocommerce
/
📁
..
📄
GetOrdersCommand.php
(16.78 KB)
📄
GetOrdersUpdatedCommand.php
(10.77 KB)
📄
GetWooOrdersCommand.php
(10.55 KB)
Editing: GetOrdersCommand.php
<?php namespace Hostinger\WPCLI\Woocommerce; use WP_CLI; use WP_CLI_Command; class GetOrdersCommand extends WP_CLI_Command { public function __invoke( array $args, array $assoc_args ): void { if ( ! class_exists( 'WooCommerce' ) ) { WP_CLI::error( 'WooCommerce is not active. Please activate WooCommerce before running this command.' ); } $date_range = $this->get_date_range( $assoc_args ); $orders = $this->fetch_orders( $date_range ); $report = $this->generate_report( $orders, $date_range ); $response = [ 'report' => $report, ]; WP_CLI::line( wp_json_encode( $response, JSON_PRETTY_PRINT ) ); } private function get_date_range( array $assoc_args ): array { $from_date = $assoc_args['from-date'] ?? null; $to_date = $assoc_args['to-date'] ?? null; $days = isset( $assoc_args['days'] ) ? (int)$assoc_args['days'] : null; // Option 1: Both from-date and to-date provided if ( $from_date && $to_date ) { // Validate date formats if ( ! $this->is_valid_date( $from_date ) || ! $this->is_valid_date( $to_date ) ) { WP_CLI::error( 'Invalid date format. Please use Y-m-d format (e.g., 2024-01-15).' ); } // Ensure from_date is not later than to_date if ( strtotime( $from_date ) > strtotime( $to_date ) ) { WP_CLI::error( 'from-date cannot be later than to-date.' ); } return [ 'from' => $from_date, 'to' => gmdate( 'Y-m-d 23:59:59', strtotime( $to_date ) ), ]; } // Option 2: Only days parameter provided if ( $days && ! $from_date && ! $to_date ) { $to_date_calc = gmdate( 'Y-m-d 23:59:59', strtotime( 'yesterday' ) ); $from_date_calc = gmdate( 'Y-m-d', strtotime( "-" . ( $days - 1 ) . " days", strtotime( 'yesterday' ) ) ); return [ 'from' => $from_date_calc, 'to' => $to_date_calc ]; } // Option 3: Only from-date provided (original behavior - from date to yesterday) if ( $from_date && ! $to_date && ! $days ) { if ( ! $this->is_valid_date( $from_date ) ) { WP_CLI::error( 'Invalid date format. Please use Y-m-d format (e.g., 2024-01-15).' ); } $to_date_calc = gmdate( 'Y-m-d 23:59:59', strtotime( 'yesterday' ) ); return [ 'from' => $from_date, 'to' => $to_date_calc ]; } // Error: No valid combination provided WP_CLI::error( 'You must provide either: --days, --from-date only, or both --from-date and --to-date parameters.' ); } private function is_valid_date( string $date ): bool { $parsed_date = \DateTime::createFromFormat( 'Y-m-d', $date ); return $parsed_date && $parsed_date->format( 'Y-m-d' ) === $date; } private function fetch_orders( array $date_range ): array { return wc_get_orders( [ 'limit' => -1, 'orderby' => 'date', 'order' => 'ASC', 'type' => 'shop_order', 'status' => [ 'wc-processing', 'wc-completed' ], 'date_created' => $date_range['from'] . '...' . $date_range['to'], ] ); } private function generate_report( array $orders, array $date_range ): array { $report = []; $currencies_by_date = []; $unique_customers_by_currency = []; $payment_method_data_by_date_currency = []; // Initialize report for all days in the range $current_date = new \DateTime( $date_range['from'] ); $end_date = new \DateTime( substr( $date_range['to'], 0, 10 ) ); // Extract date part only while ( $current_date <= $end_date ) { $date_key = $current_date->format( 'Y-m-d' ); $report[$date_key] = []; $currencies_by_date[$date_key] = []; $payment_method_data_by_date_currency[$date_key] = []; $current_date->modify( '+1 day' ); } // First pass: collect all currencies and payment methods used in orders foreach ( $orders as $order ) { $order_date = $this->get_order_date( $order ); if ( ! $order_date ) { continue; } $currency = $order->get_currency() ?? 'Unknown'; $payment_method = $order->get_payment_method() ?: 'Unknown'; $currencies_by_date[$order_date][$currency] = true; if (!isset($unique_customers_by_currency[$order_date])) { $unique_customers_by_currency[$order_date] = []; } if (!isset($unique_customers_by_currency[$order_date][$currency])) { $unique_customers_by_currency[$order_date][$currency] = []; } // Initialize payment method data structure if (!isset($payment_method_data_by_date_currency[$order_date][$currency])) { $payment_method_data_by_date_currency[$order_date][$currency] = []; } if (!isset($payment_method_data_by_date_currency[$order_date][$currency][$payment_method])) { $payment_method_data_by_date_currency[$order_date][$currency][$payment_method] = $this->initialize_payment_method_entry($currency, $payment_method); $payment_method_data_by_date_currency[$order_date][$currency][$payment_method]['unique_customers'] = []; } } // Get all unique currencies across all dates $all_currencies = []; foreach ($currencies_by_date as $currencies) { foreach (array_keys($currencies) as $currency) { $all_currencies[$currency] = true; } } // Initialize data structure for each date with all currencies foreach ($report as $date => &$date_data) { // For dates with orders, add the currencies that had orders if (!empty($currencies_by_date[$date])) { foreach (array_keys($currencies_by_date[$date]) as $currency) { $date_data[] = $this->initialize_currency_report_entry($currency); } } // For dates with no orders, add entry with null currency else { $currency = function_exists( 'get_woocommerce_currency' ) ? get_woocommerce_currency() : null; $date_data[] = $this->initialize_currency_report_entry( $currency ); } } // Second pass: process orders and collect data by currency and payment method foreach ( $orders as $order ) { $order_date = $this->get_order_date( $order ); if ( ! $order_date ) { continue; } $currency = $order->get_currency() ?? 'Unknown'; $payment_method = $order->get_payment_method() ?: 'Unknown'; // Find the index of this currency in the date's report array foreach ($report[$order_date] as $index => $entry) { if ($entry['currency'] === $currency) { $this->process_order_by_currency($report[$order_date][$index], $unique_customers_by_currency[$order_date][$currency], $order); break; } } // Also process for payment method breakdown $this->process_order_by_currency( $payment_method_data_by_date_currency[$order_date][$currency][$payment_method], $payment_method_data_by_date_currency[$order_date][$currency][$payment_method]['unique_customers'], $order ); } // Calculate averages and format data foreach ($report as $date => $currency_entries) { // Skip dates with no orders (null entries) if (is_array($currency_entries)) { foreach ($currency_entries as $index => $entry) { $currency = $entry['currency']; $this->calculate_currency_averages( $report[$date][$index], $unique_customers_by_currency[$date][$currency] ?? [] ); // Add payment methods breakdown $report[$date][$index]['payment_methods'] = []; if (isset($payment_method_data_by_date_currency[$date][$currency])) { foreach ($payment_method_data_by_date_currency[$date][$currency] as $payment_method => $payment_data) { $this->calculate_payment_method_averages( $payment_method_data_by_date_currency[$date][$currency][$payment_method], $payment_method_data_by_date_currency[$date][$currency][$payment_method]['unique_customers'] ); // Remove the unique_customers helper field and unwanted fields unset($payment_method_data_by_date_currency[$date][$currency][$payment_method]['unique_customers']); unset($payment_method_data_by_date_currency[$date][$currency][$payment_method]['payment_method_counts']); unset($payment_method_data_by_date_currency[$date][$currency][$payment_method]['payment_method_amounts']); $report[$date][$index]['payment_methods'][] = $payment_method_data_by_date_currency[$date][$currency][$payment_method]; } } } } } return $report; } private function get_order_date( \WC_Order $order ): ?string { return $order->get_date_created() ? $order->get_date_created()->date( 'Y-m-d' ) : null; } private function initialize_currency_report_entry(string $currency = null): array { return [ 'currency' => $currency, 'orders_count' => "", 'num_items_sold' => null, 'gross_sales' => null, 'total_sales' => null, 'coupons' => "0", 'coupons_count' => "0", 'refunds' => null, 'taxes' => null, 'shipping' => null, 'net_revenue' => null, 'avg_items_per_order' => null, 'avg_order_value' => null, 'total_customers' => "0", 'discounts' => null, 'payment_methods' => [], 'payment_method_counts' => [], 'payment_method_amounts' => [], ]; } private function initialize_payment_method_entry(string $currency = null, string $payment_method = null): array { return [ 'currency' => $currency, 'payment_method' => $payment_method, 'orders_count' => "", 'num_items_sold' => null, 'gross_sales' => null, 'total_sales' => null, 'coupons' => "0", 'coupons_count' => "0", 'refunds' => null, 'taxes' => null, 'shipping' => null, 'net_revenue' => null, 'avg_items_per_order' => null, 'avg_order_value' => null, 'total_customers' => "0", 'discounts' => null, ]; } private function process_order_by_currency(array &$currency_report, array &$unique_customers, \WC_Order $order): void { $order_totals = $this->extract_order_totals($order); if ($refunds = $order->get_refunds()) { $currency_report['refunds'] = ($currency_report['refunds'] ?? 0) + abs($refunds[0]->get_total()); } // First order for this currency - initialize numeric values if ($currency_report['orders_count'] === "") { $currency_report['num_items_sold'] = 0; $currency_report['gross_sales'] = 0; $currency_report['total_sales'] = 0; $currency_report['taxes'] = 0; $currency_report['shipping'] = 0; $currency_report['net_revenue'] = 0; $currency_report['discounts'] = 0; } $currency_report['orders_count'] = (string)((int)($currency_report['orders_count'] ?: 0) + 1); $currency_report['num_items_sold'] += $order_totals['items']; $currency_report['gross_sales'] += $order_totals['gross_sales']; $currency_report['total_sales'] += $order_totals['total']; $currency_report['coupons'] = (string)(($currency_report['coupons'] !== "0" ? (float)$currency_report['coupons'] : 0) + $order_totals['discounts']); $currency_report['coupons_count'] = (string)(($currency_report['coupons_count'] !== "0" ? (int)$currency_report['coupons_count'] : 0) + count($order->get_coupon_codes())); $currency_report['taxes'] += $order_totals['taxes']; $currency_report['shipping'] += $order_totals['shipping']; $currency_report['net_revenue'] += $order_totals['net_revenue']; $currency_report['discounts'] += $order_totals['discounts']; $customer_id = $order->get_customer_id(); if (!empty($customer_id)) { $unique_customers[$customer_id] = true; } // Track payment method count and amount $payment_method_id = $order->get_payment_method(); $payment_method = !empty($payment_method_id) ? $payment_method_id : 'Unknown'; $order_total = (float)$order->get_total(); if (!isset($currency_report['payment_method_counts'][$payment_method])) { $currency_report['payment_method_counts'][$payment_method] = 0; $currency_report['payment_method_amounts'][$payment_method] = 0; } $currency_report['payment_method_counts'][$payment_method]++; $currency_report['payment_method_amounts'][$payment_method] += $order_total; } private function extract_order_totals( \WC_Order $order ): array { return [ 'total' => (float)$order->get_total(), 'items' => (int)$order->get_item_count(), 'taxes' => (float)$order->get_total_tax(), 'shipping' => (float)$order->get_shipping_total(), 'discounts' => (float)$order->get_total_discount(), 'gross_sales' => (float)$order->get_total() + $order->get_total_discount() - $order->get_total_tax() - $order->get_shipping_total(), 'net_revenue' => (float)$order->get_total() - $order->get_total_tax() - $order->get_shipping_total(), ]; } private function calculate_currency_averages( array &$currency_report, array $unique_customers ): void { // Set total customers $currency_report['total_customers'] = (string)count( $unique_customers ); // Calculate averages if ( (int)$currency_report['orders_count'] > 0 ) { $currency_report['avg_items_per_order'] = round( $currency_report['num_items_sold'] / (int)$currency_report['orders_count'], 2 ); $currency_report['avg_order_value'] = round( $currency_report['total_sales'] / (int)$currency_report['orders_count'], 2 ); } // Format payment methods with amounts if ( ! empty( $currency_report['payment_method_counts'] ) ) { $currency_report['payment_methods'] = []; foreach ( $currency_report['payment_method_counts'] as $method => $count ) { $amount = $currency_report['payment_method_amounts'][$method] ?? 0; $currency_report['payment_methods'][] = [ 'payment_method' => $method, 'amount' => round($amount, 2), 'count' => (string)$count, ]; } } unset( $currency_report['payment_method_counts'] ); unset( $currency_report['payment_method_amounts'] ); } private function calculate_payment_method_averages( array &$payment_method_report, array $unique_customers ): void { // Set total customers $payment_method_report['total_customers'] = (string)count( $unique_customers ); // Calculate averages if ( (int)$payment_method_report['orders_count'] > 0 ) { $payment_method_report['avg_items_per_order'] = round( $payment_method_report['num_items_sold'] / (int)$payment_method_report['orders_count'], 2 ); $payment_method_report['avg_order_value'] = round( $payment_method_report['total_sales'] / (int)$payment_method_report['orders_count'], 2 ); } } }
Upload File
Create Folder