Skip to content

WordPress

I have worked with WordPress since 2005 and have been registered on wordpress.org since 2006. Since then I have watched it change several times, classic themes, frameworks, page builders, blocks, and I have followed it at every stage, always with the same approach, understanding how it works underneath and not only how it is used. It is the platform I build everything on, from client sites to my projects, and one I give back to with plugins and contributions. I work with direct clients and as a WordPress developer for web agencies that need a technical person.

PHP code of a WordPress theme on a monitor, with the calls to wp_head and body_class

Custom development

My preferred way to build a site today is a block theme with a custom child theme, made of dedicated blocks and patterns for recurring sections, customisations through theme.json, and the native Gutenberg editor with no page builder. It is the setup I use for my own sites, this one included, because it produces pages that are light, maintainable and free of lock-in. For themes built from scratch I worked for a long time with frameworks such as Genesis and with Bootstrap on the front end.

Working to measure does not mean working only from scratch. A good part of the sites in production are built on the most widespread commercial themes and page builders, and I know how to work on those foundations while respecting their logic, with child themes, hooks and filters instead of changes to the theme code, and integrations that survive updates.

When WordPress alone is not enough, I write dedicated plugins. Sometimes they are mu-plugins, small and precise, like sentries that detect an altered configuration, correct it and send an email; granular control of automatic updates; features exposed to specific roles without granting administrator privileges. It is also the first level of application hardening for a site, of security at server level and of incident response (see DevOps).

I often work on multilingual sites, across translations, string caching and duplicated configurations per language and currency, and all the edge cases that only appear when there are more than two languages in production. For the same reason the plugins I build are ready for multilingual use from the start.

The plugins Astro Booking Engine, Astro Hide Unpublished Post Types From Menu and Astro Sticky Buttons in the WordPress directory, by Alian Schiavoncini

WooCommerce

A large part of my development work revolves around WooCommerce, on shops in production with real volumes, from the catalogue to shipping, from tax to payment methods. I know the parts that are seen less but decide whether a shop works, subscriptions and renewal handling, HPOS and how it differs from the classic order model, Action Scheduler and the queues of scheduled actions.

On the payments side I work with the main gateways, from checking the integration to diagnosing declined payments. And when the shop has to talk to the outside world, I build the integrations, from synchronising with marketplaces to sending orders and documents to an ERP, through to importing price lists.

Working on a live e-commerce site requires method. Staging, backup, deploy, verification, and a clear criterion for telling what can be done with the site open from what cannot.

WooCommerce and the Stripe and PayPal payment extensions in the WordPress plugin directory

Debugging and maintenance

The skill I use most often is not writing new code, it is understanding why existing code behaves in a certain way. The most interesting faults are the ones that leave no trace in the logs, a blank page with no errors, a save that does not save. For these I have a structured method, isolating the loading phase responsible, tracing the hooks, telling a fatal error from an explicit stop, excluding single plugins conditionally with no impact on visitors.

PHP code on a monitor, a function with a declared return type

WP-CLI is the central tool of this work, for managing plugins, themes, users, cron and the database from the command line, including the cases where plugin loading has to be skipped to get around the very component that breaks execution.

A chapter of its own is compatibility with new PHP versions, because many dated plugins break on removed constructs or on subtle traps, such as the change in the rules for comparing strings and numbers, which flips the behaviour of version checks. Finding the exact point, fixing it and moving the site to the new version without interruptions is work I have done many times.