Move meta registration to the engine

As a part of the refactoring is making the meta field available via API.
[MAILPOET-5640]
This commit is contained in:
Jan Lysý
2024-03-19 10:28:21 +01:00
committed by Jan Lysý
parent b8a470512b
commit cae2ad6dc7
3 changed files with 42 additions and 23 deletions

View File

@@ -3,12 +3,15 @@
namespace MailPoet\EmailEditor\Engine; namespace MailPoet\EmailEditor\Engine;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Validator\Builder;
/** /**
* @phpstan-type EmailPostType array{name: string, args: array, meta: array{key: string, args: array}[]} * @phpstan-type EmailPostType array{name: string, args: array, meta: array{key: string, args: array}[]}
* See register_post_type for details about EmailPostType args. * See register_post_type for details about EmailPostType args.
*/ */
class EmailEditor { class EmailEditor {
public const MAILPOET_EMAIL_META_THEME_TYPE = 'mailpoet_email_theme';
/** @var EmailApiController */ /** @var EmailApiController */
private $emailApiController; private $emailApiController;
@@ -21,6 +24,7 @@ class EmailEditor {
public function initialize(): void { public function initialize(): void {
do_action('mailpoet_email_editor_initialized'); do_action('mailpoet_email_editor_initialized');
$this->registerEmailPostTypes(); $this->registerEmailPostTypes();
$this->registerEmailMetaFields();
$this->registerEmailPostSendStatus(); $this->registerEmailPostSendStatus();
$this->extendEmailPostApi(); $this->extendEmailPostApi();
} }
@@ -35,13 +39,23 @@ class EmailEditor {
$postType['name'], $postType['name'],
array_merge($this->getDefaultEmailPostArgs(), $postType['args']) array_merge($this->getDefaultEmailPostArgs(), $postType['args'])
); );
foreach ($postType['meta'] as $postMeta) { }
register_post_meta( }
$postType['name'],
$postMeta['key'], private function registerEmailMetaFields(): void {
$postMeta['args'] foreach ($this->getPostTypes() as $postType) {
); register_post_meta(
} $postType['name'],
self::MAILPOET_EMAIL_META_THEME_TYPE,
[
'show_in_rest' => [
'schema' => $this->getEmailThemeDataSchema(),
],
'single' => true,
'type' => 'object',
'default' => ['version' => 2], // The version 2 is important to merge themes correctly
]
);
} }
} }
@@ -60,7 +74,7 @@ class EmailEditor {
'show_ui' => true, 'show_ui' => true,
'show_in_menu' => false, 'show_in_menu' => false,
'show_in_nav_menus' => false, 'show_in_nav_menus' => false,
'supports' => ['editor', 'title'], 'supports' => ['editor', 'title', 'custom-fields'], // 'custom-fields' is required for loading meta fields via API
'has_archive' => true, 'has_archive' => true,
'show_in_rest' => true, // Important to enable Gutenberg editor 'show_in_rest' => true, // Important to enable Gutenberg editor
]; ];
@@ -84,4 +98,21 @@ class EmailEditor {
'schema' => $this->emailApiController->getEmailDataSchema(), 'schema' => $this->emailApiController->getEmailDataSchema(),
]); ]);
} }
public function getEmailThemeDataSchema(): array {
return Builder::object([
'version' => Builder::integer(),
'styles' => Builder::object([
'spacing' => Builder::object([
'padding' => Builder::object([
'top' => Builder::string(),
'right' => Builder::string(),
'bottom' => Builder::string(),
'left' => Builder::string(),
])->nullable(),
'blockGap' => Builder::string()->nullable(),
])->nullable(),
])->nullable(),
])->toArray();
}
} }

View File

@@ -34,7 +34,7 @@ class EmailApiController {
'subject' => $newsletter ? $newsletter->getSubject() : '', 'subject' => $newsletter ? $newsletter->getSubject() : '',
'preheader' => $newsletter ? $newsletter->getPreheader() : '', 'preheader' => $newsletter ? $newsletter->getPreheader() : '',
'preview_url' => $this->newsletterUrl->getViewInBrowserUrl($newsletter), 'preview_url' => $this->newsletterUrl->getViewInBrowserUrl($newsletter),
'theme' => get_post_meta($postEmailData['id'], EmailEditor::MAILPOET_EMAIL_META_THEME_TYPE, true), 'theme' => get_post_meta($postEmailData['id'], \MailPoet\EmailEditor\Engine\EmailEditor::MAILPOET_EMAIL_META_THEME_TYPE, true),
]; ];
} }
@@ -50,7 +50,7 @@ class EmailApiController {
throw new UnexpectedValueException('Newsletter ID does not match the post ID'); throw new UnexpectedValueException('Newsletter ID does not match the post ID');
} }
update_post_meta($emailPost->ID, EmailEditor::MAILPOET_EMAIL_META_THEME_TYPE, $data['theme']); update_post_meta($emailPost->ID, \MailPoet\EmailEditor\Engine\EmailEditor::MAILPOET_EMAIL_META_THEME_TYPE, $data['theme']);
$newsletter->setSubject($data['subject']); $newsletter->setSubject($data['subject']);
$newsletter->setPreheader($data['preheader']); $newsletter->setPreheader($data['preheader']);

View File

@@ -10,7 +10,6 @@ use WP_Theme_JSON;
class EmailEditor { class EmailEditor {
const MAILPOET_EMAIL_POST_TYPE = 'mailpoet_email'; const MAILPOET_EMAIL_POST_TYPE = 'mailpoet_email';
const MAILPOET_EMAIL_META_THEME_TYPE = 'mailpoet_email_theme';
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
@@ -55,17 +54,6 @@ class EmailEditor {
], ],
'rewrite' => ['slug' => self::MAILPOET_EMAIL_POST_TYPE], 'rewrite' => ['slug' => self::MAILPOET_EMAIL_POST_TYPE],
], ],
'meta' => [
[
'key' => self::MAILPOET_EMAIL_META_THEME_TYPE,
'args' => [
'show_in_rest' => true,
'single' => true,
'type' => 'object',
'default' => ['version' => 2],
],
],
],
]; ];
return $postTypes; return $postTypes;
} }
@@ -102,7 +90,7 @@ class EmailEditor {
} }
public function extendEmailThemeStyles(WP_Theme_JSON $theme, WP_Post $post): WP_Theme_JSON { public function extendEmailThemeStyles(WP_Theme_JSON $theme, WP_Post $post): WP_Theme_JSON {
$emailTheme = get_post_meta($post->ID, self::MAILPOET_EMAIL_META_THEME_TYPE, true); $emailTheme = get_post_meta($post->ID, \MailPoet\EmailEditor\Engine\EmailEditor::MAILPOET_EMAIL_META_THEME_TYPE, true);
if ($emailTheme && is_array($emailTheme)) { if ($emailTheme && is_array($emailTheme)) {
$theme->merge(new WP_Theme_JSON($emailTheme)); $theme->merge(new WP_Theme_JSON($emailTheme));
} }