WP Manifestindependent plugin directory
manifest / developer / wp-powerhouse

Powerhouse WP Registry grade D+. High-severity findings · 4 findingsWP RegistryHigh-severity findings · 4 findingsOpen the reportD+ #6 in Developer Tools

方便開發 WordPress 外掛的工具包。

★ 5stars
19krelease downloads
≈400active sites
v3.5.5latest · 1mo ago

Install

Download powerhouse.zip From the v3.5.5 release on GitHub, Sep 10, 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/zenbuapps/wp-powerhouse/releases/download/v3.5.5/powerhouse.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Library as Plugin — The CORE foundation plugin that all power-* plugins depend on.

Version: 3.3.46 | PHP: 8.1+ | WordPress: 5.7+ | License: GPL-2.0

██████╗  ██████╗ ██╗    ██╗███████╗██████╗ ██╗  ██╗ ██████╗ ██╗   ██╗███████╗███████╗
██╔══██╗██╔═══██╗██║    ██║██╔════╝██╔══██╗██║  ██║██╔═══██╗██║   ██║██╔════╝██╔════╝
██████╔╝██║   ██║██║ █╗ ██║█████╗  ██████╔╝███████║██║   ██║██║   ██║███████╗█████╗
██╔═══╝ ██║   ██║██║███╗██║██╔══╝  ██╔══██╗██╔══██║██║   ██║██║   ██║╚════██║██╔══╝
██║     ╚██████╔╝╚███╔███╔╝███████╗██║  ██║██║  ██║╚██████╔╝╚██████╔╝███████║███████╗
╚═╝      ╚═════╝  ╚══╝╚══╝ ╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝  ╚═════╝ ╚══════╝╚══════╝
                          www.powerhouse.cloud

What is Powerhouse?

Powerhouse is a developer-focused WordPress plugin that acts as a shared library for the entire power-* plugin ecosystem. It provides:

  • 📦 Shared utilities via j7-dev/wp-utils — SingletonTrait, ApiBase, DTO, and more
  • 🔌 Generic REST API under /wp-json/v2/powerhouse for every WordPress resource (posts, users, options, terms, products, orders, etc.)
  • 🔑 License Code (LC) management — validates plugin licenses against cloud.luke.cafe
  • 🗄️ Custom DB table (ph_access_itemmeta) for per-user access/limit tracking
  • 🎨 Theme system — daisyUI + Tailwind CSS injected via <html data-theme="...">
  • 🤖 Captcha protection for WP login and registration forms
  • ⚡ API Booster mu-plugin — selective plugin loading per REST route for faster APIs
  • 🛡️ Email validator — MX record validation via mu-plugin
  • 🐛 Debug log viewer — accessible from WP Admin → Tools → Debug Log
  • ⏳ WooCommerce enhancements — delayed emails, optional last name, order customizations
  • 🖥️ React/TypeScript admin SPA — built with Refine.dev + Ant Design 5

Requirements

Requirement Version
PHP 8.1+
WordPress 5.7+
WooCommerce Optional (unlocks additional features)
Node.js 18+ (for development)
pnpm 8+ (for development)

Installation

As a WordPress Plugin

  1. Download the plugin ZIP from the releases page
  2. Upload to wp-content/plugins/powerhouse/
  3. Activate via WordPress Admin → Plugins

Development Setup

# Install dependencies
pnpm install

# Install PHP dependencies
composer install

# Start Vite dev server (port 5179)
pnpm dev

# Build production assets
pnpm build

# Build CSS only (faster)
pnpm build-css:admin
pnpm build-css:front

Plugin Architecture

powerhouse/
├── plugin.php              ← Entry point (Plugin class with PluginTrait + SingletonTrait)
├── inc/
│   ├── classes/            ← PHP source (PSR-4: J7\Powerhouse\ → here)
│   │   ├── Bootstrap.php   ← Module orchestrator
│   │   ├── Admin/          ← Admin UI modules (Debug, DelayEmail, Entry, etc.)
│   │   ├── Api/            ← Cloud API HTTP client
│   │   ├── Captcha/        ← Login/register captcha
│   │   ├── Compatibility/  ← MU-plugin management, AutoUpdate, Scheduler
│   │   ├── Domains/        ← REST API domain modules (Post, User, LC, Limit, etc.)
│   │   ├── Settings/       ← Settings DTO (powerhouse_settings option)
│   │   ├── Theme/          ← daisyUI theme system
│   │   └── Utils/          ← Static utility helpers
│   └── templates/          ← PHP templates (admin-layout, components)
└── js/
    ├── src/                ← React/TypeScript SPA
    │   ├── main.tsx        ← Vite entry, mounts to #powerhouse_settings
    │   ├── App1.tsx        ← Refine.dev app with HashRouter
    │   └── pages/admin/    ← Settings + LicenseCode pages
    └── dist/               ← Built assets (committed)

