Writing

Thoughts on WordPress, web development, and the tools I use.

Code Snippets

Add a custom dropdown to the WooCommerce block checkout

Classic checkout field snippets silently do nothing on the block checkout. WooCommerce ships a supported API that replaces them with a third of the code, and this post has a working dropdown built on it.

August 30, 2026 · 5 min read
Code Snippets

Hide the confirm your email address notice in WooCommerce

WooCommerce 11.0 added a confirm your email address notice to the My Account page, and no setting turns it off. Here's why the email toggle doesn't remove it, and a small snippet that does.

August 26, 2026 · 4 min read
Code Snippets

Show a price range on WooCommerce external products

The WooCommerce price field only takes a single number, and external products can't have variations. This three-hook snippet adds a display-only price range field that shows on the product page.

July 30, 2026 · 5 min read
WordPress

Why WooCommerce shows three different refund rates

A merchant found three different refund rates for one subscription product. Tracing WooCommerce core shows why each report disagrees and what to track instead.

July 6, 2026 · 6 min read
Development

Why Cursor couldn't launch my fnm-managed MCP server

An MCP server kept dying on launch in Cursor with an ENOENT error pointing inside the app bundle. The real cause was fnm, a missing PATH, and a Node shebang. Here's the full trace and every fix.

June 10, 2026 · 8 min read
Notes

Why your plugin name isn't accepted on WordPress.org

If WordPress.org asked you to rename your plugin, it almost always comes down to one idea: plugin names need to be distinctive and brandable, not descriptions of what the plugin does. Here's what I picked up from the guidelines and my own submissions, and how to choose a name that clears the naming check on the first try.

April 23, 2026 · 13 min read
Notes

What three WordPress.org courses taught me about working with people

Three Learn.WordPress.org courses on decision-making, writing, and conflict resolution. Most of the guidance applies to any collaborative work, not only WordPress.

April 22, 2026 · 11 min read
Code Snippets

Why WooCommerce EPUB downloads fail with an invalid download link

WooCommerce digital downloads can silently fail for file types like EPUB that aren't in WordPress's default MIME list. Admin can download, customers can't. Here's what actually happens in the code and how to fix it.

April 17, 2026 · 7 min read
WordPress

Why I built HappyAccess, a free WordPress plugin for temporary admin access

HappyAccess is a free WordPress plugin that replaces password sharing with OTP-based temporary admin access. Built for support engineers, agencies, and developers who need secure, auditable, GDPR-compliant access to client sites.

April 5, 2026 · 3 min read
Code Snippets

WooCommerce Order Emails Reply to the Wrong Person

WooCommerce sets the Reply-To on admin order emails to the customer. Here is how to change it so replies go to your team instead.

February 26, 2026 · 4 min read