Data Exports (CSV)
Data Exports (CSV)
Section titled “Data Exports (CSV)”Learnomy’s admin list pages can hand you a clean CSV download of what you are looking at – transactions, students, subscriptions, plans, and your question bank – ready to open in a spreadsheet.
What you can do
Section titled “What you can do”- Export your transactions as a CSV audit and accounting feed.
- Export the enrolled student list as a CSV.
- Export subscriptions, filtered to exactly the status and plan you have on screen.
- Export your membership plans catalog.
- Export your question bank, filtered the same way the bank list filters it (and re-import a CSV to add questions in bulk).
- Get a file that opens correctly in Excel or Google Sheets – every row in its own cells, not crammed into one cell.
- Export from large sites without silent truncation, because exports stream row by row instead of capping the result.

How to use it
Section titled “How to use it”Step 1 – open the list you want to export
Section titled “Step 1 – open the list you want to export”Go to the matching admin page: Transactions, Students, Subscriptions, Membership Plans, or the Question Bank.
Step 2 – filter to what you need (where supported)
Section titled “Step 2 – filter to what you need (where supported)”On the Subscriptions and Question Bank lists, set the filters first (subscription status and plan; question bank category and type). The export mirrors the filters, so you get “exactly what you see” rather than the whole table.
Step 3 – export
Section titled “Step 3 – export”Use the export action on the page. The file downloads as an attachment with a dated filename (for example learnomy-transactions-YYYY-MM-DD.csv), so repeated exports do not overwrite each other.
Step 4 – open it
Section titled “Step 4 – open it”Open the file in Excel, Numbers, or Google Sheets. Because the download is served as real text/csv, each value lands in its own cell.
Settings and options
Section titled “Settings and options”- What can be exported – transactions, students, subscriptions, membership plans, and the question bank each have their own export. Earnings-side lists (commissions, withdrawals, and instructor applications) also export by requesting the list with
format=csv. - Filters carry through – subscriptions export honors the status and plan filters; the question-bank export honors the bank’s category and type filters.
- Dated filenames – every export is named with the date (or date-and-time) so exports are self-labeling and never clobber a previous file.
- Large lists – the transaction, student, subscription, and plan exports iterate rows with a cursor rather than loading everything into memory, so a site with tens of thousands of rows exports fully instead of being cut off.
- No spreadsheet corruption – files are streamed as raw
text/csvwith a download disposition, so the whole file is never JSON-wrapped into a single cell.
For developers
Section titled “For developers”The shared streaming mechanism lives in Learnomy\API\Api::stream_csv_responses(), hooked on rest_pre_serve_request. Any REST response whose Content-Type is text/csv and whose body is a string is emitted raw (with its own headers) instead of being JSON-encoded by WP_REST_Server. This fixes every CSV export at once while keeping REST auth and middleware intact.
Helper Learnomy\API\Csv_Formatter builds CSV bodies and downloadable responses: to_string( array $headers, array $rows ) and respond( array $headers, array $rows, string $filename ) (which sets text/csv, a dated Content-Disposition attachment filename, and no-store).
Export endpoints (namespace learnomy/v1, admin-gated):
GET /admin/transactions/export–Admin_Controller::export_transactions_csv()(cursor-iteratesTransaction::iterate_all()).GET /admin/students/export–Admin_Controller::export_students_csv()(streams the enrolled-user list).GET /admin/memberships/export–Membership_Controller::export_subscriptions_csv()(honorsstatus+plan_id).GET /admin/membership-plans/export–Membership_Controller::export_plans_csv().GET /questions/export–Questions_Controller::export_csv()(honors the bank filters); paired withPOST /questions/import(import_csv()) for bulk import.
List endpoints that emit CSV when called with format=csv (via Csv_Formatter::respond()): Admin_Controller::list_commissions(), list_withdrawals(), and list_applications().

