Writing
Thoughts on WordPress, web development, and the tools I use.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.