Title: FonX Delete User
Author: Tabi Idris
Published: <strong>September 24, 2026</strong>
Last modified: September 24, 2026

---

Search plugins

![](https://ps.w.org/fonx-delete-user/assets/banner-772x250.png?rev=3710337)

![](https://ps.w.org/fonx-delete-user/assets/icon-256x256.png?rev=3710337)

# FonX Delete User

 By [Tabi Idris](https://profiles.wordpress.org/drizy/)

[Download](https://downloads.wordpress.org/plugin/fonx-delete-user.zip)

 * [Details](https://wordpress.org/plugins/fonx-delete-user/#description)
 * [Reviews](https://wordpress.org/plugins/fonx-delete-user/#reviews)
 *  [Installation](https://wordpress.org/plugins/fonx-delete-user/#installation)
 * [Development](https://wordpress.org/plugins/fonx-delete-user/#developers)

 [Support](https://wordpress.org/support/plugin/fonx-delete-user/)

## Description

FonX Delete User turns account erasure into a controlled, reviewed process instead
of a one-click auto-delete.

Most “delete my account” plugins force visitors into their own button or form. FonX
Delete User takes the opposite approach: you keep the form you already have and 
the plugin quietly powers it in whichever way fits your site.

#### What makes it different

 * Bring-your-own-form — integrate any existing HTML form on your site with a CSS
   selector and data-fxldu-field mapping. The form you styled stays the form your
   visitors see; the plugin’s JavaScript attaches to it without blocking its own
   handler.
 * Config-only mode — toggle the plugin’s own markup off entirely. The shortcode
   or block still emits the per-site request token and configuration, so an existing
   form can drive submissions with nothing extra rendered.
 * Admin approval pipeline — nothing is deleted automatically. Every request waits
   in the admin queue for you to approve, reject, or delete it.
 * External API mode — instead of deleting inside WordPress, forward erasure submissions
   to your own endpoint for the external system to complete.
 * Audit logging — every request and outcome is recorded in the database or a file,
   with a built-in viewer.

#### Features

 * Dual deletion modes — store requests pending admin approval (wordpress_db) or
   forward submissions immediately to an external endpoint (external_api).
 * Form builder — add text, email, password, textarea, checkbox, select, and hidden
   fields with required toggles, placeholders, options, and validation regexes.
 * Flexible injection — the [fxldu_form] shortcode, a native Gutenberg block, or
   integration with an existing page form via CSS selector and data-* field mapping.
 * Email notifications — alert the administrator (or a custom admin email) about
   new requests, and acknowledge the requester by email with configurable subject/
   body and placeholders.
 * Security hardening — honeypot anti-bot field, per-site HMAC-compatible request
   tokens, per-IP rate limiting, capability-gated admin endpoints, prepared SQL,
   and fully escaped output.

#### Submission flow

 1. A visitor submits the form (shortcode, block, or an integrated existing form).
 2. The frontend checks the honeypot, validates required fields, and posts a JSON request
    containing a per-site token, the user email, and the collected fields.
 3. The request is stored with status pending (rate-limited per IP).
 4. The administrator is notified; the requester can also receive an acknowledgement
    email.
 5. On approval, the user is permanently deleted via wp_delete_user() (WordPress Database
    mode) or the request is marked approved for the external system (External API mode).
    On rejection, the request is marked rejected and no deletion happens.
 6. The requester is notified of the outcome.

### Additional Information

This release addresses the points raised during the plugin review and hardens two
runtime paths found while testing. Details of what changed and why:

 * Global prefix — every global identifier now uses the unique `fxldu` prefix instead
   of the generic `du_` / `delete_user_` names: option keys, database tables, transients,
   the REST namespace (`fxldu/v1`), action/filter names, nonces, admin menu slugs,
   the `[fxldu_form]` shortcode, the `fxldu/form` block, enqueue handles, JavaScript
   globals, and frontend CSS classes. PHP constants are `FXLDU_*` and the class 
   namespace is `Fxldu\`. The text domain `fonx-delete-user` and the plugin folder
   name are unchanged.
 * Database cleanup — the admin list tables (Fields, Requests, Logs) and the REST
   listing endpoint no longer pass an empty argument list to `$wpdb->prepare()` 
   when no filter or search is applied; in that case the static count query runs
   directly instead of emitting the “the query argument must have a placeholder”
   notice.
 * Existing-form integration — when the integration selector matches a non-form 
   container (some themes wrap their form in a div that is matched instead of the`
   <form>` itself), field collection and email resolution now read the named inputs
   directly instead of throwing inside `new FormData()`. The window integration-
   guard is `__fxlduIntegrationBound`.
 * Script output — the frontend form configuration is no longer printed as raw inline`
   <script>` tags. The shortcode and block register the `fxldu-frontend` script 
   through `wp_enqueue_script()` and inject the config object with `wp_add_inline_script('
   fxldu-frontend', $js, 'before' )`. The unused `print_frontend_config()` method
   was removed from the main plugin file, and no `<script>` or `<style>` strings
   remain in the plugin source.
 * Sanitization of custom headers — the admin live-test of the API connection now
   passes the custom headers through `sanitize_textarea_field( wp_unslash( $_POST['
   api_headers'] ) )` before building the request, matching the sanitization applied
   when the headers are saved.
 * Contributors — the `Contributors:` header now uses the plugin owner’s WordPress.
   org username.
 * Log file location — file logging no longer writes to a hard-coded `WP_CONTENT_DIR`
   path. Logs now go to a plugin-specific subfolder under the uploads directory (`{
   uploads}/fxldu/fxldu-logs.log`), created with `wp_mkdir_p()`, and each line is
   appended with `error_log( $line, 3, $log_path )`.
 * External-request REST proxy — the `/external-request` route remains open for 
   anonymous form submissions but is now hardened: it keeps the honeypot check and
   the per-site token verification, strips internal keys from the forwarded payload,
   fails closed with HTTP 403 unless External API mode is active, and is rate-limited
   per IP (its own transient counter so a normal submission still counts only once
   per endpoint leg).
 * Uninstall cleanup — the broad `option_name LIKE` query (which could delete options
   owned by other plugins sharing the old prefix) and a usermeta `LIKE` cleanup (
   the plugin writes no user meta) were removed. `uninstall.php` now deletes an 
   explicit list of the 26 options owned by this plugin plus the three plugin-owned
   database tables.
 * Rate-limit filter — the `fxldu_rate_limit` filter documented in the FAQ is now
   actually applied. Both the `/request` and `/external-request` endpoints enforce
   their per-IP limit through a shared helper whose default is `max( 1, Options::
   get_rate_limit() )` and which honors `apply_filters( 'fxldu_rate_limit', $limit,
   $ip )`.

## Screenshots

[⌊Settings — General: choose the deletion mode, security limits, and frontend messaging.⌉⌊
Settings — General: choose the deletion mode, security limits, and frontend messaging
.⌉[

Settings — General: choose the deletion mode, security limits, and frontend messaging.

[⌊Settings — Integration: connect an existing form with a CSS selector and data-
fxldu-field mapping.⌉⌊Settings — Integration: connect an existing form with a CSS
selector and data-fxldu-field mapping.⌉[

Settings — Integration: connect an existing form with a CSS selector and data-fxldu-
field mapping.

[⌊Settings — External API: configure the external endpoint, method, authentication,
and header forwarding.⌉⌊Settings — External API: configure the external endpoint,
method, authentication, and header forwarding.⌉[

Settings — External API: configure the external endpoint, method, authentication,
and header forwarding.

[⌊Custom Fields — define the fields visitors submit alongside their email.⌉⌊Custom
Fields — define the fields visitors submit alongside their email.⌉[

Custom Fields — define the fields visitors submit alongside their email.

[⌊Frontend form — the account deletion form as visitors see it.⌉⌊Frontend form —
the account deletion form as visitors see it.⌉[

Frontend form — the account deletion form as visitors see it.

[⌊Delete Requests — review the queue and approve, reject, or delete each request.⌉⌊
Delete Requests — review the queue and approve, reject, or delete each request.⌉[

Delete Requests — review the queue and approve, reject, or delete each request.

[⌊Audit Logs — lifecycle events recorded for every request.⌉⌊Audit Logs — lifecycle
events recorded for every request.⌉[

Audit Logs — lifecycle events recorded for every request.

[⌊Settings — Email — admin alerts and the requester acknowledgement email.⌉⌊Settings—
Email — admin alerts and the requester acknowledgement email.⌉[

Settings — Email — admin alerts and the requester acknowledgement email.

[⌊Log viewer — browse recorded log entries in the admin.⌉⌊Log viewer — browse recorded
log entries in the admin.⌉[

Log viewer — browse recorded log entries in the admin.

## Blocks

This plugin provides 1 block.

 *   Delete User Form Renders the configurable account deletion form.

## Installation

 1. Upload the fonx-delete-user folder to /wp-content/plugins/.
 2. Activate the plugin through the Plugins screen.
 3. Activation creates three database tables — {prefix}fxldu_fields, {prefix}fxldu_requests,
    and {prefix}fxldu_logs — and seeds the default options.
 4. Configure it under FonX Delete User  Settings, then add fields under Fields.

## FAQ

### How do I put the form on a page?

Use the [fxldu_form] shortcode anywhere in post content or a widget, or insert the
Delete User Form block in the block editor. Both render server-side, so they always
reflect your current fields and settings.

### How do I use my own existing form instead of the plugin’s form?

Enable Integration under Settings, set the CSS selector for your form, and add data-
fxldu-field attributes to the inputs you want mapped. Keep the shortcode or block
on the same page (it supplies the request token and configuration) and, if you do
not want the plugin’s form visible, uncheck Show Form in the Form settings tab —
only the configuration script is emitted.

### How is the user identified?

The plugin resolves the submitter by email. Add an email-type field to the form (
or name a field user_email or email). Requests without a valid email are rejected.

### What happens to the user’s account?

In WordPress Database mode the account is deleted only after an administrator approves
the pending request. In External API mode the submission is forwarded to your endpoint
immediately, and the external system is responsible for erasure.

### How does the plugin stop spam?

A hidden honeypot field silently discards automated submissions, every request must
carry a valid per-site token, and each IP is rate-limited (default 5 requests/hour).
The limit is adjustable via the fxldu_rate_limit filter.

### What emails does the plugin send?

The administrator receives a new-request alert (to the admin email configured in
the Email settings tab, falling back to the site admin email). The requester can
receive an acknowledgement email on submission and is notified on approval, rejection,
and completion. Subject and body for the acknowledgement are configurable and support{{
site_name}}, {{user_email}}, and {{request_id}}.

### Is there an API?

Yes. POST /wp-json/fxldu/v1/request accepts deletion requests (public, token-verified).
Administrators can use GET /wp-json/fxldu/v1/requests, POST /requests/{id}/approve,
and POST /requests/{id}/reject.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“FonX Delete User” is open source software. The following people have contributed
to this plugin.

Contributors

 *   [ Tabi Idris ](https://profiles.wordpress.org/drizy/)

[Translate “FonX Delete User” into your language.](https://translate.wordpress.org/projects/wp-plugins/fonx-delete-user)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/fonx-delete-user/),
check out the [SVN repository](https://plugins.svn.wordpress.org/fonx-delete-user/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/fonx-delete-user/)
by [RSS](https://plugins.trac.wordpress.org/log/fonx-delete-user/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.1.0

 * Renamed every global prefix to the unique `fxldu` prefix to prevent conflicts
   with other plugins: option keys, database tables, transients, the REST namespace(`
   fxldu/v1`), action/filter names, nonces, the admin menu slugs, the `[fxldu_form]`
   shortcode, the `fxldu/form` block, enqueue handles, JavaScript globals, and frontend
   CSS classes.
 * PHP constants are now `FXLDU_*` and the class namespace is `Fxldu\`.
 * Fixed a “wpdb::prepare was called incorrectly” notice on the Fields, Requests,
   and Logs admin pages and on the REST listing endpoint when no filter or search
   is applied — count queries without placeholders no longer go through prepare().
 * Existing-form integration now tolerates a non-form container as the integration
   target (e.g. a theme wrapper div): field collection and email resolution read
   the named inputs directly instead of failing inside new FormData().

#### 1.0.4

 * Frontend configuration is now output through the script loader (wp_add_inline_script)
   instead of raw inline script tags.
 * Custom API headers are sanitized before test-connection and outbound requests.
 * The external-request REST proxy is only active in External API mode and is rate-
   limited per IP.
 * Implemented the documented fxldu_rate_limit filter for adjusting the per-IP request
   limit.
 * File logs now write to the uploads directory (a plugin-specific subfolder) instead
   of wp-content.
 * Uninstall removes only this plugin’s own options, not any option whose name contains“
   fxldu_”.
 * Corrected the Contributors list to the plugin owner’s WordPress.org username.

#### 1.0.3

 * Renamed the admin page title from “Deletion Requests” to “Delete Requests”.
 * Added a status filter dropdown (All Statuses / Pending / Completed / Rejected)
   with a Filter button to the requests list table.

#### 1.0.2

 * External API submissions now record server-side and prefer the plugin’s own success
   message.
 * Added a Show Form option so the shortcode/block can emit configuration only (
   for existing-form integration).
 * Added an Email settings tab for the admin recipient and a configurable requester
   acknowledgement email.
 * Frontend success/error messages now always come from the General settings.

#### 1.0.1

 * Fixed double rendering on the settings page.
 * Fixed stale JavaScript state on the settings page.
 * Improved external API request handling and success-message fallbacks.

#### 1.0.0

 * Initial release: dual deletion modes, form builder, shortcode and block injection,
   existing-form integration, admin review pipeline, audit logging, email notifications,
   and guest-form security.

## Meta

 *  Version **1.1.0**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.7 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 8.2 or higher **
 * Tags
 * [delete user](https://wordpress.org/plugins/tags/delete-user/)[form builder](https://wordpress.org/plugins/tags/form-builder/)
   [GDPR](https://wordpress.org/plugins/tags/gdpr/)[user management](https://wordpress.org/plugins/tags/user-management/)
 *  [Advanced View](https://wordpress.org/plugins/fonx-delete-user/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/fonx-delete-user/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/fonx-delete-user/reviews/)

## Contributors

 *   [ Tabi Idris ](https://profiles.wordpress.org/drizy/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/fonx-delete-user/)