export_submissions_csv(); return; } require_once AFFCF_PLUGIN_DIR . 'includes/admin/views/submissions/submissions-list.php'; } /** * Export submissions to CSV */ private function export_submissions_csv() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to export submissions.', 'airy-frontend-forms' ) ); } global $wpdb; $submissions_table = $wpdb->prefix . 'affcf_submissions'; // Get all submissions. // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Table names from $wpdb->prefix, plugin-controlled $submissions = $wpdb->get_results( "SELECT s.*, p.post_title, p.post_status, u.display_name as user_name, u.user_email, f.form_name FROM {$submissions_table} s LEFT JOIN {$wpdb->posts} p ON s.post_id = p.ID LEFT JOIN {$wpdb->users} u ON s.user_id = u.ID LEFT JOIN {$wpdb->prefix}affcf_forms f ON s.form_id = f.id ORDER BY s.submission_date DESC" ); // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter // Set headers for CSV download. header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename="submissions-' . gmdate( 'Y-m-d-H-i-s' ) . '.csv"' ); // Create output stream. $output = fopen( 'php://output', 'w' ); // Add BOM for UTF-8. fprintf( $output, chr( 0xEF ) . chr( 0xBB ) . chr( 0xBF ) ); // Add headers. fputcsv( $output, array( 'ID', 'Post Title', 'User Name', 'User Email', 'Form Name', 'Submission Type', 'Post Status', 'Submission Date', 'IP Address', 'User Agent', 'CAPTCHA Score', ) ); // Add data. foreach ( $submissions as $submission ) { fputcsv( $output, array( $submission->id, $submission->post_title ?? '', $submission->user_name ?? '', $submission->user_email ?? '', $submission->form_name ?? '', ucfirst( $submission->submission_type ), ucfirst( $submission->post_status ), $submission->submission_date, $submission->ip_address ?? '', $submission->user_agent ?? '', $submission->captcha_score ?? '', ) ); } // php://output is automatically closed by PHP, no fclose() needed. exit; } }