wp-easy-cpt
Tools
Open Source
PHP
WordPress
WordPress Easy Custom Post Type
Easy to use tools for a robust WordPress custom post type setup.
Installation
via composer:
> composer require gebruederheitz/wp-easy-cpt
Make sure you have Composer autoload or an alternative class loader present.
Usage
Post Type abstract class
use GebruederheitzWordpressCustomPostTypePostType; use GebruederheitzWordpressCustomPostTypePostTypeRegistrationArgs; class NewsPostType extends PostType { /** * @required Supply a slug-type name which will be used in the DB amongst * other places */ public static $postTypeName = 'news'; /** * @required The name users will see */ public static $prettyName = 'News'; /** * @optional Where the metabox will appear: one of 'side', 'normal', 'advanced' * @default 'side' */ public static $context = 'normal'; /** * @var bool Whether to use a Gutenberg editor and call the allowed block * types hook. Set to "false" by default, so if you don't need * Gutenberg you can just leave this out. */ protected $withGutenberg = true; /** * @var bool Whether to load the media picker scripts on the edit page. * If you don't need to use a media picker, you can leave this * bit out. */ protected $withMedia = true; /** * @var array List of allowed block types if Gutenberg is enabled. If you * did not set $withGutenberg to `true` you won't need this. * Otherwise supply a string-array of block names * (e.g. `core/button`). */ protected $allowedBlockTypes = [ 'core/paragraph', 'core/columns', ]; /** * @var string The translation domain to use for menu labels etc. * * If you are using the "ghwp" domain, you can skip this setting, otherwise * set it to your theme / plugin's i18n domain. */ protected $translationDomain = 'ghwp'; // ------------------------------------------------------------------------- // There are only two methods you need to define, and one you will want to // override: // ------------------------------------------------------------------------- /** * Renders the meta box for users to edit additional post type fields. * * @return void */ public function renderMetabox() { /** @var WP_Post */ global $post; // --------------------------------------------------------------------- // You could go old-school // --------------------------------------------------------------------- ?> <input name="postid" type="text" value="<?php echo $post->ID; ?>" /> <?php // or use a library like cmb2 $metabox = new_cmb2_box([ 'id' => self::$postTypeName . 'something', 'title' => 'Details', ]); // --------------------------------------------------------------------- // or use the dependency-free MetaForms class and maybe even combine it // with the repository (more below) // --------------------------------------------------------------------- /** @var Newspost $news */ $news = NewspostRepository::getInstance()->find($post->ID); MetaForms::renderTextInputField( Newspost::tagMetaFieldName, $news->getTagsAsString(), 'Tags (separate with semicolons)', false ); } /** * Handle the submission of user edited metadata. * * @param WP_POST $post * @param array $data * * @return void */ public function savePostMeta($post, $data) { /** @var Newspost $news */ $news = NewspostRepository::getInstance()->find($post->ID); $news->setTagsFromString($data[Newspost::tagMetaFieldName] ?? ''); NewspostRepository::getInstance()->save($news)->flush(); } /* * The PostType class handles the registration for you. For easy access and * type definitions it uses the PostTypeRegistrationArgs configuration * object. * To modify the arguments passed to `register_post_type` you can override * the method editRegistrationArgs() and call the fluent setters on the * PostTypeRegistrationArgs object provided. */ /** * Modify the arguments for the post type's registration call. */ protected function editRegistrationArgs(PostTypeRegistrationArgs $args): PostTypeRegistrationArgs { $args->addAuthorSupport(); // Setters in PostTypeRegistrationArgs can be chained: $args->setCanExport(true) ->setPluralLabel('Newsposts') ->makePublic(); return $args; } }
Using the entity repository
The entity repository caches database calls for…