Best Tech Stack for a WordPress Plugin as a Solo Developer
The best tech stack for building a WordPress plugin as a solo developer - frameworks, databases, hosting, and tools.
Best Tech Stack for a WordPress Plugin as a Solo Developer
WordPress powers over 40% of the web. Building a plugin for that ecosystem means access to hundreds of millions of websites and a marketplace where solo developers regularly pull in $10k-100k+/month. The challenge is navigating WordPress's aging architecture while maintaining modern development standards.
Here's the stack that lets you build a professional WordPress plugin without losing your mind.
Recommended Stack at a Glance
| Layer | Pick | Current Version (checked 2026-05-30) |
|---|---|---|
| Language | PHP 8.1+ (target 8.3 or 8.4) | PHP 8.5.6 latest stable |
| Admin UI | React via @wordpress/components | 34.0.0 |
| Build Tool | @wordpress/scripts (webpack under the hood) | 32.3.0 |
| Local Dev | wp-env or LocalWP | wp-env 11.7.0 / Local free |
| Database | WordPress $wpdb (MySQL/MariaDB) | ships with core |
| Dependency Mgmt | Composer | 2.10.0 |
| Licensing/Updates | Freemius or Lemon Squeezy | hosted services |
| Testing | PHPUnit + WordPress test suite | PHPUnit 13.1.13 |
| WordPress core | latest stable | 7.0 |
Backend: PHP 8.1+ (No Way Around It)
WordPress is PHP. Your plugin is PHP. There's no alternative here, but modern PHP is actually pleasant to work with. PHP 8.1+ gives you enums, fibers, readonly properties, named arguments, and match expressions. It's a far cry from the PHP 5 spaghetti that gave the language its reputation.
WordPress core still sets the minimum supported PHP version at 7.4, but the project's own compatibility handbook recommends PHP 8.3 or higher, and the latest stable PHP release is 8.5.6 (shipped May 7, 2026). Target 8.1 as your floor for the modern syntax, develop and test against 8.3 or 8.4, and you'll be comfortably inside the recommended band. WordPress 7.0, released in April 2026, dropped support for PHP 7.2 and 7.3, so there's no reason to write for anything older.
Structure your plugin using OOP principles from the start. Use namespaces, autoloading via Composer, and proper class organization. A clean plugin structure looks like this:
your-plugin/
src/
Admin/
API/
Models/
Services/
assets/
js/
css/
templates/
your-plugin.php
composer.json
package.json
Use Composer for PHP dependency management and autoloading. Even if you have zero dependencies, the PSR-4 autoloader alone is worth it. No more chains of require_once calls. Composer is at version 2.10.0 (released May 28, 2026) and has around 29,400 GitHub stars, so it's the unquestioned standard for PHP package management.
Frontend / Admin UI: React via @wordpress/scripts
WordPress has gone all-in on React for admin interfaces. The block editor (Gutenberg) is built with React, and the @wordpress/scripts package gives you a zero-config build setup that's pre-configured for WordPress development. The Gutenberg repository sits at around 11,700 GitHub stars, and @wordpress/scripts pulls roughly 126,700 npm downloads a week, so you're building on tooling that thousands of plugin teams lean on. The current release is @wordpress/scripts 32.3.0, paired with @wordpress/components 34.0.0.
For plugin settings pages and admin dashboards, React with @wordpress/components is the modern approach. You get UI components that match WordPress's design system, and the build tooling handles everything: JSX compilation, CSS processing, chunk splitting, and dependency extraction.
If your plugin is simple (just a settings page with a few toggles), you can skip React entirely and use the WordPress Settings API with basic HTML forms. But if you're building anything interactive, like a dashboard, visual editor, or data management interface, React is the right tool.
For the public-facing side of your plugin (what visitors see), keep it vanilla. No React on the frontend unless absolutely necessary. WordPress sites are performance-sensitive, and loading a React bundle on every page load will get your plugin uninstalled fast.
Database: WordPress $wpdb + Custom Tables
You're locked into MySQL/MariaDB since that's what WordPress uses. The question is whether to use WordPress's built-in tables or create custom ones.
Use WordPress options/meta tables when: You're storing settings, per-post metadata, or user preferences. The WordPress API handles caching, serialization, and sanitization for you.
Create custom tables when: You're storing structured data that will grow (logs, records, submissions, analytics). Custom tables with proper indexes perform dramatically better than stuffing everything into wp_postmeta.
Use the $wpdb class for custom table operations and always use $wpdb->prepare() for parameterized queries. WordPress's database abstraction isn't an ORM, but it gets the job done safely.
For migrations, create a version-tracking system in your activation hook. Store a db_version option and run migration functions on plugin update. The dbDelta() function handles table creation and modification.
Local Development: wp-env or LocalWP
wp-env is the official WordPress development environment. It uses Docker to spin up a WordPress instance with your plugin mounted. One command, npx @wordpress/env start, gets you running. Clean, reproducible, and what the WordPress core team uses. The package is at @wordpress/env 11.7.0 and draws around 55,900 npm downloads a week.
LocalWP is the friendlier alternative if you want a GUI. One-click WordPress sites with built-in SSL, email catching, and PHP version switching. Great for quick testing across different WordPress and PHP versions. WP Engine made the entire Local platform, including everything that used to be Local Pro, free for everyone, so there's no paid tier to worry about. You only pay if you later host the finished site somewhere.
Pick whichever you prefer. The important thing is not developing against a shared server or production environment.
Licensing and Updates: Freemius
If you're selling a premium version, Freemius is the standard for WordPress plugin licensing. It handles:
- License key generation and validation
- Automatic updates (even outside wordpress.org)
- In-dashboard checkout
- Subscription management
- Usage analytics
The alternative is building your own license server, which is a significant time sink for a solo developer. Freemius takes a revenue cut, but saves you weeks of development time and handles edge cases you haven't thought about. Under the pricing in effect in 2026, Freemius starts at 4.7% for makers, plus an additional 2.3% for the full dedicated WordPress solution, which lands the typical all-in rate at about 7%. Once monthly gross sales pass $50,000, Growth Pricing kicks in and the share drops as you scale, reaching as low as 0.5% on sales beyond $100,000 a month. Freemius does not apply its share to sales tax or VAT and does not charge payout fees. Check current pricing before you commit, since the tiers do shift.
If you prefer a simpler approach, Lemon Squeezy with a custom update checker works too, but you'll write more code. Lemon Squeezy acts as merchant of record and charges 5% plus $0.50 per transaction, which bundles payment processing, global tax compliance, fraud protection, and merchant-of-record handling into one fee. Extra percentages stack for international cards, PayPal, and subscription renewals, so model your real mix before assuming it's cheaper than Freemius.
Testing: PHPUnit + WordPress Test Suite
WordPress has an official test suite based on PHPUnit. It bootstraps a test WordPress installation, so you can test your plugin against real WordPress functions, hooks, and database operations. PHPUnit is the most-used PHP testing framework with about 20,000 GitHub stars, and the latest release is 13.1.13. WordPress core's own test harness still pins older PHPUnit versions, so match the version the WordPress test suite expects for your target rather than always grabbing the newest tag.
Set it up with wp scaffold plugin-tests your-plugin and you get a working test configuration. Write integration tests for your core functionality and unit tests for business logic that doesn't depend on WordPress.
Nice-to-Haves
- PHP_CodeSniffer with WordPress Coding Standards - Catches WordPress-specific issues
- WP-CLI - Command-line management for testing and automation (latest release v2.12.0, around 5,100 GitHub stars)
- Query Monitor plugin - Spot slow queries and hook issues during development
- GitHub Actions - Automate testing, SVN deployment to wordpress.org, and ZIP generation
Monthly Cost Breakdown
| Service | Cost (checked 2026-05-30) |
|---|---|
| WordPress.org listing | $0 (free) |
| LocalWP / wp-env | $0 |
| Composer / PHPUnit / WP-CLI | $0 (open source) |
| Freemius (if selling) | starts at 4.7%, around 7% all-in, drops with Growth Pricing past $50k/mo |
| Lemon Squeezy (alternative) | 5% + $0.50 per transaction (merchant of record) |
| GitHub (private repo) | $0 on the free tier |
| Total | $0/month + revenue share when you sell |
If you're distributing a free plugin through wordpress.org, your total cost is literally zero. For premium plugins, the licensing platform's revenue share only kicks in when you're making money. GitHub's free plan includes unlimited private repositories, so a solo developer does not need to pay anything to keep the code private. Rates above can move, so check current pricing on each vendor's page before you build a margin model around them.
Common Errors and Fixes
These are the snags that slow solo developers down most often when they wire up this exact stack.
npx @wordpress/env start fails or hangs. wp-env needs a running Docker engine. If the command stalls or throws a connection error, confirm Docker Desktop is open and healthy first. When a previous environment is in a bad state, npx @wordpress/env destroy followed by npx @wordpress/env start rebuilds it cleanly. A .wp-env.json at the project root lets you pin the WordPress and PHP versions you want to test against.
Build fails after upgrading @wordpress/scripts. Major version bumps of @wordpress/scripts (now at 32.3.0) periodically raise the minimum Node version and change webpack internals. If npm run build breaks right after an upgrade, check your Node version against the package's stated engines and delete node_modules plus the lockfile before reinstalling. Keep @wordpress/scripts and @wordpress/components on compatible major lines rather than mixing an old build tool with brand-new components.
Composer autoload class not found. A Class not found at runtime almost always means you added or renamed a class without regenerating the autoloader. Run composer dump-autoload after structural changes, and confirm your composer.json autoload.psr-4 namespace prefix matches the actual directory layout under src/.
$wpdb query returns nothing or throws a syntax error. WordPress does not name your custom tables for you. Always build the table name from $wpdb->prefix rather than hardcoding wp_, since real installs use custom prefixes. Pass every dynamic value through $wpdb->prepare() so the query is parameterized and safe.
dbDelta() silently skips your table changes. dbDelta() is picky about formatting. It expects two spaces between PRIMARY KEY and the column definition, each field on its own line, and lowercase column types. If a migration runs without error but the schema does not change, reformat the CREATE TABLE statement to match the rules in the WordPress Creating Tables with Plugins reference.
PHPUnit version mismatch with the WordPress test suite. Grabbing PHPUnit 13.1.13 when the WordPress test harness expects an older line produces confusing bootstrap failures. Install the PHPUnit version the test suite documents for your target WordPress and PHP combination rather than the latest tag, and run the suite inside the same environment your plugin will ship against.
Sources
- WordPress core PHP compatibility and version handbook, latest stable WordPress 7.0 and recommended PHP 8.3+: https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/ (checked 2026-05-30)
- WordPress core, dropping support for PHP 7.2 and 7.3 in 7.0: https://make.wordpress.org/core/2026/01/09/dropping-support-for-php-7-2-and-7-3/ (checked 2026-05-30)
- PHP.net releases, latest stable PHP 8.5.6: https://www.php.net/releases/index.php (checked 2026-05-30)
- Composer 2.10.0 release and ~29,400 stars, GitHub: https://github.com/composer/composer (checked 2026-05-30)
- Composer latest version, Packagist: https://packagist.org/packages/composer/composer (checked 2026-05-30)
- @wordpress/scripts 32.3.0, npm registry: https://registry.npmjs.org/@wordpress/scripts (checked 2026-05-30)
- @wordpress/scripts ~126,700 weekly downloads, npm API: https://api.npmjs.org/downloads/point/last-week/@wordpress/scripts (checked 2026-05-30)
- @wordpress/components 34.0.0, npm registry: https://registry.npmjs.org/@wordpress/components (checked 2026-05-30)
- @wordpress/env 11.7.0 and ~55,900 weekly downloads, npm: https://registry.npmjs.org/@wordpress/env and https://api.npmjs.org/downloads/point/last-week/@wordpress/env (checked 2026-05-30)
- Gutenberg ~11,700 stars, GitHub: https://github.com/WordPress/gutenberg (checked 2026-05-30)
- PHPUnit 13.1.13 and ~20,000 stars, GitHub and Packagist: https://github.com/sebastianbergmann/phpunit and https://packagist.org/packages/phpunit/phpunit (checked 2026-05-30)
- WP-CLI v2.12.0 and ~5,100 stars, GitHub: https://github.com/wp-cli/wp-cli (checked 2026-05-30)
- Local (LocalWP) free for everyone, WP Engine: https://wpengine.com/blog/wp-engine-supercharges-wordpress-development-local-pro-free-for-everyone/ and https://localwp.com/ (checked 2026-05-30)
- Freemius WordPress pricing, 4.7% base plus 2.3% for the WordPress solution and Growth Pricing: https://freemius.com/wordpress/pricing/ (checked 2026-05-30)
- Lemon Squeezy pricing, 5% + $0.50 per transaction merchant of record: https://www.lemonsqueezy.com/pricing and https://docs.lemonsqueezy.com/help/getting-started/fees (checked 2026-05-30)
- GitHub free plan, unlimited private repositories: https://github.com/pricing (checked 2026-05-30)
Conclusion
The optimal WordPress plugin stack for a solo developer: PHP 8.1+ with Composer for the backend, React via @wordpress/scripts for admin UI, WordPress's built-in database layer, and Freemius for licensing if you're selling premium.
WordPress plugin development isn't glamorous, but the business opportunity is massive. The ecosystem has billions of page views, an established marketplace, and users who are accustomed to paying for plugins. Focus on solving a real problem that existing plugins handle poorly, keep your codebase modern despite the legacy ecosystem, and let WordPress's market share do the distribution work.
Like this? You'll like what I'm building too.
Two ways to support and get more of this work.
HEARTH
A privacy-first Life OS for your desktop. Journal, tasks, and notes that stay on your machine. Coming soon, direct download from this site.
Read moreMY TOOLKITS
Receipts-first toolkits for shipping after hours, building Claude agents, publishing on Amazon, and more. The exact methods I used, not theory.
Browse on WhopRelated Articles
AI Wrapper Stack Guide for Solo Developers
Complete guide to the AI wrapper stack - when to use it, setup, pros/cons, and alternatives.
Best Tech Stack for Building an AI Wrapper as a Solo Developer
The ideal tech stack for solo developers building an AI wrapper in 2026.
Best Tech Stack for an Analytics Dashboard as a Solo Developer
The best tech stack for building an analytics dashboard as a solo developer - frameworks, databases, hosting, and tools.