Configuration
Navigate to Tickets → Settings in your WordPress dashboard. Settings are organized across eight tabs.
Tab 1: General
| Setting | Description | Default |
|---|---|---|
| Custom Priorities | Comma-separated list of priority levels | Low, Medium, High |
| Default Priority | Priority assigned to new tickets | Medium |
| Custom Statuses | Comma-separated list of workflow statuses | Open, In Progress, Resolved, Closed |
| Default Status | Status assigned to new tickets | Open |
| Resolved Status | Triggers the auto-close countdown | Resolved |
| Closed Status | Disables further client replies | Closed |
| Re-Opened Status | Assigned when a client re-opens a closed ticket | Open |
| Auto-Close Days | Days after “Resolved” before automatic closure (0 = disabled) | 3 |
| Max Upload Size | Maximum file size per upload in MB | 5 |
| Max Files Per Upload | Maximum number of files per submission (0 = unlimited) | 5 |
| SLA Warn Hours | Hours before a ticket is flagged as an SLA warning | 0 (disabled) |
| SLA Breach Hours | Hours before a ticket is flagged as an SLA breach | 0 (disabled) |
| Restrict Technicians | When enabled, technicians only see tickets assigned to them | Off |
| Portal Theme | Auto follows prefers-color-scheme; Force light mode pins the portal to light | Auto |
Tab 2: Assignment & Routing
| Setting | Description |
|---|---|
| Default Assignee | Technician automatically assigned to every new ticket |
| Fallback Alert Email | Receives new-ticket and client-reply notifications when no assignee is set |
| Helpdesk Page | The page clients land on when clicking their portal link. Use the [helpdesk_portal] page if you have a dedicated portal, or the [submit_ticket] page for a combined layout. All portal links in emails point here. |
Auto-assignment rules let you route tickets to specific technicians based on category. Add one or more rules mapping a Category to an Assignee. The first matching rule wins; if no rule matches, the default assignee is used.
Email routing priority (when sending admin notifications):
- The ticket’s assigned technician
- The default assignee (if set)
- The fallback alert email (if set)
- The site admin email
Tab 3: Email Templates
Customize the subject line and body of every email the plugin sends. Click Reset to default below any template to restore the original text.
Available placeholders:
| Placeholder | Value |
|---|---|
{name} | Client’s name |
{email} | Client’s email address |
{ticket_id} | Unique ticket ID (e.g. TKT-0001) |
{title} | Ticket title / summary |
{status} | Current ticket status |
{priority} | Current priority level |
{message} | Message body |
{ticket_url} | Secure client portal link |
{admin_url} | WordPress admin edit link (technicians only) |
{autoclose_days} | Configured auto-close threshold |
Conditional blocks:
Wrap any template section in {if key}...{endif key} to include it only when that placeholder has a non-empty value:
{if message}
Message: {message}
{endif message}
Unreplaced placeholders are automatically removed from the final output.
Email events (14 templates, 8 client-facing + 6 admin-facing):
Sent to client:
- New ticket received (confirmation)
- Technician replied
- Status changed (no reply)
- Technician replied + status changed (combined)
- Ticket resolved
- Ticket re-opened
- Ticket auto-closed
- Ticket closed by client (confirmation)
Sent to technician/admin:
- New ticket submitted
- Client replied
- Client re-opened ticket
- Client closed ticket
- Ticket assigned to technician
- Ticket auto-closed (admin copy)
Email branding: The header band displays your site logo (configured via Logo URL in Tab 3) and site name. If no logo URL is set, the site icon is used as a fallback (at 32×32 px). All CSS is inlined for email client compatibility.
Send Test Email: Click Send Test Email to send a sample message to the currently logged-in admin. The result is shown inline without a page reload.
Tab 4: Messages
Customize the front-end text shown to clients after form actions:
| Message Key | When Shown |
|---|---|
| Success — New Ticket | After a ticket is successfully submitted |
| Success — Reply Sent | After a client reply is sent |
| Success — Ticket Closed | After a client closes a resolved ticket |
| Success — Ticket Re-Opened | After a client re-opens a closed ticket |
| Error — Spam Check Failed | Anti-spam validation failed |
| Error — Invalid Token | Ticket portal URL is invalid or expired |
| Error — General | Catch-all for unexpected errors |
Tab 5: Anti-Spam
| Method | Description |
|---|---|
| None | No anti-spam protection |
| Honeypot | Invisible hidden field; catches basic bots with no user friction |
| Google reCAPTCHA v2 | “I’m not a robot” checkbox; requires Site Key + Secret Key |
| Cloudflare Turnstile | Privacy-friendly CAPTCHA alternative; requires Site Key + Secret Key |
For reCAPTCHA and Turnstile, paste your public Site Key and private Secret Key into the respective fields. The widget renders automatically on the frontend form.
Protection applies to: the ticket submission form, the ticket lookup form, and the portal reply/close/reopen forms.
Tab 6: Canned Responses
Pre-written reply templates that speed up ticket responses.
- Click + Add Response to create a new template.
- Enter a Title (visible only in the selector) and a Body (inserted into the reply field).
- Save via the main Save Changes button.
To use a canned response in a ticket, open the ticket editor, click the Canned Response picker in the conversation section, and select a template. The body is inserted into the active reply field.
Tab 7: Templates
Pre-configured submission types that pre-fill the ticket description field when a client selects them on the frontend form.
- Click + Add Template to create a new request type.
- Enter a Label (shown as the option name in the dropdown) and a Description (the pre-filled text).
- Save via the main Save Changes button.
When templates are configured, the submission form displays a Request Type dropdown. Selecting an option populates the description field with the corresponding template body, which the client can then edit before submitting.
Tab 8: Tools
Automated Data Retention
| Setting | Description | Default |
|---|---|---|
| Attachment Retention Days | Delete physical files older than N days (0 = disabled) | 0 |
| Ticket Retention Days | Delete entire tickets inactive for N days (0 = disabled) | 0 |
Retention jobs run hourly in micro-batches to avoid server timeouts.
Uninstallation
Check Delete all plugin data on uninstall to permanently remove all tickets, attachments, and settings when the plugin is deleted from WordPress.
Danger Zone
| Action | Effect |
|---|---|
| Purge All Tickets | Permanently deletes every ticket and its attachments |
| GDPR Email Purge | Deletes all tickets, replies, and files associated with a specific email address |
| Factory Reset | Resets all settings to defaults; does not delete tickets |
Toast Notifications
After saving settings, a toast notification slides in from the bottom-right corner confirming the save. It auto-dismisses after ~4 seconds and can be closed immediately with the × button.
The swhToast(message, type, duration) function is available globally on any page that loads swh-admin.js:
| Parameter | Type | Default | Description |
|---|---|---|---|
message | string | — | Text to display |
type | 'success' | 'error' | 'info' | 'success' | Visual variant |
duration | number | 4000 | Auto-dismiss delay in ms |
The ?swh_notice=saved redirect query parameter triggers the toast on page load. The parameter is removed from the URL via history.replaceState() so a page refresh does not re-trigger the notification.
Dark Mode (v3.6.0)
Simple WP Helpdesk renders cleanly in dark mode in three places:
Frontend (client-facing)
The submission form, client portal, My Tickets dashboard, and lookup form follow prefers-color-scheme: dark. No setting required — the browser/OS preference is honoured automatically.
If your site forces light mode (no theme-level dark support, brand reasons, etc.), set Settings → General → Frontend Portal Theme to Force light mode. This emits data-swh-theme="light" on every .swh-helpdesk-wrapper and overrides the dark media query.
Admin (staff-facing)
Admin pages now follow each user’s WordPress Profile → Color Scheme preference. Three of the built-in WP schemes are treated as dark and trigger SWH dark mode:
- Midnight
- Modern
- Ectoplasm
All other schemes (Default, Light, Blue, Coffee, Sunrise) render SWH admin in light mode, matching the surrounding chrome. There is no plugin-level setting — switching color schemes in the user profile is the single source of truth.
Implementation: swh_admin_color_is_dark() (in includes/helpers.php) inspects get_user_option( 'admin_color' ) and adds swh-admin-theme-dark to <body> on Settings, Reports, and the ticket list. CSS overrides live under body.swh-helpdesk-admin.swh-admin-theme-dark in swh-shared.css (token overrides) and swh-admin.css (component overrides).
Emails opt in to client dark mode via <meta name="color-scheme" content="light dark"> and a @media (prefers-color-scheme: dark) block emitted by swh_wrap_html_email(). Apple Mail (macOS / iOS) honour the directive and recolour backgrounds, text, and accent borders. Webmail clients that strip <style> tags fall back to the inlined light theme — readable in both modes.
Accessibility (v3.6.0)
v3.6.0 closes the WCAG 2.2 AA gaps surfaced during the v3.5.0 audit.
Keyboard navigation
- Skip-to-content link on Settings and Reports pages — the first focusable element on each page is “Skip to main content”, which jumps over the WP admin chrome.
:focus-visiblefocus rings — the high-contrast--swh-color-focusoutline is now only shown for keyboard navigation, not mouse clicks. Mouse users get clean buttons; keyboard users keep clear focus state.
Focus management
- CSAT widget — submitting a satisfaction rating moves focus to the “Thanks for your feedback” success message so screen-reader users hear confirmation. Pressing Esc dismisses the widget and returns focus to its trigger.
- Portal token expiry — when a portal link has expired, focus moves to the lookup form so users know where to recover their access without re-tabbing past the error notice.
Live regions
- SLA badge transitions (none → warn → breach) and KPI card value updates announce via
aria-live="polite".
Touch targets (WCAG 2.5.5 AA)
The following controls now meet the 44×44 CSS-pixel minimum:
- CSAT rating stars
- Merge ticket toggle — uses a transparent
::beforehit-zone overlay so the visible button stays at WP’s 28 px height while the touch zone extends to 44 px. - Status filter chips on the admin ticket list — render as inline-flex pills with
min-height: 44px.
WP-default subsubsub list views are intentionally unchanged.
Headings
A heading-hierarchy audit eliminated skipped levels and duplicate h1s across portal and admin views. The shared swh_render_empty_state( $title, $desc, $icon_svg_path, $heading_level = 'h2' ) helper in includes/helpers.php lets every “nothing here” surface emit the right heading level for its surrounding context.
Contrast
Internal-note text on the amber background was bumped from AA (4.5:1) to AAA (7:1) per #348.