Submissions
Form submissions are stored in a custom database table (wp_cf_submissions) for fast querying and flexible management. The admin interface provides filterable inboxes, status tracking, bulk actions, CSV export, and email replies.
Database Table
Table: wp_cf_submissions
| Column | Type | Description |
|---|---|---|
id |
INT | Primary key |
form_id |
INT | Form post ID |
data |
LONGTEXT | JSON-encoded field data |
ip_address |
VARCHAR | Submitter's IP address |
user_agent |
TEXT | Browser user agent string |
referer_url |
TEXT | Page URL where form was submitted |
is_spam |
TINYINT | 1 if flagged as spam, 0 otherwise |
status |
VARCHAR | Submission status |
draft_token |
VARCHAR | Token for save-and-resume |
current_step |
INT | Current step for multi-step forms |
submitted_at |
TIMESTAMP | When the submission was created |
modified_at |
TIMESTAMP | When the submission was last modified |
Statuses
| Status | Constant | Description |
|---|---|---|
new |
Submission::STATUS_NEW |
Fresh submission, not yet viewed |
draft |
Submission::STATUS_DRAFT |
Saved but not submitted (save-and-resume) |
partial |
Submission::STATUS_PARTIAL |
Multi-step form, partially completed |
read |
Submission::STATUS_READ |
Viewed by an admin |
replied |
Submission::STATUS_REPLIED |
Admin has replied via email |
archived |
Submission::STATUS_ARCHIVED |
Archived/closed |
Admin Interface
Per-Form Submissions
Navigate to Core Forms > [Form Name] > Submissions tab to see submissions for a specific form.
All Submissions
Navigate to Core Forms > All Submissions for a global view across all forms. Uses the AllSubmissions and AllSubmissionsTable classes.
Inbox summaries
The default list puts the sender first, followed by email and a short answer preview. Entries without recognizable name/email fields use their submission ID. Use View or the sender link to open all details.
- Inbox excludes spam and archived entries by default. New, Archived, Spam, and All views are available in the global list.
- Search by name, email or any submitted answer. Form, status and date filters work together, and changing the global view keeps the other filters.
- Each entry shows its relative age and full local date/time. The timezone is shown above the list. Date filters use that same site-local timezone, while stored submission timestamps remain UTC.
- Lists contain 25 entries per page. Select page selects only the displayed entries; the selection count confirms the scope of bulk actions.
- Per-form lists offer Summary and All fields. All fields retains column controls, file links and detailed values, with horizontal scrolling for wide forms.
- Mark as read and Mark as new update the inbox status and the notification badge together. Permanent deletion asks for confirmation.
- On narrow screens, summaries stack into readable rows while View, selection and bulk controls remain available.
Submission Editor
Click a submission to open the detail view (SubmissionEditor), which shows:
- All submitted field data
- File upload links
- IP address and user agent
- Submission history and status changes
- Action logs for this submission
- Reply form
Bulk Actions
The submissions table supports bulk actions: - Mark as read - Archive - Delete - Mark as spam / Not spam
CSV Export
Export submissions via the Data Exporter extension:
- Go to the form's Submissions tab
- Click Export CSV
- All submissions for that form are downloaded as a CSV file. To export selected entries, use Export to CSV in the global list’s bulk actions.
The export includes all field data columns plus submission metadata (ID, status, timestamp, IP).
Reply to Submissions
Reply to a submitter directly from the admin via SubmissionReply:
- Open a submission in the editor
- Type your reply message
- Click Send Reply
The reply is sent as an email and the submission status changes to replied. Reply history is stored using the Reply class.
REST API
List Submissions
GET /wp-json/cf/v1/submissions
GET /wp-json/cf/v1/forms/{form_id}/submissions
Parameters: per_page, page, status, search.
Get Single Submission
GET /wp-json/cf/v1/submissions/{id}
Update Submission
PATCH /wp-json/cf/v1/submissions/{id}
Body: { "status": "archived" }
Delete Submission
DELETE /wp-json/cf/v1/submissions/{id}
All endpoints require the edit_forms capability.
PHP Functions
// Get a single submission
$submission = cf_get_form_submission( $submission_id );
// Get all submissions for a form
$submissions = cf_get_form_submissions( $form_id );
// Create a submission from a database row
$submission = Submission::from_object( $row );
// Check if submission is a draft
if ( $submission->is_draft() ) {
// Handle partial submission
}
The Submission Object
$submission->id; // INT - Primary key
$submission->form_id; // INT - Form post ID
$submission->data; // ARRAY - Field data
$submission->ip_address; // STRING
$submission->user_agent; // STRING
$submission->referer_url; // STRING
$submission->is_spam; // BOOL
$submission->status; // STRING - One of the STATUS_* constants
$submission->draft_token; // STRING|NULL
$submission->current_step; // INT - For multi-step forms
$submission->submitted_at; // STRING - Datetime
$submission->modified_at; // STRING|NULL - Datetime