Editorial workflow plugin with custom statuses, editorial comments, and notifications.
| Property | Value |
|---|---|
| Main file | edit_flow.php |
| Text domain | edit-flow |
| Function prefix | ef_ |
| Namespace | Global (legacy) |
| Source directory | modules/ |
| Version | 0.10.3 |
| Requires PHP | 7.4+ |
| Requires WP | 6.4+ |
edit-flow/
├── edit_flow.php # Main plugin file (note: underscore in filename)
├── edit-flow.php # Redirect file (hyphenated, loads the underscore version)
├── common/ # Shared utilities and base module class
├── modules/ # Feature modules (each is self-contained)
│ ├── calendar/ # Editorial calendar
│ ├── custom-status/ # Custom post statuses
│ ├── dashboard/ # Dashboard widgets
│ ├── editorial-comments/ # In-post editorial comments
│ ├── editorial-metadata/ # Custom editorial fields
│ ├── notifications/ # Email notifications
│ ├── settings/ # Plugin settings
│ ├── story-budget/ # Story budget overview
│ └── user-groups/ # User group management
├── tests/ # Integration tests
├── build/ # Built assets
├── dist/ # Distribution assets
├── .github/workflows/ # CI: deploy, e2e-tests, integration, js-tests, php-lint
└── .phpcs.xml.dist # PHPCS configuration
edit_flowclass — Main plugin class, loads and manages modules- Each module in
modules/is a self-contained feature with its own views, scripts, and styles common/contains the baseEF_Moduleclass and shared utilities
- Dev:
automattic/vipwpcs,yoast/wp-test-utils - JS: Has
package.jsonwith build tooling and Playwright for E2E tests
composer cs # Check code standards (PHPCS)
composer cs-fix # Auto-fix code standard violations
composer lint # PHP syntax lint
composer test:integration # Run integration tests (requires wp-env)
composer test:integration-ms # Run multisite integration tests
composer coverage # Run tests with HTML coverage report
npm run test-e2e # Run Playwright E2E tests
npm run build # Build JS/CSS assetsNote: This plugin has integration tests and E2E tests, but no separate PHP unit test suite.
Follow the standards documented in ~/code/plugin-standards/ for full details. Key points:
- Commits: Use the
/commitskill. Favour explaining "why" over "what". - PRs: Use the
/prskill. Squash and merge by default. - Branch naming:
feature/description,fix/descriptionfromdevelop. - Testing: Integration tests for PHP, Playwright E2E tests for UI interactions. New PHP tests should be integration tests.
- Code style: WordPress coding standards via PHPCS. Tabs for indentation.
- i18n: All user-facing strings must use the
edit-flowtext domain.
- Modular architecture: Each feature (calendar, custom statuses, notifications, etc.) is a self-contained module in
modules/. This is the plugin's core architectural pattern. New features should be added as new modules, not by extending existing ones. - Module base class: All modules extend
EF_Modulefromcommon/. This provides shared infrastructure (settings registration, module activation/deactivation). - Two main files:
edit_flow.php(underscore) is the real main file.edit-flow.php(hyphen) is a redirect for backward compatibility. Do not remove the redirect file. - WordPress.org hosted: This plugin is publicly distributed on WordPress.org. Changes must maintain backward compatibility for all users, not just VIP customers.
- E2E testing with Playwright: UI-heavy features (calendar, editorial comments) are tested with Playwright. Use E2E tests for complex UI interactions, integration tests for PHP logic.
- Global namespace (legacy): All classes are in the global namespace with the
EF_prefix. This is legacy — do not introduce namespaced classes alongside global ones without a migration plan.
- Do not edit WordPress core files or bundled dependencies in
vendor/. - Run
composer csbefore committing. CI will reject code standard violations. - Integration tests require
npx wp-env startrunning first. - The main file has an underscore (
edit_flow.php), not a hyphen. The hyphenatededit-flow.phpis just a redirect. Do not add logic to the redirect file. - Modules are self-contained: Do not create cross-dependencies between modules. If module A needs data from module B, use WordPress hooks/filters as the interface.
- WordPress.org compatibility: This plugin serves a broad user base. Do not add VIP-specific code without graceful fallbacks for non-VIP environments.
- Custom post statuses interact with WordPress core's status system in complex ways. Test custom status changes with Gutenberg and the Classic Editor — they behave differently.
- The editorial calendar uses JavaScript date handling. Be careful with timezone issues — WordPress stores dates in UTC but displays them in the site's configured timezone.
- Do not add new modules without considering the settings UI, activation/deactivation flow, and module dependencies.
- Asset builds (
npm run build) must be run before committing changes to JS/CSS source files. Built assets inbuild/anddist/should be committed.