WP Manifestindependent plugin directory
manifest / editor / mello-block-extensions

Mello Block Extensions WP Registry grade D. High-severity findings · 5 findingsWP RegistryHigh-severity findings · 5 findingsOpen the reportD

★ 1stars
212release downloads
≈10active sites
v2.3.0latest · 1mo ago

Install

Download mello-block-extensions.zip From the v2.3.0 release on GitHub, Sep 8, 2026

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/mellographics/mello-block-extensions/releases/download/v2.3.0/mello-block-extensions.zip
Updates itself. It ships its own updater (Plugin Update Checker), so new versions appear under Dashboard → Updates.

Mello Block Extensions

A modular plugin for extending WordPress core blocks with enhanced functionality, built for Mello Graphics projects.

Visit Mello Graphics


Overview

Mello Block Extensions allows toggled enhancements for WordPress core blocks through a modular, well-structured plugin architecture. Each enhancement (or "extension") targets a specific core block and can be enabled or disabled from the WordPress admin interface.

Plugin Structure


mello-block-extensions/
├── build/              # Compiled assets for active extensions
├── src/blocks/         # Source files for each MelloBlock
├── src/extensions/     # Source files for each block extension
├── inc/                # Admin panel, enqueue logic, helpers
├── languages/          # .pot file for translations
├── bin/                # Holds custom build processes
├── mello-block-extensions.php  # Plugin bootstrap

Each extension includes:

  • edit.js – Editor enhancements
  • frontend.js – Front-end JS (optional)
  • styles.scss – Front-end styles
  • editor.scss – Editor styles
  • block-functions.php – Optional PHP for rendering filters/templates

Extensions

Extension Description
add-data-attributes Adds an input to render custom data attributes on the front end
add-smooth-scroll Adds smooth scroll controls to core and mellobase blocks
animation-controls Adds scroll-triggered animation controls to core and mellobase blocks
button-icon-toggle Adds icon upload and position controls to the core Button block
button-modal-toggle Adds modal popup support to the core Button block
buttons-allow-additional-blocks Allows additional blocks to be nested inside the core Buttons block
columns-reverse-toggle Adds a responsive reverse-order toggle to the core Columns block
content-in-modal-toggle Adds a toggle to wrap block content inside a modal on the front end
cover-ext-video Allows external video URLs (YouTube/Vimeo) in the core Cover block
details-faq-schema Adds a toggle that outputs FAQ schema markup on the core Details block
details-heading-level Adds a custom heading level control inside the core Details block
details-name-attribute Adds a name attribute input to the core Details block
group-link-wrapper Adds a URL link wrapper to the core Group block via the toolbar
group-tag-name Adds additional HTML tag options to the core Group block
load-motion-library Loads the Motion.js animation library globally on the front end
navigation-allowed-blocks Allows additional blocks within the core Navigation block to create complex menus
navigation-link-render-image Renders an image inside the core Navigation Link block
query-exclude-current-post Re-renders the Query Loop block excluding the current post from results
query-match-taxonomies Adds taxonomy-matching controls to filter the Query Loop by related terms
query-render-featured-video Enables featured video (ACF) inside the Query Loop block. Requires an ACF featured_video field.
render-svg Adds a toggle to render inline SVG output on image-based blocks

MelloBlocks

Block Description
Swiper Full-featured Swiper.js slider block supporting query elements, responsive slides, autoplay, pagination, navigation, creative effects, and more
Counter Displays stats and figures animated in on scroll
Featured Video Renders a featured video field (ACF) for the current post

Deprecated Extensions

The following extensions are no longer in active use and have been excluded from the build:

Extension Notes
post-type block Superseded by WordPress core
read-time block Superseded by WordPress core
add-data-aria-label Superseded by add-data-attributes
mega-menu No longer maintained
mega-menu-section No longer maintained

Developer Admin Settings

The plugin adds a settings page under Settings → Block Extensions where you can:

  • Toggle individual extensions on/off
  • Dynamically load assets (JS/CSS/PHP) only for enabled extensions
  • Theme-specific configurations (coming soon)

Installation

  1. Visit the GitHub Releases page.
  2. Download the latest .zip release of the plugin.
  3. In your WordPress admin, go to Plugins → Add New → Upload Plugin.
  4. Upload the zip and activate the plugin.

Development

Requirements

  • Node.js & npm
  • WordPress with a block-based theme

