wp-admin-browser
Use when a WordPress admin panel needs real browser interaction via Chrome DevTools MCP — logging in, navigating admin menus, clicking buttons, filling and…
Use when adding a guided onboarding or feature-discovery tour to a WordPress admin plugin using Driver.js v1 — setting up the IIFE bundle (window.driver.js.driver), PHP backend tour config arrays (autoStart, pages, steps, element, popover), JS scope detection from URL pathname +
$ npx -y skills add mralaminahamed/wp-dev-skills --skill wp-guided-tour --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/wp-guided-tourContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when adding a guided onboarding or feature-discovery tour to a WordPress admin plugin using Driver.js v1 — setting up the IIFE bundle (window.driver.js.driver), PHP backend tour config arrays (autoStart, pages, steps, element, popover), JS scope detection from URL pathname +
name: wp-guided-tour description: "Use when adding a guided onboarding or feature-discovery tour to a WordPress admin plugin using Driver.js v1 — setting up the IIFE bundle (window.driver.js.driver), PHP backend tour config arrays (autoStart, pages, steps, element, popover), JS scope detection from URL pathname + hash (getCurrentScope, hashchange listener), localStorage-based completion tracking, CSS selector rules for WP admin elements including Tailwind bracket-notation escaping, testing selectors in browser console, and generating/updating the POT file for tour strings. Triggers: \"add a guided tour to my plugin\", \"onboarding walkthrough in WP admin\", \"Driver.js setup\", \"highlight this admin element\", \"step-by-step tutorial in WP admin\", \"tour not starting\", \"tour completion not saving\", \"scope detection for admin pages\", \"add tooltips to my settings page\", \"first-run wizard\", \"window.driver.js.driver\", \"getCurrentScope()\", \"hashchange listener for tour\", \"localStorage tour tracking\", \"Tailwind selector escaping in PHP\", \"Driver.js popover\", \"autoStart tour config\", \"tour step element not found\", \"verify selector in browser console\", \"tour i18n POT file\". Not for: front-end SPAs or non-WordPress apps; guided tours in themes."
> **Model note:** IIFE bundle setup and PHP config scaffolding are mechanical (`haiku`). JS scope detection from URL + hash, and debugging selector mismatches against live DOM, need `sonnet`.
**Not for:** Front-end-only SPAs or non-WordPress JS apps — requires WP admin backend context. Guided tours in themes — this skill targets plugin-owned admin pages only.
Download the Driver.js v1 IIFE build (NOT the ESM build):
The IIFE build exposes `window.driver.js.driver` (double namespace). Always call it as:
window.driver.js.driver({ ... })// Enqueue on all admin pages (is_admin() block)
$this->enqueue_script(
'shopflow_guided_tour_driverjs',
SHOPFLOW_ASSETS_URL . 'admin/js/driverjs/driver.js.iife.js',
array()
);
$this->enqueue_style(
'shopflow_guided_tour_driverjs',
SHOPFLOW_ASSETS_URL . 'admin/js/driverjs/driver.css',
array()
);
$this->enqueue_script(
'shopflow_guided_tour',
SHOPFLOW_ASSETS_URL . 'admin/js/guided-tour.js',
array( 'shopflow_guided_tour_driverjs' )
);
// Add tour configs to the main localized object
$localized['tours'] = shopflow_get_tour_configs();The `$localized` array must be passed to `localize_script()` on the **main SPA script** (not the tour script) so `window.SHOPFLOW.tours` is available before `guided-tour.js` runs.
---
function shopflow_get_tour_configs() {
return apply_filters( 'shopflow_tour_configs', array(
'dashboard' => array(
'autoStart' => true, // only one scope should be true
'pages' => array( 'shopflow' ),
'steps' => array(
array(
// Centered popover — no element key
'popover' => array(
'title' => __( 'Welcome!', 'my-plugin' ),
'description' => __( 'Quick intro text.', 'my-plugin' ),
'side' => 'bottom',
),
),
array(
// Element-targeted step
'element' => '#my-stable-id',
'popover' => array(
'title' => __( 'Step Title', 'my-plugin' ),
'description' => __( 'Step description.', 'my-plugin' ),
'side' => 'right',
),
),
),
),
) );
}**Rules:**
---
function getCurrentScope() {
const urlParams = new URLSearchParams(window.location.search);
const page = urlParams.get('page');
if (!page || !page.startsWith('myprefix')) return null;
// Non-SPA pages (full page reloads)
if (page === 'myprefix-settings') return 'settings';
if (page === 'myprefix-wizard') return 'wizard';
// Main SPA — differentiate by hash route
// Strip pagination suffix like /page/2
const hash = window.location.hash.replace('#', '').replace(/\/page\/\d+$/, '');
if (!hash || hash === '/' || hash === '/dashboard') return 'dashboard';
if (hash.startsWith('/products/add')) return 'add-product';
if (hash === '/orders/new') return 'create-order';
if (hash === '/orders') return 'orders';
if (hash === '/customers') return 'customers';
if (hash.startsWith('/reports')) return 'reports';
return null;
}**Key points:**
window.addEventListen
Covers the complete WordPress plugin development lifecycle — build, test, audit, release, and ship to WP.org — for Claude Code, Gemini CLI, Cursor, Windsurf, Cline, Codex, GitHub Copilot, opencode, and more.
Repo: mralaminahamed/wp-dev-skills
Use when a WordPress admin panel needs real browser interaction via Chrome DevTools MCP — logging in, navigating admin menus, clicking buttons, filling and…
Use when a WordPress plugin needs to run work outside the HTTP request cycle — scheduling async or recurring jobs with Action Scheduler…
Use when setting up, configuring, or debugging the JavaScript/CSS build pipeline for a WordPress plugin — @wordpress/scripts, webpack (webpack.config.js, entry…
Use when a pull request has QA failures, a \"Testing Failed\" label, or QA comments reporting broken features — reading QA feedback and PR comments, tracing…
Use when setting up PHPCS with WordPress Coding Standards (WPCS), configuring phpcs.xml.dist, running phpcs/phpcbf, fixing sniff violations, adding PHPCS to CI…
Use when a WordPress plugin needs a custom database table — creating with dbDelta (strict SQL format: two spaces before PRIMARY KEY, no trailing comma),…