input( 'action', 'get', 'list' ); switch ( $action ) { case 'edit': self::viewEdit(); break; case 'create': self::viewAdd(); break; default: self::viewList(); break; } } private static function viewList() { $request = static::request(); // phpcs:disable WordPress.Security.NonceVerification.Recommended // These are read-only filter/pagination params for an admin list page. // No state is mutated. Pattern mirrors WordPress core WP_List_Table behaviour. $page = max( 1, (int) $request->input( 'page_no', 'get', 1 ) ); $current_search = sanitize_text_field( wp_unslash( $request->input( 'search', 'get', '' ) ) ); $current_status = sanitize_text_field( wp_unslash( $request->input( 'status', 'get', '' ) ) ); // Base query (excludes deleted). $query = DB::get( TableName::ADFUZ_ADS() )->where( 'status', '<>', 'deleted' ); // Apply search filter. if ( ! empty( $current_search ) ) { $query = $query->where( 'title', 'LIKE', '%' . $current_search . '%' ); } // Apply status filter. if ( ! empty( $current_status ) ) { $query = $query->where( 'status', $current_status ); } $ads = $query->orderBy( 'updated_at', 'desc' )->paginate( 10, $page ); // Status counts (always unfiltered by search/status, but excludes deleted). $status_rows = DB::get( TableName::ADFUZ_ADS() ) ->select( 'status', 'COUNT(*) as count' ) ->where( 'status', '!=', 'deleted' ) ->groupBy( 'status' ) ->get(); $stats = array( 'total' => $ads['total'] ?? 0, 'active' => 0, 'paused' => 0, 'pending' => 0, 'expired' => 0, 'draft' => 0, ); foreach ( $status_rows as $row ) { $key = strtolower( $row['status'] ); if ( isset( $stats[ $key ] ) ) { $stats[ $key ] = (int) $row['count']; } } $ads['stats'] = $stats; $ads['from'] = ( ( $page - 1 ) * 10 ) + 1; $ads['to'] = min( $page * 10, $ads['total'] ); $ads['current_search'] = $current_search; $ads['current_status'] = $current_status; Template::load( 'admin/adz/index', $ads ); } private static function viewEdit() { $ad_id = static::request()->input( 'ad_id', 'get' ); $ads = DB::get( TableName::ADFUZ_ADS() )->find( $ad_id ); Template::load( 'admin/adz/adz', $ads ); } private static function viewAdd() { Template::load( 'admin/adz/adz', array() ); } public static function status( $name = false ) { $status = array( 'active' => 'Active', 'paused' => 'Paused', 'deleted' => 'Deleted', 'draft' => 'Draft', 'pending' => 'Pending', ); return false !== $name ? $status[ $name ] : $status; } /** * After delete hook — removes campaign_ads rows if user confirmed. */ protected static function afterDelete( int $recordId ): void { $force = (bool) self::request()->input( 'force_delete_campaign_ads', 'post', false ); if ( ! $force ) { return; } CampaignAd::deleteByAd( $recordId ); } }