MySQL’s utf8 encodes at most three bytes per character. Real UTF-8 needs four for anything above the basic plane, which is where emoji and a good deal of…
CSV is not a format you should parse with explode() — quoted fields containing the delimiter, and escaped quotes inside those, break it immediately. fgetcsv() handles all of…
Running a REPLACE() over the database to change a domain looks like it works, until a widget disappears or a theme setting resets. PHP serialised strings encode their…
Two hundred and forty require_once calls where load order was load-bearing, moved onto an autoloader one namespace at a time without a big-bang rewrite.
Three installs, three plugin sets, one person patching them — a security release forgotten on the third site for six weeks. The import order, and what a shared…
ALTER TABLE on 30 million rows blocks writes for 40 minutes, and checkout writes to that table. A shadow table, triggers, and a backfill paced by replication lag.
Until 2.2, an order’s status was a term in a shop_order_status taxonomy. From 2.2 it is a custom post status with a wc- prefix, and the upgrade routine…
5.3 stops getting security fixes in August. Deprecations first, then the behaviour changes, then the version bump — and an APC replacement that ignores every setting you tuned.