WP Manifestindependent plugin directory
manifest / content / acf-extensions

Advanced Custom Fields Extensions WP Registry grade D+. High-severity findings · 3 findingsWP RegistryHigh-severity findings · 3 findingsOpen the reportD+

Extend ACF with components, new field types, and smarter rules to speed up custom WordPress development.

★ 16stars
3.8kcomposer installs
1.3.16latest · 11mo ago

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/metabolism/acf-extensions/archive/refs/heads/1.3.x.zip

On Packagist as metabolism/acf-extensions:

composer require metabolism/acf-extensions
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Latest Stable Version Latest Unstable Version License

Supercharge Advanced Custom Fields with reusable components, enhanced field types (link, map, inline editor, dynamic select…), and powerful display rules to build smarter WordPress backends.

🚀 New Features

  • Components system: treat a field group as a reusable component, and include it in other groups.
  • Enhanced link field: also saves the post ID, ensuring the URL updates automatically if changed.
  • Enhanced map field: adds country, iso, and country_short to the field value.
  • Text field counter: displays the current/maximum characters (e.g. 100/250).
  • Tag selector: select tags for a field (e.g. h1, h2, h3).

🧩 New Rules

  • Term type: Top-level term (no parent), Parent term (has children), Child term (has parent).
  • Site: in multisite setups, show fields on a specific site only.
  • Menu item depth: condition based on menu hierarchy level.
  • Menu field: condition based on menu selection.
  • Post parent: show fields only if the current post parent matches the rule.
  • Term template: condition based on the taxonomy template.

🆕 New Fields

  • Components: enhanced layout, select multiple components from a list.
  • Component: improved clone field, pick a component from a list.
  • Post type: dropdown listing all registered post types.
  • Menu: dropdown listing all menus.
  • Dynamic select: generate a dropdown whose values depend on another field.
  • Inline editor: text field with inline editing powered by inLine.

Screenshots

Component

Component edition Component Components

Counter

Text counter

Tag selector

Tag selector

inLine editor

inLine editor

Releases

Newest 25 of 32 recorded releases.

Tag
Published
1.3.16 latest
Nov 5, 2025 11mo ago
Sep 10, 2025 1 year ago
Mar 4, 2025 1 year ago
Feb 10, 2025 1 year ago
Sep 18, 2024 2 years ago
Apr 2, 2024 2 years ago
Feb 22, 2024 2 years ago
Oct 9, 2023 3 years ago
Mar 24, 2023 3 years ago
Mar 17, 2023 3 years ago
Feb 14, 2023 3 years ago
Feb 2, 2023 3 years ago
Jan 30, 2023 3 years ago
Jan 20, 2023 3 years ago
Jan 18, 2023 3 years ago
Jan 16, 2023 3 years ago
Oct 9, 2022 4 years ago
Aug 12, 2022 4 years ago
Mar 4, 2022 4 years ago
Nov 17, 2021 4 years ago
Aug 6, 2021 5 years ago
Jun 14, 2021 5 years ago
Jun 3, 2021 5 years ago
Mar 3, 2021 5 years ago
Mar 1, 2021 5 years ago
All releases on GitHub →

These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.

D+ grade

Security

Advanced Custom Fields Extensions 1.3.16 · audited by WP Registry

High-severity findings.

3 high
Audited release
1.3.16
Findings
3
Worst severity
high
Content hash
efe1c36548fe9a87e1a4b7b3…

Findings

  • high Stored XSS in inline_editor via strip_tags allowing event-handler attributes

    xss_stored

    acf_field_inline_editor::update_value() sanitizes submitted HTML with strip_tags() allowing <a>, <b>, <i>, <strong>, <u>, etc. strip_tags() does not strip attributes, so payloads such as <a href="javascript:alert(document.cookie)">x</a> or <i onmouseover="alert(1)">x</i> are stored in ACF post meta. render_field() then concatenates $field['value'] unescaped into a contenteditable div and echoes it. WordPress does not kses ACF meta, so authors/contributors who lack unfiltered_html (and therefore cannot XSS post_content) can still plant HTML that executes when an editor/admin opens the post, and that themes typically print via get_field() on the front end. The inLine JS copies trigger.innerHTML into the hidden input on change, preserving the payload across saves.

    fields/class-acf-field-inline-editor.php:32-85,100-131

    Recommendation

    Replace strip_tags() with wp_kses() using an explicit allowed-tags/attributes map (href on <a> passed through esc_url, no event-handler attributes). Escape on output unless the value has been kses'd; never echo unsanitized HTML into the admin field UI.

  • high Stored XSS in instagram_post field via unescaped thumbnail URL derived from user input

    xss_stored

    update_value() extracts an Instagram shortcode with the greedy regex /\/p\/(.+)\/.*/ and builds both a local filepath and a later <img src> from that capture. Quotes and HTML metacharacters are not sanitized. file_put_contents() is called even when curl fails (false is written as an empty file), so file_exists() succeeds and a thumbnail URL containing the payload is stored. render_field() echoes <img src="'.$thumbnail.'"> with no esc_url/esc_attr. A value such as https://www.instagram.com/p/x" onerror="alert(1)" junk="/ becomes <img src=".../instagram/x" onerror="alert(1)" junk=".jpg"> which auto-executes when anyone (typically an editor/admin) opens the ACF field. The same users who can save the post can plant this; the field is deprecated but still registered.

    fields/class-acf-field-instagram_post.php:15-58,100-114

    Recommendation

    Allow only [A-Za-z0-9_-] in the Instagram shortcode, reject path characters, and echo the thumbnail with esc_url() inside esc_attr(). Do not write files from attacker-controlled names.

  • high CSRF via GET ?clean-acf=1 deletes all acf-field posts and rewrites ACF JSON

    csrf

    On acf/init the plugin treats a GET query arg as a destructive maintenance action. The only gates are is_admin() and current_user_can('administrator'); there is no nonce, no POST requirement, and no confirmation. A logged-in administrator who visits /wp-admin/?clean-acf=1 (or any wp-admin URL including admin-ajax.php with that query arg) — including via a cross-site link, SameSite=Lax top-level GET — causes: (1) glob+file_put_contents over every file in the ACF save_json directory, and (2) DELETE FROM posts WHERE post_type='acf-field', wiping every ACF field definition in the database. Changelog 1.1.8 documents this as a backend cleaning feature left in production. Observable consequence: custom fields disappear site-wide until restored from backup/JSON.

    acf-extensions.php:78-99

    Recommendation

    Remove this runtime GET footgun from production, or require a POST + wp_verify_nonce + manage_options check and a confirmation step. Never perform DELETE/file writes on a mere query-string visit.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.