You’ve built, packaged, and tested a block plugin. Last step: getting it to real users. This tutorial walks the wordpress.org submission process — the most common distribution path — plus the alternatives if wp.org doesn’t fit.
Three distribution paths
| Path | Reach | Friction | Best for |
|---|---|---|---|
| wordpress.org plugin directory | 60M+ active installs across all plugins | Slow review (1-6 weeks), strict policies | Open-source plugins, broad reach |
| Direct distribution (your own site) | Whoever finds your site | None — your rules | Premium plugins, niche audiences |
| Block directory (subset of wp.org) | Users browsing blocks from the editor inserter | Same as plugin directory + stricter (single block, no menu items, etc.) | Pure-block plugins |
We focus on wp.org because the inertia is real — many WP users only install plugins from the directory.
Step 1 — readme.txt
The plugin directory parses your readme.txt to build the listing page. The format is custom (not Markdown) — WordPress’s own spec:
=== My First Block ===
Contributors: maheshwaghmare
Tags: block, gutenberg, callout, notes
Requires at least: 6.4
Tested up to: 6.5
Stable tag: 1.0.0
Requires PHP: 7.4
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
A styled callout block for posts and pages.
== Description ==
A polished Gutenberg block for adding callouts to your content. Supports four
types (info, tip, warning, error), inline rich text, nested blocks, and
multiple visual styles.
**Features**
* Four callout types with semantic color coding
* Editable title and body via RichText
* Nested blocks support — drop in lists, images, code
* Four visual styles: Boxed, Plain, Filled, Outlined
* Three preset variations: Tip, Warning, Error
* Accessibility-tested with screen readers
== Installation ==
1. Upload the plugin folder to wp-content/plugins/
2. Activate from the Plugins screen
3. The Callout block appears in the inserter under "Text"
== Frequently Asked Questions ==
= Does this work with full-site editing? =
Yes. The block is registered with `apiVersion: 3` and supports FSE templates.
= Can I extend it with custom styles? =
Yes — use `registerBlockStyle()` from your theme or another plugin to add styles.
== Changelog ==
= 1.0.0 =
* Initial release.
== Screenshots ==
1. The Callout block in the editor
2. Inspector controls for type and dismissibility
3. Front-end rendering of all four callout types
4. Block variations in the inserter
The headers (lines starting with =) become navigation tabs on the plugin page. Three sections matter most:
- Description — the elevator pitch. First 100 words shown in search results.
- Screenshots — referenced by number; actual files in
/assets/(covered below) - Changelog — every release documented. Plugin reviewers check this.
Step 2 — Screenshots and banner
The plugin directory pulls visual assets from an /assets/ directory in your wp.org SVN repo (NOT inside the plugin zip):
Banner and icon are critical — they’re the first thing users see in the directory. Spend the time making them clean.
Step 3 — Submit for review
- Sign up at wordpress.org if you don’t have an account
- Visit Submit a plugin
- Upload your plugin ZIP (build it first via
npm run plugin-zip—@wordpress/scriptsbundles it correctly) - Wait for the email response
The review process:
- Initial automated check — basic linting, file structure, license validation. Takes minutes.
- Human review — a member of the Plugin Review Team manually audits your code. Takes 1-6 weeks (it’s variable; reviewers are volunteers).
- Approval or revision requests — they’ll email you with either an approval link or a list of issues to fix.
Common revision requests:
| Issue | Fix |
|---|---|
| Missing license header | Add GPL-2.0+ to your main plugin file |
wp_unslash() not called on $_POST | Sanitize input properly: sanitize_text_field(wp_unslash($_POST['x'])) |
Direct $wpdb->query() with interpolation | Use $wpdb->prepare() |
| External script load | Bundle locally or document why it’s external |
eval() or extract() | Don’t use them — replace |
| Trademark conflict in name | Rename — “WooCommerce Plus”, “Yoast SEO Pro” are all rejected |
Step 4 — Post-approval: SVN
wp.org uses SVN, not git, for plugin hosting. You’ll get an SVN URL like:
https://plugins.svn.wordpress.org/my-first-block/
The structure:
my-first-block/
├── trunk/ ← current development version
├── tags/ ← released versions (tags/1.0.0/, tags/1.1.0/, etc.)
├── branches/ ← optional, rarely used
└── assets/ ← screenshots, banner, icon
Releasing a new version:
Most plugin authors write a release script to automate this. Several open-source examples exist on GitHub — search “wp-plugin-svn-release”.
Step 5 — Submit to the Block Directory (optional)
The Block Directory is a wp.org subset that surfaces blocks from inside the editor’s inserter — users can install your block without leaving wp-admin. To qualify:
- Plugin is a single block (not bundled with other plugins/features)
- No admin menu items, settings pages, or shortcodes
- No external service dependencies (or clearly documented)
- All files under 1MB
- Tested with the latest WordPress
If your plugin fits, the wp.org review team auto-considers it for Block Directory inclusion. You don’t apply separately.
Add Plugins
My First Block
A styled callout block for posts and pages.
Maintenance after launch
Plugins on wp.org are expected to:
- Update the “Tested up to” header for each new WP release (within ~3 months)
- Respond to forum support questions (wordpress.org/support/plugin/my-first-block)
- Fix security issues promptly (the security team will contact you)
- Use the “Stable tag” field in readme.txt to point at the current release
Plugins that go untouched for 2+ years across multiple WordPress releases may be closed. Plan for at least a yearly “Tested up to” bump.
Wrapping up the series
You’ve gone end-to-end:
- Part 1 — Block model + architecture
- Part 2 — Dev environment + scaffold
- Part 3 — First custom block
- Part 4 — Attributes + serialization
- Part 5 — Inspector controls
- Part 6 — InnerBlocks + composition
- Part 7 — Styles + variations
- Part 8 — Block patterns
- Part 9 — Extending the editor with filters
- Part 10 — Plugin packaging
- Part 11 — Testing + debugging
- Part 12 — Publishing (you are here)
The output: a polished, distributable Gutenberg block plugin available to 60M+ WordPress sites worldwide.
Thanks for following along. If this series helped, sharing it with another WordPress developer is the best support you can give.
Get the next one in your inbox. Practical tips, no fluff.
More tutorials
View all-
Block Patterns
Register reusable block compositions — landing-page hero, feature grid, FAQ section — that users insert as a complete unit.
25 min
-
Block Attributes and Serialization
Master the attribute system — types, sources, defaults, and how block data round-trips between the editor, the database, and the front-end.
30 min
-
Building a Block Plugin
Package your block as a proper WordPress plugin — file structure, asset enqueueing, server-side render callbacks, plugin metadata.
35 min