PluginBench
Skill
Official
Review
Audit score 70

wp-phpstan

wordpress/agent-skills

Configure and fix PHPStan static analysis in WordPress projects with proper typing and baseline management.

What is wp-phpstan?

PHPStan static analysis skill for WordPress codebases (plugins, themes, sites). Use it to set up phpstan.neon configuration, generate and manage baselines, apply WordPress-specific type annotations, and safely handle third-party plugin classes.

  • Inspect and discover PHPStan configuration and baseline files in WordPress projects
  • Set up or update phpstan.neon with WordPress-appropriate paths and exclusions
  • Generate and maintain phpstan-baseline.neon for legacy code migration
  • Apply WordPress-specific PHPDoc annotations for hooks, REST endpoints, and database queries
  • Handle third-party plugin/theme classes via stubs, autoloading, or targeted ignore patterns

How to install wp-phpstan

npx skills add https://github.com/wordpress/agent-skills --skill wp-phpstan
Prerequisites
  • WordPress 6.9+ (PHP 7.2.24+)
  • Composer-based PHPStan installation
  • wp-project-triage skill output (recommended)
Claude Code
Cursor
Windsurf
Cline

How to use wp-phpstan

  1. 1.Run the PHPStan inspection script to discover existing configuration: node skills/wp-phpstan/scripts/phpstan_inspect.mjs
  2. 2.Confirm WordPress core stubs (szepeviktor/phpstan-wordpress or php-stubs/wordpress-stubs) are installed
  3. 3.Review and update phpstan.neon to focus paths on first-party code and exclude vendor/node_modules/tests
  4. 4.Fix errors by adding WordPress-specific PHPDoc annotations (REST requests, hooks, query results) instead of ignoring them
  5. 5.For third-party classes, add plugin-specific stubs or narrow ignore patterns only when necessary
  6. 6.Run PHPStan via composer script or vendor/bin/phpstan analyse to verify changes
  7. 7.Manage baseline file as a migration tool—reduce it over time rather than adding new errors to it

Use cases

Good for
  • Setting up PHPStan in a new WordPress plugin or theme project
  • Fixing PHPStan errors by adding proper type hints to hook callbacks and REST parameters
  • Integrating third-party plugin stubs (WooCommerce, ACF Pro) into analysis
  • Reducing technical debt by gradually fixing baseline errors over time
  • Configuring PHPStan to exclude vendor code and generated files while analyzing first-party code
Who it's for
  • WordPress plugin developers
  • WordPress theme developers
  • WordPress site maintainers
  • Teams adopting static analysis in existing WordPress projects

wp-phpstan FAQ

What if I see "Class not found" errors for WordPress functions?

Confirm that WordPress core stubs (szepeviktor/phpstan-wordpress or php-stubs/wordpress-stubs) are installed and referenced in your phpstan.neon config. Without stubs, PHPStan cannot resolve WordPress core functions.

Should I baseline all errors or fix them?

Use baseline only for legacy code as a migration tool. Do not baseline newly introduced errors. Gradually reduce the baseline over time by fixing the underlying type issues.

How do I handle third-party plugin classes that PHPStan can't resolve?

First confirm the dependency is actually installed. Prefer using existing plugin-specific stubs (e.g., php-stubs/woocommerce-stubs). Only add narrow, documented ignoreErrors patterns if stubs are unavailable.

What's the best way to type hook callbacks?

Add explicit @param PHPDoc annotations to callback functions with accurate types for each argument. This is preferred over runtime type guards or ignoring errors.

Can I add new Composer dependencies for stubs?

Yes, but confirm with the user first before adding new dev dependencies. Common stubs like wordpress-stubs, woocommerce-stubs, and acf-pro-stubs are widely used and safe to add.

Full instructions (SKILL.md)

Source of truth, from wordpress/agent-skills.


name: wp-phpstan description: "Use when configuring, running, or fixing PHPStan static analysis in WordPress projects (plugins/themes/sites): phpstan.neon setup, baselines, WordPress-specific typing, and handling third-party plugin classes." compatibility: "Targets WordPress 6.9+ (PHP 7.2.24+). Requires Composer-based PHPStan."

WP PHPStan

When to use

Use this skill when working on PHPStan in a WordPress codebase, for example:

  • setting up or updating phpstan.neon / phpstan.neon.dist
  • generating or updating phpstan-baseline.neon
  • fixing PHPStan errors via WordPress-friendly PHPDoc (REST requests, hooks, query results)
  • handling third-party plugin/theme classes safely (stubs/autoload/targeted ignores)

Inputs required

  • wp-project-triage output (run first if you haven't)
  • Whether adding/updating Composer dev dependencies is allowed (stubs).
  • Whether changing the baseline is allowed for this task.

Procedure

0) Discover PHPStan entrypoints (deterministic)

  1. Inspect PHPStan setup (config, baseline, scripts):
    • node skills/wp-phpstan/scripts/phpstan_inspect.mjs

Prefer the repo’s existing composer script (e.g. composer run phpstan) when present.

1) Ensure WordPress core stubs are loaded

szepeviktor/phpstan-wordpress or php-stubs/wordpress-stubs are effectively required for most WordPress plugin/theme repos. Without it, expect a high volume of errors about unknown WordPress core functions.

  • Confirm the package is installed (see composer.dependencies in the inspect report).
  • Ensure the PHPStan config references the stubs (see references/third-party-classes.md).

2) Ensure a sane phpstan.neon for WordPress projects

  • Keep paths focused on first-party code (plugin/theme directories).
  • Exclude generated and vendored code (vendor/, node_modules/, build artifacts, tests unless explicitly analyzed).
  • Keep ignoreErrors entries narrow and documented.

See:

  • references/configuration.md

3) Fix errors with WordPress-specific typing (preferred)

Prefer correcting types over ignoring errors. Common WP patterns that need help:

  • REST endpoints: type request parameters using WP_REST_Request<...>
  • Hook callbacks: add accurate @param types for callback args
  • Database results and iterables: use array shapes or object shapes for query results
  • Action Scheduler: type $args array shapes for job callbacks

See:

  • references/wordpress-annotations.md

4) Handle third-party plugin/theme classes (only when needed)

When integrating with plugins/themes not present in the analysis environment:

  • First, confirm the dependency is real (installed/required).
  • Prefer plugin-specific stubs already used in the repo (common examples: php-stubs/woocommerce-stubs, php-stubs/acf-pro-stubs).
  • If PHPStan still cannot resolve classes, add targeted ignoreErrors patterns for the specific vendor prefix.

See:

  • references/third-party-classes.md

5) Baseline management (use as a migration tool, not a trash bin)

  • Generate a baseline once for legacy code, then reduce it over time.
  • Do not “baseline” newly introduced errors.

See:

  • references/configuration.md

Verification

  • Run PHPStan using the discovered command (composer run ... or vendor/bin/phpstan analyse).
  • Confirm the baseline file (if used) is included and didn’t grow unexpectedly.
  • Re-run after changing ignoreErrors to ensure patterns are not masking unrelated issues.

Failure modes / debugging

  • “Class not found”:
    • confirm autoloading/stubs, or add a narrow ignore pattern
  • Huge error counts after enabling PHPStan:
    • reduce paths, add excludePaths, start at a lower level, then ratchet up
  • Inconsistent types around hooks / REST params:
    • add explicit PHPDoc (see references) rather than runtime guards

Escalation

  • If a type depends on a third-party plugin API you can’t confirm, ask for the dependency version or source before inventing types.
  • If fixing requires adding new Composer dependencies (stubs/extensions), confirm it with the user first.