Capabilities vs Roles: Get It Right
Check capabilities, never roles. current_user_can('manage_options') survives custom roles; current_user_can('administrator') breaks the first time someone adds a new admin-equivale…
Read article →Available for work
Interested in working together? Let's talk.
Check capabilities, never roles. current_user_can('manage_options') survives custom roles; current_user_can('administrator') breaks the first time someone adds a new admin-equivale…
Read article →Multisite makes sense when sites share users, themes, plugins, and a billing relationship — a university with department sites, an agency hosting clients with shared…
Read article →Every apply_filters() call has overhead — even with no hooked callbacks. On a hot path running thousands of times per request, that adds up.For inner-loop…
Read article →The Block Hooks API (WP 6.4+) lets a block declare it should auto-insert relative to another block. blockHooks in block.json maps target block names to…
Read article →When postmeta queries dominate your slow log, it is time for a custom table. dbDelta() with a CREATE TABLE statement on activation, then $wpdb queries…
Read article →An empty state is a first impression for a feature. 'No data' is a missed opportunity — explain what the feature does, why it is…
Read article →Validate on blur, not on every keystroke. A user typing their email should not see 'invalid email' before they finish the @.Show errors inline, anchored…
Read article →Devtools device emulation does not reproduce slow CPUs, OS keyboards, or 3G networks. Test on a 2018 mid-range Android occasionally — the experience differs sharply…
Read article →Tooltips are invisible by default. Users do not hover icons looking for hidden help — they tap and hope.If the label is essential, put it…
Read article →The first default beats the user's first decision. The longer it persists, the more users you affect — and the more you should sweat the…
Read article →