PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.35.1
MailPoet – Newsletters, Email Marketing, and Automation v5.35.1
5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Automation / Integrations / MailPoet / Templates / TemplateEmailPreviewRenderer.php
mailpoet / lib / Automation / Integrations / MailPoet / Templates Last commit date
EmailFactory.php 3 months ago TemplateEmailPreviewRenderer.php 1 month ago TemplatesFactory.php 1 month ago index.php 3 years ago
TemplateEmailPreviewRenderer.php
126 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Automation\Integrations\MailPoet\Templates;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use Automattic\WooCommerce\EmailEditor\Email_Editor_Container;
9 use Automattic\WooCommerce\EmailEditor\Engine\Personalizer;
10 use Automattic\WooCommerce\EmailEditor\Engine\Renderer\Renderer as GutenbergRenderer;
11 use MailPoet\EmailEditor\Integrations\MailPoet\Patterns\PatternsController;
12 use MailPoet\EmailEditor\Integrations\MailPoet\Templates\TemplatesController;
13 use MailPoet\WP\Functions as WPFunctions;
14
15 /**
16 * Renders an automation template's pre-built email pattern to HTML for previewing
17 * in the template library, without persisting a newsletter or mailpoet_email post.
18 *
19 * The block-editor renderer resolves post content through the core/post-content
20 * block, which reads the post via get_post(). To render without a database write
21 * we prime the WordPress object cache with an in-memory post under an unused ID,
22 * render, then remove it again. Nothing is written to the database.
23 */
24 class TemplateEmailPreviewRenderer {
25 // High, implausible-to-exist post ID range used only to back the in-memory
26 // preview post. A fresh ID is drawn per render so concurrent previews can't
27 // clobber each other's cache entry when a persistent object cache is in use.
28 private const PREVIEW_POST_ID_MIN = 2000000000;
29 private const PREVIEW_POST_ID_MAX = 2147483646;
30
31 private PatternsController $patternsController;
32 private TemplatesController $templatesController;
33 private WPFunctions $wp;
34
35 public function __construct(
36 PatternsController $patternsController,
37 TemplatesController $templatesController,
38 WPFunctions $wp
39 ) {
40 $this->patternsController = $patternsController;
41 $this->templatesController = $templatesController;
42 $this->wp = $wp;
43 }
44
45 public function patternExists(string $patternName): bool {
46 return $this->patternsController->getPatternPreviewContent($patternName) !== null;
47 }
48
49 public function render(string $patternName, string $subject = '', string $preheader = ''): ?string {
50 $content = $this->patternsController->getPatternPreviewContent($patternName);
51 if ($content === null) {
52 return null;
53 }
54
55 $previewPostId = random_int(self::PREVIEW_POST_ID_MIN, self::PREVIEW_POST_ID_MAX);
56 $post = new \WP_Post((object)[
57 'ID' => $previewPostId,
58 'post_author' => 0,
59 'post_date' => '2024-01-01 00:00:00',
60 'post_date_gmt' => '2024-01-01 00:00:00',
61 'post_content' => $content,
62 'post_title' => $subject,
63 'post_status' => 'publish',
64 'post_name' => 'mailpoet-automation-template-email-preview',
65 'post_type' => 'mailpoet_email',
66 'post_modified' => '2024-01-01 00:00:00',
67 'post_modified_gmt' => '2024-01-01 00:00:00',
68 'filter' => 'raw',
69 ]);
70
71 $contextFilter = function (array $context): array {
72 return array_merge($context, [
73 'integration' => 'mailpoet',
74 'newsletter_id' => 0,
75 'queue_id' => 0,
76 'email_type' => 'automation',
77 'is_real_send' => false,
78 'is_preview' => true,
79 'is_single_recipient' => false,
80 'subscriber_count' => 0,
81 'mailpoet_is_automation' => true,
82 ]);
83 };
84
85 $this->wp->wpCacheSet($previewPostId, $post, 'posts');
86 $this->wp->addFilter('woocommerce_email_editor_rendering_email_context', $contextFilter);
87 try {
88 $rendered = $this->getRenderer()->render(
89 $post,
90 $subject,
91 $preheader,
92 (string)$this->wp->getBloginfo('language'),
93 '<meta name="robots" content="noindex, nofollow" />',
94 $this->templatesController->getDefaultTemplateSlug()
95 );
96 } finally {
97 $this->wp->removeFilter('woocommerce_email_editor_rendering_email_context', $contextFilter);
98 $this->wp->wpCacheDelete($previewPostId, 'posts');
99 }
100
101 $html = is_string($rendered['html'] ?? null) ? $rendered['html'] : null;
102 if ($html === null) {
103 return null;
104 }
105
106 // Replace personalization tags (e.g. <!--[mailpoet/site-title]-->) with their
107 // preview values; without this they render as empty placeholders.
108 $personalizer = $this->getPersonalizer();
109 $personalizer->set_context([
110 'recipient_email' => null,
111 'is_user_preview' => true,
112 'newsletter_id' => 0,
113 'queue_id' => null,
114 ]);
115 return $personalizer->personalize_content($html);
116 }
117
118 private function getRenderer(): GutenbergRenderer {
119 return Email_Editor_Container::container()->get(GutenbergRenderer::class);
120 }
121
122 private function getPersonalizer(): Personalizer {
123 return Email_Editor_Container::container()->get(Personalizer::class);
124 }
125 }
126