WP Manifestindependent plugin directory
manifest / integrations / snapwp-helper

SnapWP - Helper WP Registry grade D+. High-severity findings · 2 findingsWP RegistryHigh-severity findings · 2 findingsOpen the reportD+

WordPress plugin used to power SnapWP's headless framework. https://github.com/rtCamp/snapwp

★ 7stars
116release downloads
≈10active sites
103composer installs
0.3.1latest · 8mo ago

Install

Download snapwp-helper.zip From the 0.3.1 release on GitHub, Feb 15, 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/rtcamp/snapwp-helper/releases/download/0.3.1/snapwp-helper.zip

On Packagist as rtcamp/snapwp-helper:

composer require rtcamp/snapwp-helper
Updates itself. It ships its own updater (Plugin Update Checker), so new versions appear under Dashboard → Updates.

A helper plugin for WordPress used to power SnapWP's solution for headless WordPress.

Overview

SnapWP Helper is a WordPress plugin that provides the necessary functionality to run SnapWP, extending the capabilities of WPGraphQL and WPGraphQL Content Blocks to power "turn-key" headless WordPress applications.

System Requirements

Quick Install

  1. Install and activate WPGraphQL and WPGraphQL Content Blocks.
  2. Download the latest SnapWP Helper release .zip file, upload it to your WordPress install, and activate the plugin.

With WP-CLI

wp plugin install https://github.com/rtCamp/snapwp-helper/releases/latest/download/snapwp-helper.zip --activate

With Composer

composer require rtcamp/snapwp-helper

Features

  • Block Theme support for WPGraphQL: SnapWP Helper provides the necessary functionality to power Block Themes in headless WordPress applications, allowing you to use WordPress's Block Editor as the full - or fallback - source of truth for your frontend.
  • Easy Onboarding: The SnapWP Helper admin screen makes setting up your local development environment a breeze, putting your entire .env configuration in a single, copyable location.
  • WPGraphQL Extension Updates: SnapWP Helper adds wp-admin update support for GitHub hosted WPGraphQL extensions recommended for the SnapWP stack, and makes it easy to add update checking for any additional extensions you use.
  • Enterprise-grade Codebase: SnapWP Helper is maintained by rtCamp, a leading WordPress agency with a focus on high-performance, enterprise-grade solutions. Even at version 0.0.1, this plugin is more stable than many plugins at 1.0.0, and is performant, extensible, thoroughly tested, and strictly follows the best practices of the headless WordPress ecosystem.

Usage

[!TIP] While this plugin can be used independently to provide Block Theme support for WPGraphQL, we recommend using it in conjunction with the SnapWP framework. For more information on setting up this plugin as part of SnapWP, please refer to the SnapWP documentation.

Development & Contribution

SnapWP Helper is a free and open-source project developed and maintained by rtCamp and can be used standalone in the headless WordPress ecosystem or as part of SnapWP's framework.

Contributions are welcome and encouraged!

To learn more about contributing to this package or SnapWP as a whole, please read the Contributing Guide.

For development guidelines, please refer to our Development Guide.

License

This library is released under "GPL 3.0 or later" License.

BTW, We're Hiring!

Join us at rtCamp, we specialize in providing high performance enterprise WordPress solutions

Releases

10 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
0.3.1 latest
Feb 15, 2026 8mo ago
snapwp-helper.zip +1 asset
75
snapwp-helper.zip14
schema.graphql61
Jun 20, 2025 1 year ago
snapwp-helper.zip +1 asset
71
snapwp-helper.zip25
schema.graphql46
May 15, 2025 1 year ago
snapwp-helper.zip +1 asset
13
snapwp-helper.zip4
schema.graphql9
Apr 24, 2025 1 year ago
snapwp-helper.zip +1 asset
9
snapwp-helper.zip3
schema.graphql6
Mar 31, 2025 1 year ago
snapwp-helper.zip +1 asset
40
snapwp-helper.zip9
schema.graphql31
Mar 10, 2025 1 year ago
snapwp-helper.zip +1 asset
41
snapwp-helper.zip11
schema.graphql30
Mar 1, 2025 1 year ago
snapwp-helper.zip +1 asset
20
snapwp-helper.zip9
schema.graphql11
Feb 19, 2025 1 year ago
snapwp-helper.zip +1 asset
49
snapwp-helper.zip12
schema.graphql37
Feb 18, 2025 1 year ago
snapwp-helper.zip +1 asset
12
snapwp-helper.zip3
schema.graphql9
Jan 30, 2025 1 year ago
snapwp-helper.zip +1 asset
89
snapwp-helper.zip26
schema.graphql63

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

