init_hooks(); } /** * Initialize hooks. */ private function init_hooks() { add_action( 'admin_menu', array( $this, 'add_admin_menu' ) ); } /** * Add admin menu. */ public function add_admin_menu() { $menu_manager = AfriDirect_Payment_Admin_Menu::instance(); $parent_slug = $menu_manager->get_menu_slug(); add_submenu_page( $parent_slug, __( 'Standalone Payments', 'afridirect-payment' ), __( 'Standalone Payments', 'afridirect-payment' ), $menu_manager->get_capability(), 'afridirect-standalone-payments', array( $this, 'render_payments_page' ) ); } /** * Render payments list page. */ public function render_payments_page() { $menu_manager = AfriDirect_Payment_Admin_Menu::instance(); if ( ! current_user_can( $menu_manager->get_capability() ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'afridirect-payment' ) ); } // Get status filter with nonce verification. $status_filter = 'all'; $valid_statuses = array( 'all', 'pending_proof', 'needs_review', 'approved', 'rejected', 'expired' ); if ( isset( $_GET['status'] ) && isset( $_GET['afridirect_nonce'] ) ) { $nonce = sanitize_text_field( wp_unslash( $_GET['afridirect_nonce'] ) ); if ( wp_verify_nonce( $nonce, 'afridirect_admin_payments_filter' ) ) { $raw_status = sanitize_text_field( wp_unslash( $_GET['status'] ) ); if ( in_array( $raw_status, $valid_statuses, true ) ) { $status_filter = $raw_status; } } } // Get payments. $args = array( 'post_type' => 'afridirect_payment', 'posts_per_page' => 50, 'orderby' => 'date', 'order' => 'DESC', 'post_status' => 'publish', ); // Add meta query for status filter. if ( 'all' !== $status_filter ) { // No non-meta way to filter standalone payments by their status meta. // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query $args['meta_query'] = array( array( 'key' => '_afridirect_status', 'value' => $status_filter, ), ); } $payments_query = new WP_Query( $args ); $payments = $payments_query->posts; // Get status counts. $status_counts = $this->get_status_counts(); include AFRIDIRECT_PAYMENT_PLUGIN_DIR . 'admin/views/payments.php'; } /** * Get status counts for filter tabs. * * @return array */ private function get_status_counts() { $statuses = array( 'pending_proof', 'needs_review', 'approved', 'rejected', 'expired' ); $counts = array( 'all' => 0 ); foreach ( $statuses as $status ) { $args = array( 'post_type' => 'afridirect_payment', 'posts_per_page' => -1, 'post_status' => 'publish', // No non-meta way to count standalone payments by status meta. // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query 'meta_query' => array( array( 'key' => '_afridirect_status', 'value' => $status, ), ), 'fields' => 'ids', ); $query = new WP_Query( $args ); $counts[ $status ] = $query->found_posts; $counts['all'] += $counts[ $status ]; } return $counts; } }