home / skills / automattic / agent-skills / wp-phpstan

wp-phpstan skill

/skills/wp-phpstan

This skill helps you configure and fix PHPStan for WordPress projects, including stubs, baselines, and WP-specific typing.

npx playbooks add skill automattic/agent-skills --skill wp-phpstan

Review the files below or copy the command above to add this skill to your agents.

Files (5)
SKILL.md
4.0 KB
---
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.

Overview

This skill helps configure, run, and fix PHPStan static analysis in WordPress projects (plugins, themes, or sites). It focuses on phpstan.neon setup, baseline management, WordPress-specific typing, and safely handling third-party plugin/theme classes. Use it to get meaningful, actionable static analysis results without masking real issues.

How this skill works

The skill inspects the repository for PHPStan entry points and composer scripts, checks for required WordPress stubs, and validates phpstan.neon and baseline usage. It recommends configuration changes, precise PHPDoc additions for WordPress patterns, and options for third-party class resolution (stubs, autoload, or narrow ignores). Finally, it runs PHPStan and verifies results and baseline behavior.

When to use it

  • Setting up or updating phpstan.neon / phpstan.neon.dist for a WordPress project
  • Generating or reducing a phpstan-baseline.neon for legacy code
  • Fixing PHPStan errors by adding WordPress-aware PHPDoc and types
  • Resolving "class not found" or unknown function errors from third-party plugins/themes
  • Validating that baseline changes didn’t inadvertently hide new errors

Best practices

  • Install and reference WordPress core stubs (e.g., phpstan-wordpress or wordpress-stubs) before running analysis
  • Limit phpstan.neon paths to first-party code and exclude vendor, node_modules, and generated files
  • Prefer correcting types and adding PHPDoc for REST requests, hooks, and query results instead of broad ignores
  • Use baselines only to migrate legacy issues; do not baseline newly introduced errors
  • When third-party classes are unresolved, prefer vendor-specific stubs or targeted ignore patterns rather than global suppression

Example use cases

  • Add WP REST endpoint type hints (WP_REST_Request<...>) to eliminate parameter type errors
  • Create a focused phpstan.neon that runs only plugin/src and excludes tests and build artifacts
  • Generate a phpstan-baseline.neon for an older plugin, then iteratively remove entries as code is fixed
  • Add composer dev stubs for WooCommerce or ACF to resolve external class references
  • Narrowly ignore unresolved classes from an optional third-party plugin that isn’t installed in CI

FAQ

What if PHPStan reports thousands of errors after enabling it?

Start by narrowing paths and excluding vendor/generated files. Add a baseline for legacy noise and then fix high-priority issues incrementally; avoid broad ignore rules.

Can I add composer dev dependencies for stubs automatically?

Only add dev dependencies if allowed. Prefer existing repo stubs; if none exist, confirm permission before adding php-stubs or phpstan-wordpress packages.

When should I add an ignoreErrors entry?

Use a narrow, documented ignore only when a true runtime dependency is missing or a specific third-party API cannot be modeled. Do not use ignores to bypass fixable typing issues.