D+ grade

Security

SnapWP - Helper 0.3.1 · audited by WP Registry

High-severity findings.

1 high 1 medium
Audited release
0.3.1
Findings
2
Worst severity
high
Content hash
942e718cd78ce74a7602f62a…

Findings

  • high Unauthenticated GraphQL editorBlocks discloses password-protected post content

    information_disclosure

    SchemaFilters::overload_content_blocks_resolver replaces WPGraphQL Content Blocks' editorBlocks field resolver on every GraphQL object type with this plugin's ContentBlocksResolver. That fork comments out the capability-gated $node->contentRaw path and instead does get_post($node->databaseId)->post_content with no post_password_required() check. WPGraphQL still returns password-protected published posts as public nodes (title visible, content/contentRaw null for guests). The overloaded editorBlocks field therefore returns parsed blocks, attributes, and renderedHtml of the gated body to anyone who can hit /graphql. The same leak exists on this plugin's public templateByUri field: TemplateResolver runs WP_Query (which loads published password-protected posts), then populate_post_content_inner_blocks() copies get_post()->post_content into core/post-content innerBlocks. Upstream WPGraphQL Content Blocks 4.8.6 patched this exact issue; this plugin requires only 4.6.0+ and overwrites that patched resolver, so even a fully updated dependency stays vulnerable. Observable: create a published post with a password and block content; as an unauthenticated client query post(id: <id>, idType: DATABASE_ID) { content editorBlocks { name renderedHtml } } or templateByUri(uri: "/<slug>/") { editorBlocks { name renderedHtml } }; content is null/password form, editorBlocks contains the secret blocks.

    src/Modules/GraphQL/Data/ContentBlocksResolver.php:39-51,225-245

    Recommendation

    Before reading post_content, return no blocks when post_password_required($post) is true (match WPGraphQL Content Blocks 4.8.6). Apply the same check in populate_post_content_inner_blocks(). Prefer resolving through the WPGraphQL Post model so restricted fields stay restricted, or stop overloading editorBlocks so the dependency's patched resolver runs.

  • medium Reusable-block hydration loads arbitrary post IDs without type, status, or password checks

    information_disclosure

    ContentBlocksResolver::populate_reusable_blocks() loads get_post($block['attrs']['ref']) for every core/block and merges that post's parsed blocks into editorBlocks. Unlike WordPress core render_block_core_block(), it does not require post_type wp_block, post_status publish, an empty post_password, or any capability. Because SchemaFilters overloads editorBlocks globally, this runs for unauthenticated GraphQL queries. Two concrete paths: (1) a published post that already references a reusable block continues to expose that ref's latest post_content after the wp_block is drafted, made private, or password-protected — the frontend would render nothing; GraphQL still returns the body. (2) an Author (below manage_options) can publish <!-- wp:block {"ref": <any database id>} --> via the REST posts endpoint and then query editorBlocks on their own post to read draft/private/password-protected content of any post type. Subscriber cannot plant the block, but path (1) needs no extra privilege.

    src/Modules/GraphQL/Data/ContentBlocksResolver.php:247-272

    Recommendation

    Mirror render_block_core_block(): only expand refs where post_type is wp_block, post_status is publish, post_password is empty, and the current user can read the post. Otherwise return the original block unchanged.

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.