Project
Custom WordPress admin dashboard
Before the current custom CMS, this site’s operational brain lived inside WordPress: a curated admin layer on top of core wp-admin - custom landing pages, shortcuts, and role-aware surfaces that matched how I actually worked. It was a deliberate middle ground between stock WordPress and a full rewrite.
What it was
Stock wp-admin is powerful but generic. For day-to-day maintenance - content health, quick jumps to theme hooks, plugin hygiene, and internal utilities - I wanted a single dashboard that reflected my stack, not every possible WordPress install. The custom admin project wrapped that intent: still WordPress under the hood, but the first screen you saw was mine.
The implementation stayed within supported extension points: admin menus, top-level and submenu pages, enqueued styles and scripts only where needed, and capability checks so clients or collaborators never saw tools they should not touch. Nothing relied on editing core files or fragile rewrites of wp-admin markup.
Screenshots on this page load from img/projects/wordpress/custom_admin_dashboard/ - the same images fill the gallery below. Drop PNG or WebP files there to refresh the story without touching PHP.
Features and UX
The dashboard prioritised at-a-glance signals: what needs attention, where to click next, and links to the custom plugins (like the task manager) that extended the same installation. Widget-style blocks and clear typography reduced noise compared with the default “everything is a box” feel of some admin themes.
Role separation mattered: administrators saw operational controls; editors saw content-centric shortcuts. That mirrored the later capability model in the standalone CMS - only the hosting runtime changed.
- Custom top-level admin pages and ordered submenus
- Role- and capability-gated sections
- Scoped CSS/JS so the rest of wp-admin stays stable
- Deep links into plugins, tools, and theme-related screens
- Room to embed status snippets (updates, queues, notices)
Technical approach
Technically this is classic WordPress plugin territory: bootstrap on plugins_loaded or admin_menu, add_menu_page / add_submenu_page, and wp_enqueue_style / wp_enqueue_script with version hashes for cache busting. Data shown on the dashboard came from existing tables - options, post counts, transients - not a parallel schema.
Where AJAX or REST helped, endpoints stayed namespaced and nonce-protected. The goal was always “upgrade-safe”: a WordPress core update should not silently break the dashboard because we avoided monkey-patching private hooks.
add_action('admin_menu', function () {
add_menu_page(
'Dashboard', 'My Dashboard',
'manage_options', 'my-dash-home',
'my_admin_dashboard_render', 'dashicons-layout', 2
);
});
Toward a standalone CMS
WordPress was the right host for a long time: mature ecosystem, familiar UI, and fast iteration. Over time, the product vision outgrew “everything in wp-content”: tighter control over auth flows, migrations, multi-app admin, and theme packaging motivated a from-scratch CMS - this site now runs on that stack.
The custom admin dashboard still matters as history: it proves product thinking in constraints, and many patterns - capability checks, separation of admin “home” vs raw screens, pragmatic PHP - carried straight into the new system. If you run WordPress today, the same approach still applies.
Maintainability
Because the code respected public APIs, maintenance was mostly “keep hooks current” and refresh asset versions - not chasing private WordPress internals. Documentation lived in short README sections so returning after months away did not require archaeology.
If you adopt something similar, treat the dashboard as a product: version it, test on staging against beta WordPress when you can, and keep third-party plugin interactions explicit so surprises are rare.