camalote-wp / models
CamaloteWP Models provides abstract base classes for registering WordPress content models (post types, taxonomies, metadata, blocks).
v0.1.1
2026-06-28 21:53 UTC
Requires
- php: ^8.2
Requires (Dev)
- brain/monkey: ^2.7
- captainhook/captainhook-phar: ^5.29
- laravel/pint: ^1.0
- pestphp/pest: ^3.0
- phpstan/phpstan: ^2.0
- szepeviktor/phpstan-wordpress: ^2.0
- yoast/phpunit-polyfills: ^4.0
README
Abstract base classes for registering WordPress content models (post types, meta, blocks, REST hooks, admin pages). Reduces boilerplate when spinning up the same registration logic across multiple plugins.
Usage
- Extend the abstracts for your content model
- Implement the abstract methods
- List your components in a Bootstrap class
- Run the BootstrapRunner
use CamaloteWP\Models\Core\BootstrapRunner; $runner = new BootstrapRunner; $runner->register([Page\Bootstrap::class])->run();
Complete Example
// PagePostType.php namespace MyPlugin\Page; use CamaloteWP\Models\Abstracts\AbstractPostType; class PagePostType extends AbstractPostType { protected string $model_name = 'page'; protected function args(): array { return [ 'public' => true, 'has_archive' => true, 'show_in_rest' => true, 'labels' => [ 'name' => 'Pages', 'singular_name' => 'Page', ], ]; } }
// PageMeta.php namespace MyPlugin\Page; use CamaloteWP\Models\Abstracts\AbstractMeta; class PageMeta extends AbstractMeta { protected string $model_name = 'page'; protected function schema(): array { return [ 'subtitle' => ['type' => 'string'], 'color' => ['type' => 'string'], ]; } protected function get_meta_prefix(): string { return 'page_'; } }
// PageBlocks.php namespace MyPlugin\Page; use CamaloteWP\Models\Abstracts\AbstractBlocks; class PageBlocks extends AbstractBlocks { protected string $model_name = 'page'; protected function get_block_paths(): array { return [get_template_directory() . '/blocks']; } }
// Bootstrap.php namespace MyPlugin\Page; use CamaloteWP\Models\Abstracts\AbstractBootstrap; class Bootstrap extends AbstractBootstrap { protected string $model_name = 'page'; public function get_components(): array { return [ PagePostType::class, PageMeta::class, PageBlocks::class, ]; } }
// In your plugin's main file or service provider use CamaloteWP\Models\Core\BootstrapRunner; use MyPlugin\Page\Bootstrap; $runner = new BootstrapRunner; $runner->register([Bootstrap::class])->run();
Reference
AbstractPostType
| What to extend | AbstractPostType |
|---|---|
| Implements | Registerable |
| Must implement | args(): array |
| Can override | (none) |
| You get | register() — calls \register_post_type() with $model_name and args() |
AbstractMeta
| What to extend | AbstractMeta |
|---|---|
| Implements | Registerable |
| Must implement | schema(): array |
| Can override | get_meta_prefix(): string (default: empty string) |
| You get | register() — loops schema and calls \register_post_meta() per entry, prefixing keys with get_meta_prefix() |
AbstractBlocks
| What to extend | AbstractBlocks |
|---|---|
| Implements | Registerable, Hookable |
| Must implement | get_block_paths(): array |
| Can override | get_hooks(): array (default: empty) |
| You get | register() — scans each path for block.json files and calls \register_block_type() |
AbstractRest
| What to extend | AbstractRest |
|---|---|
| Implements | Hookable |
| Must implement | (none) |
| Can override | get_hooks(): array (default: empty) |
| You get | A Hookable base for adding REST filters/actions via get_hooks() |
AbstractModelAdminPage
| What to extend | AbstractModelAdminPage |
|---|---|
| Implements | Hookable, AdminPage |
| Must implement | get_page_config(): array, get_asset_config(): array, render_page(): void |
| Can override | get_hooks(): array (default: empty) |
| You get | register_submenu_page(), register_menu_page(), enqueue_assets() |
AbstractBootstrap
| What to extend | AbstractBootstrap |
|---|---|
| Must implement | get_components(): array |
| Can override | register() (default: empty) |
| You get | get_model_name() |
BootstrapRunner
Orchestrates registration. Instantiate, pass Bootstrap class names to register(), then call run().
$runner = new BootstrapRunner; $runner->register([Bootstrap::class])->run();
Installation
composer require camalote-wp/models
Development
composer test # Run tests composer stan # Run static analysis composer pint # Check code style composer check # Run all three