Install & Build


npm install
npm run build

Dev Scripts

  • npm run build – Build all enabled extensions
  • npm run start – Watch mode for dev
  • npm run export – Create deployable plugin .zip

Screenshot

Mello Block Extensions Admin Screenshot

Roadmap

  • [ ] Scroll based animations
  • [ ] Auto-detection of available extensions
  • [ ] Extension grouping in admin UI
  • [ ] JSON config import/export

License

GPL-2.0+ © Mello Graphics

Maintainer

Ashley Pickering – https://mellographics.com

Releases

Newest 25 of 40 recorded releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v2.3.0 latest
Sep 8, 2026 1mo ago
mello-block-extensions.zip
15
Jun 13, 2026 4mo ago
mello-block-extensions.zip
18
Apr 15, 2026 6mo ago
mello-block-extensions.zip
9
Apr 14, 2026 6mo ago
mello-block-extensions.zip
6
Apr 9, 2026 6mo ago
mello-block-extensions.zip
0
Apr 7, 2026 6mo ago
mello-block-extensions.zip
12
Mar 31, 2026 6mo ago
mello-block-extensions.zip
9
Mar 13, 2026 7mo ago
mello-block-extensions.zip
17
Dec 11, 2025 10mo ago
mello-block-extensions.zip
14
Dec 11, 2025 10mo ago
mello-block-extensions.zip
2
Nov 19, 2025 11mo ago
mello-block-extensions.zip
13
Nov 10, 2025 11mo ago
mello-block-extensions.zip
11
Nov 6, 2025 11mo ago
mello-block-extensions.zip
7
Aug 14, 2025 1 year ago
mello-block-extensions.zip
10
Aug 14, 2025 1 year ago
mello-block-extensions.zip
2
Aug 11, 2025 1 year ago
mello-block-extensions.zip
8
Aug 3, 2025 1 year ago
mello-block-extensions.zip
11
Aug 2, 2025 1 year ago
mello-block-extensions.zip
1
Aug 2, 2025 1 year ago
mello-block-extensions.zip
3
Aug 1, 2025 1 year ago
mello-block-extensions.zip
3
Jul 14, 2025 1 year ago
mello-block-extensions.zip
9
Jul 8, 2025 1 year ago
mello-block-extensions.zip
7
Jul 3, 2025 1 year ago
mello-block-extensions.zip
2
Jul 2, 2025 1 year ago
mello-block-extensions.zip
3
Jul 1, 2025 1 year ago
mello-block-extensions.zip
1
All releases on GitHub →

Active-site estimate ≈10 comes from the median of recent superseded releases. Method.

D grade

Security

Mello Block Extensions 2.3.0 · audited by WP Registry

High-severity findings.

4 high 1 medium
Audited release
2.3.0
Findings
5
Worst severity
high
Content hash
5d5b4be61af1c8793a0f4d02…