REST API

All endpoints are under /wp-json/v2/powerhouse/.

Core Endpoints (always available)

Endpoint Methods Description
posts / posts/{id} GET, POST, DELETE Generic post CRUD
users / users/{id} GET, POST, DELETE User management
options / options/{key} GET, POST, DELETE WordPress options
terms / terms/{id} GET, POST, DELETE Taxonomy terms
comments / comments/{id} GET, POST, DELETE Comments
shortcodes POST Execute a shortcode
upload POST Upload file to media library
plugins GET List all plugins
lc GET License code statuses
lc/activate POST Activate a license code
lc/deactivate POST Deactivate a license code
lc/invalidate POST Clear LC cache

WooCommerce Endpoints (require WooCommerce)

Endpoint Description
products / products/{id} WC product CRUD
product-attributes WC product attributes
orders / orders/{id} WC order management
copy Duplicate posts/products
limit Access limit management
revenue Revenue reports
subscriptions WC Subscriptions support

WordPress Hooks

Filters

Filter Signature Purpose
powerhouse_product_infos (array $infos): array Register plugins for LC management

Example — registering a product:

add_filter('powerhouse_product_infos', function(array $infos): array {
    $infos['my-plugin'] = [
        'name' => 'My Plugin',
        'link' => 'https://example.com',
    ];
    return $infos;
});

Actions (Action Scheduler)

Action Description
powerhouse_delay_email Delayed WC email delivery
powerhouse_auto_update Trigger Powerhouse auto-update
powerhouse_compatibility_action_scheduler One-time-per-version tasks

Child Plugin Integration

Child plugins (power-course, power-shop, etc.) use Powerhouse as their foundation:

// Check license activation
$is_active = \J7\Powerhouse\Domains\LC\Utils\Base::ia('my-plugin');

// Use shared admin layout (creates the <div> for the React SPA)
\J7\Powerhouse\Utils\Base::render_admin_layout([
    'title' => 'My Plugin Admin',
    'id'    => 'my_plugin_app',
]);

// Use shared utilities
use J7\WpUtils\Classes\WP;
use J7\WpUtils\Classes\General;

// Batch processing with memory management
\J7\Powerhouse\Utils\Base::batch_process($items, fn($item) => process($item));

Database

Custom Table: {prefix}ph_access_itemmeta

Created on plugin activation. Stores per-user access metadata for content limiting.

meta_id    BIGINT       PK AUTO_INCREMENT
post_id    BIGINT       Content item ID
user_id    BIGINT       WordPress user ID
meta_key   VARCHAR(255) Metadata key
meta_value LONGTEXT     Metadata value

WordPress Options

Option Description
powerhouse_settings All plugin settings
powerhouse_license_codes Saved license codes per product
powerhouse_compatibility_action_scheduled Last version that ran compatibility checks

Development

PHP Code Quality

# Code style check (PHPCS with WordPress standards)
composer lint

# Static analysis (PHPStan level 9)
composer analyse
# With extended memory:
vendor/bin/phpstan analyse inc --memory-limit=6G

Frontend Development

# Development server with HMR (port 5179)
pnpm dev

# Production build (assets go to js/dist/)
pnpm build

# Build admin Tailwind CSS only
pnpm build-css:admin

# Watch admin CSS
pnpm watch-css:admin

# Lint TypeScript
pnpm lint

# Format TypeScript
pnpm format

Release

pnpm release:patch   # Bump patch version, build, tag
pnpm release:minor   # Bump minor version
pnpm release:major   # Bump major version
pnpm zip             # Create distribution ZIP
pnpm create:release  # Push GitHub release

