PSBDx Smart Report Management gives your customers a clean, fast way to report issues directly from your site — no page reloads, no clunky forms, no leaving the page.
Reports are submitted via AJAX and stored in a dedicated admin interface, where your team can track statuses and update them. An admin dashboard widget gives you an at-a-glance overview at all times.
Key Features
- AJAX-powered modal report form — no page reload
- Mobile-first responsive design with iOS safe-area support
- Reporter identity collected server-side from WordPress session (name and email are never editable by users)
- Admin toggle to show or hide the reporter identity card in the form
- Per-form cooldown / rate limiting (enforced on both frontend and server)
- E-commerce order auto-link — reports from order pages are automatically linked to the order in the admin
- Admin dashboard widget with live status counts and recent reports
- Fully configurable report reasons (comma-separated, "Other" always appended)
- Optional extra fields (e.g. Transaction ID, Coupon Code)
- Configurable contact field with required/optional toggle
- Five report statuses with colour-coded badges (Processing, Contacting, Waiting, Solved, Failed)
- Admin list table columns: Reporter (with avatar), Linked Order, Status, Reported Item
- Shortcodes:
[psbdx_report id="X"] and [psbdx_user_reports]
- HPOS (High-Performance Order Storage) compatible
- LearnPress course, lesson, and quiz pages supported
- Auto-display on all products/courses or assign a form per-item
Shortcodes
[psbdx_report id="X"]
Display a report button and modal form. Replace X with the Report Form post ID shown in the Shortcode box.
[psbdx_user_reports]
Display a paginated table of the currently logged-in user's report history.
- Upload the
psbdx-smart-report-management folder to /wp-content/plugins/.
- Activate the plugin through Plugins > Installed Plugins.
- Go to Report Forms in the admin sidebar and click Add New Form.
- Configure the form, then copy the shortcode from the Shortcode meta box.
- Paste the shortcode on any page, post, or widget area.
Alternatively, enable global auto-display in the form settings to show the report button on all product or order pages automatically.
1.4.0
Learn more (launch overview): https://dev.psbdx.xyz/v1-4-0-summary-psrm/
- New — Field Settings is now a popup on every viewport: Field Settings was previously a permanently visible third grid column on desktop (220px library + flexible canvas + 280px settings), which left too little room for the canvas at anything narrower than a wide monitor. It's now a popup everywhere: a right-side drawer on desktop, a bottom sheet on mobile. Selecting a field opens it; the "X" button, the backdrop, or Esc closes it. Desktop is a simple 2-column grid now (library + canvas), so the canvas gets all the space it needs regardless of window width.
- Fixed — Duplicate/non-functional display checkboxes (1.3.2_beta): The Settings tab had two sections that appeared to do the same thing: "Global Display Settings" (which actually works, via the site-wide
psbdx_global_order_form_id / psbdx_global_product_form_id options) and "Plugin Integrations" (which saved post meta that nothing in the plugin ever read back — checking those boxes silently did nothing). Merged into one working "Automatic Display" section, correctly disabled with a warning badge when the required plugin isn't active. The dead post meta is cleaned up automatically on save.
- New — Fully functional mobile Form Builder (1.3.2): Replaced the old "please switch to Desktop Mode" mobile block with a real touch-optimized builder: a floating "Add Field" button opens the field library as a bottom sheet, selecting a field opens its settings, and every field card has Up/Down buttons for reordering (drag-and-drop remains available on desktop).
- Fixed — Desktop builder overflowing into other fields (1.3.3_beta): The Up/Down reorder buttons are non-shrinking, and the builder's grid/flex children were missing
min-width: 0 — a CSS gotcha where grid/flex items refuse to shrink below their content's intrinsic width unless told to. Wider field cards were bleeding out of the canvas column into the settings panel. Fixed by adding min-width: 0 so cards shrink and truncate instead of overflowing.
- Fixed — Mobile "Add Field" overlay not receiving taps (1.3.3_beta): Two compounding bugs: the builder layout had a mobile flex-column rule and an unscoped desktop grid rule with equal CSS specificity, and because the desktop rule came later in the file it silently won on mobile too, so the layout never actually switched to a single column; and jQuery UI's
.draggable()/.sortable() (mouse-event based, no touch support) were still bound on mobile, which could intercept a tap before the tap-to-add handler fired, so the touch fell through to the canvas underneath. Fixed by restructuring the layout mobile-first, skipping drag/sort initialization on mobile, and hardening the sheets with explicit pointer-events.
- Fixed — Canvas collapsing to an unreadable sliver at "in-between" widths (1.3.4_beta): At moderate viewport widths (a phone's "Desktop Mode", a narrow browser window, a small laptop) the fixed-width side columns left so little room that the canvas collapsed toward zero — the field card's non-shrinking buttons stayed visible while the icon and label had nowhere to render. Superseded in this release: with Field Settings now a popup instead of a third grid column, the canvas always gets the full remaining width.
1.3.1
- Fixed — Plugin Integrations section: The integrations section in the Form Builder Settings tab is now always visible. "Add to all order details pages" shows a WooCommerce badge and is disabled (with a "Plugin not installed" warning badge) when WooCommerce is not active. "Add to all product and course pages" shows the relevant badges for WooCommerce and/or LearnPress and is disabled when neither is installed.
- Improved — Security system:
PSBDX_SRM_Conflict_Guard now runs a multi-point security scan on admin_init (cached via 5-minute transient): checks post-type registration, core class presence, legacy form count, and captcha misconfiguration. Results are shown in both the Repair & Reset page and as a non-dismissible admin notice.
- Improved — Auto conflict detection: Plugin deactivation now busts the security scan cache so the next page load reflects the updated plugin state. The health check after third-party plugin activation also busts the security scan cache on pass.
- Improved — Repair & Reset page: Added a security status banner at the top of the page — green "all clear" when no issues are found, red list of issues when any are detected. Added a "Refresh security scan" action to manually bust the cached scan result.
- Improved — Admin dashboard widget: Added an unsolved reports banner showing how many reports are not marked as "Solved" (with a direct link to the reports list). Shows a green "all clear" message when every report is solved.
- New — Admin bar shortcut: A "Reports" link with a red count badge (unsolved reports) is now shown in the WordPress admin bar for administrators, providing a quick path to the reports list from any admin page.
- New — Support submenu page: Added a "Support" page under the Reports menu. Includes a contact form (Name, Contact Email, Attachments, Description) and a checkbox to include automatic system information (WordPress + PHP version, all installed and active plugins, active theme). On submission the email is sent to support@dev.psbdx.xyz via the site's configured mail. A collapsible preview shows exactly what system data will be attached before submission.
1.3.0
Learn more (launch overview): https://dev.psbdx.xyz/v1-3-0-summary-psrm/
- New — v2 Form Builder: Introduced a full drag-and-drop Form Builder replacing the flat v1 configuration meta box. Admin interface is now divided into two tabs: "Fields / Builder" (drag-and-drop canvas) and "Settings" (all configuration, integrations, and notifications).
- New — Field Library: Ten field types now available in the builder: Name (split First/Last), Email, Mobile Number, Text (single-line), Paragraph (textarea), Number, Drop-down/Select, Radio Buttons, Checkboxes, and Captcha.
- New — Granular Field Settings panel: Clicking any canvas field opens a live settings panel with Field Name (label), Field Handle (database slug), and a Required toggle.
- New — "Other" option for choice fields: Radio, Select, and Drop-down fields now support an "Enable Other Option" toggle in admin. On the frontend, selecting "Other" dynamically reveals a text input for a custom response.
- New — Mobile builder restriction: Builder canvas is hidden on viewports < 768 px with a clear user-facing message; Settings tab remains accessible at all screen sizes.
- New — Post-update global security notice: On
admin_init, the plugin checks whether any published report forms still use the legacy v1 schema. If any are found, a non-dismissible notice-error banner is displayed across the entire WordPress admin until every form is migrated and saved.
- New — Legacy form migration gate: Editing a v1 form now shows a blocking "Legacy Form Detected" prompt. Clicking "Update form to the new builder" triggers an AJAX parser that maps the old data structure into a v2 field schema, allowing editing and saving in the new format. Saving applies the
_psrm_form_version = 2 flag, removing the form from the legacy count.
- New — Dynamic plugin integrations (Settings tab): "Enable WooCommerce Integration" checkbox is now shown only when WooCommerce is active; "Enable LearnPress Integration" only when LearnPress is active. Both are detected via PHP class-existence checks.
- New — Conditional Captcha field: The Captcha entry in the field library is disabled and shows a warning badge ("Please configure Captcha settings in PSRM global settings first.") when no captcha API keys are configured in global PSRM settings.
- New — Frontend v2 field renderer:
PSBDX_SRM_Form_Renderer::render_fields() renders all v2 field types from the JSON schema, including the "Other" reveal behaviour via delegated JS event listeners.
- New — v2 AJAX submission handler:
class-psbdx-srm-ajax.php now detects _psrm_form_version and routes v2 submissions through a per-field schema validator that sanitizes, validates required fields, and resolves "Other" values before building the report-log post content. V1 submission path is fully preserved for backward compatibility.
- Improved — Security: Form builder fields are sanitized through
sanitize_fields_schema() before being stored as JSON. Nonce verification precedes all $_POST reads. v2 field handles are constrained to sanitize_key().
- Improved — Legacy count caching:
psrm_legacy_form_count transient (5-minute TTL) prevents a raw DB query on every admin page load; transient is busted immediately after any form is saved as v2.
- Compat — Backward compatible: All v1 (legacy) form data, meta keys, shortcodes, and AJAX submission logic remain intact. No existing form breaks on update.
1.2.0
Learn more (full release story): https://dev.psbdx.xyz/v1-2-0-summary-psrm/
New Added:
-
Added Captcha support for Google reCaptcha, hCaptcha, Cloudflare Turnstile.
Fixed:
-
Fixed known bugs and visual glitches.
1.1.0
Learn more (full release story): https://dev.psbdx.xyz/v1-1-0-summary-psrm/
Admin menu and navigation
- New top-level PSBDx Reports menu groups Report Forms and Report Logs in one place for easier management.
-
Settings and Repair & Reset appear under this menu (requires manage_options).
Settings page (tabbed)
-
Status — Add unlimited custom report statuses (label plus background and text colours). Built-in statuses remain fixed; custom rows can be removed with a Remove action and saved to delete them from storage.
- Global Rate Limiting — Site-wide default cooldown (minutes) for logged-in users; use 0 to disable globally. Per-form cooldown in each Report Form still overrides the global value when set on the form.
- Captcha — Placeholder tab (“Coming soon”).
-
Email — Placeholder tab (“Coming soon”).
Repair & Reset
-
Read-only diagnostic scan (database connectivity, posts table, CPT registration, global form options, report counts, invalid status meta, rate-limit option rows).
- Clear rate-limit transients — Removes stored cooldown entries (
psbdx_cd_*) from the options table.
-
Fix invalid status meta — Normalizes unknown stored status values back to “Processing”.
Conflict guard
-
After another plugin is activated, a lightweight health check runs; if this plugin’s post types or helpers fail to load, that plugin is automatically deactivated and an admin notice names it (filter
psbdx_srm_conflict_guard_enabled to disable).
Plugin row action links
-
On Plugins → Installed Plugins, administrators see Settings, Repair & Reset, and Documentation next to Activate/Deactivate.
Custom statuses (frontend and admin)
-
Custom statuses merge with the five built-in statuses everywhere (meta boxes, list tables, dashboard widget,
[psbdx_user_reports] chips).
Performance
-
Dashboard status totals use a single aggregated query instead of many separate queries.
-
Published report forms list is cached per request where selectors need it (e.g. WooCommerce, LearnPress).
Multisite / network
-
Plugin header Network: true for WordPress.org compatibility.
-
New blogs on a network use
active_sitewide_plugins to detect network activation when stamping review-notice activation time.
Other fixes
-
Ensure the main plugin file starts with
<?php only (no stray characters before the opening tag) to prevent “headers already sent” warnings.
1.0.1
Learn more (full release story): https://dev.psbdx.xyz/v1-0-1-summary-psrm/
New: Admin Review Notice
- Added a dismissible admin panel notification that appears 24 hours after plugin activation, asking the site admin to leave a review on WordPress.org.
- Three response options:
- "Yes, you deserve it!" — Opens the WordPress.org review page in a new tab and permanently dismisses the notice.
- "Nope, I'll review later" — Snoozes the notice for 7 days, after which it reappears.
- "I already reviewed" — Permanently dismisses the notice without any redirect.
- Dismiss state is stored per-site (not network-wide), so each site on a multisite network manages its own notice independently.
- Notice is only shown to users with the manage_options capability.
-
All AJAX requests are nonce-verified for security.
New: Documentation Link on Plugins Page
-
Added a Documentation link next to the Deactivate/Activate action on the WordPress Plugins page, linking directly to the plugin's documentation at dev.psbdx.xyz.
Improved: Multisite Compatibility
-
Activation hook now handles network-wide activation on multisite — iterates every site using switch_to_blog / restore_current_blog to write per-site options correctly.
- New sites added to a network where the plugin is already network-active automatically receive their own activation timestamp via the wp_insert_site hook.
- Plugin text domain is now loaded inside plugins_loaded so per-site language settings are respected on multisite.
- Backward-compatible lazy activation stamping — existing sites active before v1.1.0 receive a timestamp on first load with no manual action required.
1.0.0
Learn more (launch overview): https://dev.psbdx.xyz/v1-0-0-summary-psrm/
- Initial release.
- Full multi-file plugin architecture following WordPress coding standards.
- AJAX report modal with mobile-first responsive design.
- Server-side identity collection (name and email never from form input).
- Admin toggle to show/hide reporter identity card.
- Per-form rate limiting using WordPress transients.
- WooCommerce / e-commerce order auto-link with HPOS support.
- Admin dashboard widget with status counts and recent reports.
- Configurable reasons, extra fields, contact field, and cooldown per form.
- Five report statuses with colour-coded admin badges.
[psbdx_report] and [psbdx_user_reports] shortcodes.
- LearnPress course, lesson, and quiz page integration.