Findings

  • high Default-on SVG uploads are inlined into frontend HTML with a sanitizer that does not strip scripts or event handlers

    xss_stored

    The render-svg extension is enabled on activation (all build/extensions/* slugs default true). It adds image/svg+xml to upload_mimes for every role that can upload (Author+). The prefilter sanitizer only rejects <iframe>, <object>, <embed>, and <link>, and skips even that check when the file contains the string __SVGATOR_PLAYER__. It never looks for <script>, onload/onerror, javascript: URLs, or <foreignObject>. render_style_svg_as_inline() then runs on the_content and on a full-page ob_start buffer: any descendant <img> of an element with class style-svg (additional CSS class on a Group, or renderSVG on site-logo / post-featured-image) is resolved under ABSPATH and imported via DOM importNode. Event-handler XSS in the SVG therefore executes in the site origin for every visitor. SVGs that contain <script> are swapped to <embed type="image/svg+xml" src="…">, which still runs SVG script in a same-origin nested document. An Author uploads a tiny onload SVG, wraps it in a group with class style-svg, and publishes.

    build/extensions/render-svg/block-functions.php:6-44,92-171

    Recommendation

    Do not enable SVG for upload_files users. If SVG is required, restrict the mime to manage_options, sanitize with a real SVG library (strip scripts, event handlers, foreignObject, external refs), and never inline unsanitized SVG into HTML. Do not treat <embed type=image/svg+xml> as a safe fallback for script-bearing files.

  • high Contributor stored XSS via dataAttributes re-injected into heading/figure tags after htmlspecialchars_decode

    xss_stored

    The add-data-attributes UI is a free-text 'Data Attributes' field on core/paragraph, heading, post-title, query-title, image, group, and columns. Server-side, mello_render_data_attribute() (and the duplicate path in add-smooth-scroll) takes attrs.dataAttributes, runs htmlspecialchars_decode(esc_attr()), and concatenates the result into the first <h1>-<h6> or <figure> tag. esc_attr is fully undone, so onclick="alert(1)" or a tag-breakout ><script>… is written into the frontend HTML. WordPress kses does not parse JSON inside block comments, so a Contributor who cannot use unfiltered_html can still store the payload in <!-- wp:post-title {"dataAttributes":"onclick=\"alert(1)\""} /-->. When an author publishes, or an admin previews, the script runs in the site origin. extraProps on static blocks also copies arbitrary attribute names into saved HTML; that path is largely kses-gated for low-priv users, but the PHP re-inject on dynamic post-title/query-title/featured-image is not.

    build/extensions/add-data-attributes/block-functions.php:3-16

    Recommendation

    Allowlist attribute names to data-[a-z0-9-]+ only. Escape names and values separately (esc_attr) and do not htmlspecialchars_decode. Never concatenate raw user strings into HTML tags. Apply the same allowlist in the extraProps save filter.

  • high Contributor stored XSS via unsanitized Button iconGlyph concatenated into frontend HTML

    xss_stored

    The button-icon-toggle extension adds a free-text Font Awesome Glyph control (iconGlyph) on core/button. On render, if iconType is fa, the plugin trims iconGlyph, optionally rewrites a \\fNNN unicode token, and otherwise concatenates the raw string into a <span>. A payload such as <img src=x onerror=alert(1)> does not match the unicode regex and is echoed into the rebuilt button markup on every frontend view. core/button is available to Contributor+. The value lives in the block-comment JSON (not in kses-visible HTML), so unfiltered_html is not required. Preview or publish executes the handler in the site origin.

    build/extensions/button-icon-toggle/block-functions.php:40-51

    Recommendation

    Treat iconGlyph as text: allow only a unicode codepoint / FA class name and output with esc_html(). Do not accept HTML in the glyph field.

  • high Stored XSS in content-modal frontend: selector interpolated into innerHTML and fetched markup scripts re-executed

    xss_stored

    content-in-modal-toggle lets Contributor+ set openInModal and a free-text modalContentSelector on core/post-title, post-featured-image, and read-more. PHP writes the selector to data-content-selector. On click, frontend.js fetch()es the href, querySelector(selector), assigns the fragment via innerHTML, then clones every <script> so it executes. Invalid selectors throw; the catch path sets innerHTML to a template string containing e.message (which includes the raw selector), so '"><img src=x onerror=alert(1)>' executes. The not-found path interpolates the selector the same way. innerHTML assignment also runs event handlers present in the fetched fragment. A visitor (or an admin previewing the post) only has to click the title/image link.

    build/extensions/content-in-modal-toggle/frontend.js:1

    Recommendation

    Never interpolate the selector or error text into innerHTML (use textContent). Do not re-create/execute <script> nodes from fetched HTML. Restrict modalContentSelector to a safe ident/class allowlist. Prefer inserting a same-origin fragment without script execution.

  • medium Contributor can force-delete arbitrary comments via Notes handlers that never check comment_type

    missing_capability

    Tools → Notes is registered with cap edit_posts (Contributor+), not moderate_comments. The admin_init handler accepts action=delete&note_id=N with nonce delete-note-N, then calls wp_delete_comment($note_id, true) with no get_comment() type check. A Contributor can mint that nonce themselves and permanently delete any comment ID (blog comments, other users' notes, WooCommerce order_note comments). Bulk delete via bulk-notes is the same. The AJAX inline-save path likewise updates _mello_note_* meta on any comment ID. WordPress Contributors cannot normally moderate comments; this is an IDOR / missing-object-type check on a state-changing admin GET.

    build/extensions/show-notes-in-dashboard/block-functions.php:398-456,503-515

    Recommendation

    Load the comment and require comment_type === 'note' (and optionally comment_post_ID the user can edit) before any update or delete. Use moderate_comments or edit_others_posts for destructive bulk actions. Prefer POST for deletes.

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.