db_manager = $db_manager; $this->settings_manager = $settings_manager; } public function add_admin_menu() { // Add Custom Reports page under WooCommerce > Reports add_submenu_page( 'woocommerce', __('Custom Reports', StudiouWC_Main::get_text_domain()), __('Custom Reports', StudiouWC_Main::get_text_domain()), 'manage_woocommerce', 'studiou-custom-reports', array($this, 'display_custom_reports_page') ); // Add Settings page under WooCommerce > Reports Settings add_submenu_page( 'woocommerce', __('Custom Report Settings', StudiouWC_Main::get_text_domain()), __('Custom Report Settings', StudiouWC_Main::get_text_domain()), 'manage_woocommerce', 'studiou-reports-settings', array($this, 'display_settings_page') ); } public function enqueue_admin_scripts($hook) { if (strpos($hook, 'studiou-') !== false) { wp_enqueue_script('jquery'); wp_enqueue_script('jquery-ui-datepicker'); wp_enqueue_style('jquery-ui-datepicker', 'https://code.jquery.com/ui/1.12.1/themes/ui-lightness/jquery-ui.css'); } } public function display_custom_reports_page() { $settings = $this->settings_manager->get_settings(); // Handle form submission $view = isset($_GET['view']) ? sanitize_text_field($_GET['view']) : 'product_categories_summary'; $date_from = isset($_GET['date_from']) ? sanitize_text_field($_GET['date_from']) : $this->settings_manager->get_default_date_from(); $date_to = isset($_GET['date_to']) ? sanitize_text_field($_GET['date_to']) : date('Y-m-d'); // If no statuses selected, use all available statuses (including custom ones) if (isset($_GET['statuses']) && !empty($_GET['statuses'])) { $statuses = array_map('sanitize_text_field', $_GET['statuses']); } else { $default_statuses = $settings['default_statuses'] ?? array(); if (empty($default_statuses)) { // Include common statuses + your custom status $statuses = array('wc-completed', 'wc-processing', 'wc-on-hold', 'wc-to-print'); } else { $statuses = $default_statuses; } } $per_page = isset($_GET['per_page']) ? intval($_GET['per_page']) : 20; $paged = isset($_GET['paged']) ? intval($_GET['paged']) : 1; $default_orderby = ($view === 'order_customers_list') ? 'customer_name' : 'category'; $orderby = isset($_GET['orderby']) ? sanitize_text_field($_GET['orderby']) : $default_orderby; $order = isset($_GET['order']) ? sanitize_text_field($_GET['order']) : 'ASC'; // Get report data based on view if ($view === 'order_customers_list') { $report_data = $this->db_manager->get_order_customers_list($date_from, $date_to, $statuses, $per_page, $paged, $orderby, $order); $total_items = $this->db_manager->get_order_customers_total_items($date_from, $date_to, $statuses); } else { $report_data = $this->db_manager->get_product_categories_summary($date_from, $date_to, $statuses, $per_page, $paged, $orderby, $order); $total_items = $this->db_manager->get_total_items($date_from, $date_to, $statuses); } $total_pages = ceil($total_items / $per_page); $this->render_reports_page($view, $date_from, $date_to, $statuses, $per_page, $paged, $orderby, $order, $report_data, $total_items, $total_pages, $settings); } public function display_settings_page() { $settings = $this->settings_manager->get_settings(); $this->render_settings_page($settings); } private function render_reports_page($view, $date_from, $date_to, $statuses, $per_page, $paged, $orderby, $order, $report_data, $total_items, $total_pages, $settings) { ?>

render_filter_form($view, $date_from, $date_to, $statuses, $per_page); ?> render_pagination_top($total_items, $total_pages, $paged); ?> render_customers_data_table($report_data, $orderby, $order); ?> render_data_table($report_data, $orderby, $order, $settings); ?>

render_reports_javascript(); ?>
render_status_checkboxes($statuses); ?>

get_col(" SELECT DISTINCT status FROM {$wpdb->prefix}wc_orders WHERE status NOT IN ('" . implode("','", array_keys($order_statuses)) . "') AND date_created_gmt >= DATE_SUB(NOW(), INTERVAL 90 DAY) "); foreach ($custom_statuses as $custom_status) { if (!isset($order_statuses[$custom_status])) { $order_statuses[$custom_status] = ucwords(str_replace(array('wc-', '-'), array('', ' '), $custom_status)); } } foreach ($order_statuses as $status_key => $status_label) { $checked = in_array($status_key, $selected_statuses) ? 'checked' : ''; echo '
'; } } private function render_pagination_top($total_items, $total_pages, $paged) { ?>
1): ?> 1): ?>
db_manager->get_property_values($default_property); } ?> $name): ?> $name): ?>

$status_label) { $checked = in_array($status_key, $default_statuses) ? 'checked' : ''; echo '
'; } ?>