Tech Stack

PHP / Backend

  • PHP 8.1+ with strict types throughout
  • WordPress 5.7+ hooks, REST API, Options API
  • WooCommerce (optional) for order/product/subscription features
  • Composer packages:
    • j7-dev/wp-utils — shared trait & class library
    • kucrut/vite-for-wp — Vite asset manifest integration
    • brainfoolong/js-aes-php — AES encryption for LC transients
    • gregwar/captcha — CAPTCHA image generation
    • symfony/finder — file system utilities

JavaScript / Frontend

  • React 18 + TypeScript
  • Vite — build tool
  • Refine.dev — admin CRUD framework
  • Ant Design 5 — UI components
  • antd-toolkit — shared library
  • React Query — server state management
  • Tailwind CSS + daisyUI — styling (scoped to #tw)
  • HashRouter — client-side routing without server config

Documentation


License

GPL v2 or later — see LICENSE

Author: JerryLiu (@j7-dev)
Website: www.powerhouse.cloud

Releases

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

Tag
Published
Assets
Downloads
v3.5.5 latest
Sep 10, 2026 1mo ago
powerhouse.zip
575
Jul 22, 2026 3mo ago
powerhouse.zip
601
Jul 15, 2026 3mo ago
powerhouse.zip
399
Jun 28, 2026 3mo ago
powerhouse.zip
424
Jun 25, 2026 4mo ago
powerhouse.zip
272
Jun 23, 2026 4mo ago
powerhouse.zip
387
Jun 11, 2026 4mo ago
powerhouse.zip
382
May 28, 2026 4mo ago
powerhouse.zip
431
May 7, 2026 5mo ago
powerhouse.zip
661
Apr 21, 2026 6mo ago
powerhouse.zip
560
Apr 20, 2026 6mo ago
powerhouse.zip
382
Apr 18, 2026 6mo ago
powerhouse.zip
440
Apr 9, 2026 6mo ago
powerhouse.zip
563
Apr 7, 2026 6mo ago
powerhouse.zip
349
Feb 23, 2026 8mo ago
powerhouse.zip
756
Jan 13, 2026 9mo ago
powerhouse.zip
561
Dec 9, 2025 10mo ago
powerhouse.zip
533
Nov 27, 2025 11mo ago
powerhouse.zip
501
Nov 27, 2025 11mo ago
powerhouse.zip
35
Nov 12, 2025 11mo ago
powerhouse.zip
482
Oct 30, 2025 11mo ago
powerhouse.zip
444
Sep 9, 2025 1 year ago
powerhouse.zip
525
Aug 18, 2025 1 year ago
powerhouse.zip
340
Aug 8, 2025 1 year ago
powerhouse.zip
401
Aug 8, 2025 1 year ago
powerhouse.zip
7
All releases on GitHub →

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

D+ grade

Security

Powerhouse 3.5.5 · audited by WP Registry

High-severity findings.

4 high
Audited release
3.5.5
Findings
4
Worst severity
high
Content hash
2deb164905bc34aa5e0b49f9…

Findings

  • high Shop Manager can create and promote administrators via the generic users REST API

    missing_capability

    Every Powerhouse REST route inherits ApiBase::permission_callback, which returns true for manage_options OR manage_woocommerce. WooCommerce Shop Manager has the latter and not the former, so they pass. POST /wp-json/v2/powerhouse/users and POST /users/{id} feed the body through WP::separator(..., 'user'), whose data_fields include 'role' and 'user_pass', then call wp_insert_user / wp_update_user with no promote_users, create_users, or get_editable_roles check. Observable: a Shop Manager (cookie + X-WP-Nonce from any wp-admin screen they can open, or an application password) POSTs role=administrator and becomes, or creates, a full administrator. The same gate also exposes DELETE /users, POST /users/resetpassword (retrieve_password for arbitrary ids), GET /users?meta_keys[]= (arbitrary usermeta), POST /upload, GET /shortcode?shortcode= (do_shortcode), GET /lc (license codes), GET /plugins, and full post/term/product/order CRUD for any post type — far beyond Shop Manager's native caps. The Powerhouse admin SPA itself is manage_options-only, so this is not 'the UI the shop manager is supposed to use'; it is a hidden REST privilege-escalation surface.

    inc/classes/Domains/User/Core/V2Api.php:34-75,196-266,277-308

    Recommendation

    Default the REST permission_callback to manage_options only (matching the admin menu). For WooCommerce resources, require the matching WooCommerce cap (manage_woocommerce / edit_shop_orders / edit_products) per route, not globally. On user create/update, reject role changes unless current_user_can('promote_users') and the target role is in get_editable_roles(). Never pass an attacker-supplied role into wp_insert_user/wp_update_user.

  • high Shop Manager can inject stored XSS/skimmer CSS via powerhouse_settings echoed on every frontend page

    xss_stored

    POST /wp-json/v2/powerhouse/options (same manage_woocommerce gate) calls Settings::partial_update() and writes any Settings property, including theme and theme_css, to option powerhouse_settings. Theme::print_css() then echoes those values unsanitized inside a <style> block on wp_head (priority -100, every public page including WooCommerce checkout/cart/my-account). FrontEnd::add_html_attr() interpolates theme into the <html data-theme="..."> attribute with no esc_attr. A Shop Manager can set theme to x"></html><script>…</script> or theme_css values to </style><script>…</script><style> and execute JavaScript in every visitor and administrator browser that loads the storefront — a checkout skimmer vector. GET /options also returns bunny_stream_api_key in plaintext to the same role.

    inc/classes/Theme/Model/Theme.php:241-252

    Recommendation

    Restrict options POST to manage_options. Allowlist theme names against the known daisyUI set. Escape theme for HTML attributes (esc_attr) and CSS values (e.g. only permit oklch/hex/length tokens). Do not echo arbitrary theme_css strings into <style>. Do not return bunny_stream_api_key to roles that cannot manage_options.

  • high Unauthenticated REST endpoint deletes stored license codes and disables power-* plugins

    missing_auth

    POST /wp-json/v2/powerhouse/lc/invalidate (and the deprecated POST /wp-json/powerhouse/lc/invalidate) is registered with permission_callback __return_true. The handler reads product_slug from JSON and calls Base::delete_lc_transient(), which unsets that slug in option powerhouse_license_codes and delete_transient('lc_{slug}'). No nonce, capability, or authentication. PluginTrait::check_required_plugins only invokes each power-* plugin's bootstrap when LC::ia($kebab) is true (transient post_status === 'activated'); after invalidate, ia() is false and those plugins fail closed. Observable: curl -X POST -H 'Content-Type: application/json' -d '{"product_slug":"power-shop"}' /wp-json/v2/powerhouse/lc/invalidate from an unauthenticated visitor (or a CSRF from a logged-in browser) drops that product's license until an administrator re-activates. The handler also writes the attacker-supplied slug into WooCommerce logs (leftover debug).

    inc/classes/Domains/LC/Core/V2Api.php:44-48,143-171

    Recommendation

    Require manage_options (or a signed webhook secret from the license server) on lc/invalidate. If the license server must push invalidations, authenticate with HMAC over the body rather than __return_true. Do not delete the saved code option on a cache-bust; only delete the transient. Remove the leftover WC::log debug line.

  • high Hardcoded WordPress application passwords for the production license server

    hardcoded_credentials

    Api\Base::init() embeds live Basic-Auth credentials for the power-partner-server REST API, selected by wp_get_environment_type(): production user powerpartner / application password uJsk Gu3S pwUG r6ia P9zy Xjrj against https://cloud.luke.cafe, plus distinct staging and local (including IS_HOME) passwords. Those values are compiled into every distributed copy of the plugin (public GitHub repo zenbuapps/wp-powerhouse). The same class uses them on every license activate/deactivate call. Anyone who reads the plugin can impersonate the powerpartner application-password user on the vendor license API (activate/deactivate codes, and any other routes that user can hit). This does not by itself authenticate to the local WordPress site, but it compromises the license authority every site trusts.

    inc/classes/Api/Base.php:51-88

    Recommendation

    Rotate and revoke every leaked application password on cloud.luke.cafe, cloud-staging.wpsite.pro, and local. Stop shipping shared credentials in the plugin. Authenticate license calls with a per-site secret (the license code itself HMAC'd, or a site-specific API key issued at activation) stored only in the site's options, not in source.

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.