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…