PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.37.0
MailPoet – Newsletters, Email Marketing, and Automation v5.37.0
5.37.0 5.36.1 5.36.0 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 / Newsletter / Preview / SendPreviewController.php
mailpoet / lib / Newsletter / Preview Last commit date
SendPreviewController.php 3 days ago SendPreviewException.php 4 years ago WooCommerceDummyData.php 2 months ago index.php 3 years ago
SendPreviewController.php
163 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Newsletter\Preview;
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 MailPoet\EmailEditor\Integrations\MailPoet\PersonalizationTagManager;
11 use MailPoet\EmailEditor\Integrations\MailPoet\PersonalizationTags\PersonalizationTagLinkResolver;
12 use MailPoet\Entities\NewsletterEntity;
13 use MailPoet\Entities\SubscriberEntity;
14 use MailPoet\Mailer\MailerFactory;
15 use MailPoet\Mailer\MetaInfo;
16 use MailPoet\Newsletter\Renderer\Renderer;
17 use MailPoet\Newsletter\Shortcodes\Shortcodes;
18 use MailPoet\Subscribers\SubscribersRepository;
19 use MailPoet\WP\Functions as WPFunctions;
20
21 class SendPreviewController {
22 /** @var MailerFactory */
23 private $mailerFactory;
24
25 /** @var MetaInfo */
26 private $mailerMetaInfo;
27
28 /** @var WPFunctions */
29 private $wp;
30
31 /** @var Renderer */
32 private $renderer;
33
34 /** @var Shortcodes */
35 private $shortcodes;
36
37 /** @var SubscribersRepository */
38 private $subscribersRepository;
39
40 /** @var Personalizer */
41 private $personalizer;
42
43 /** @var PersonalizationTagManager */
44 private $personalizationTagManager;
45
46 /** @var WooCommerceDummyData */
47 private $wooCommerceDummyData;
48
49 private PersonalizationTagLinkResolver $personalizationTagLinkResolver;
50
51 public function __construct(
52 MailerFactory $mailerFactory,
53 MetaInfo $mailerMetaInfo,
54 Renderer $renderer,
55 WPFunctions $wp,
56 SubscribersRepository $subscribersRepository,
57 Shortcodes $shortcodes,
58 PersonalizationTagManager $personalizationTagManager,
59 WooCommerceDummyData $wooCommerceDummyData,
60 PersonalizationTagLinkResolver $personalizationTagLinkResolver
61 ) {
62 $this->mailerFactory = $mailerFactory;
63 $this->mailerMetaInfo = $mailerMetaInfo;
64 $this->wp = $wp;
65 $this->renderer = $renderer;
66 $this->shortcodes = $shortcodes;
67 $this->subscribersRepository = $subscribersRepository;
68 $this->personalizer = Email_Editor_Container::container()->get(Personalizer::class);
69 $this->personalizationTagManager = $personalizationTagManager;
70 $this->wooCommerceDummyData = $wooCommerceDummyData;
71 $this->personalizationTagLinkResolver = $personalizationTagLinkResolver;
72 }
73
74 public function sendPreview(NewsletterEntity $newsletter, string $emailAddress) {
75 $renderedNewsletter = $this->renderer->renderAsPreview($newsletter);
76 $divider = '***MailPoet***';
77 $dataForShortcodes = array_merge(
78 [$newsletter->getSubject()],
79 $renderedNewsletter
80 );
81
82 $body = implode($divider, $dataForShortcodes);
83
84 $subscriber = $this->subscribersRepository->getCurrentWPUser();
85 $this->shortcodes->setNewsletter($newsletter);
86 if ($subscriber instanceof SubscriberEntity) {
87 $this->shortcodes->setSubscriber($subscriber);
88 }
89 $this->shortcodes->setWpUserPreview(true);
90
91 [
92 $renderedNewsletter['subject'],
93 $renderedNewsletter['body']['html'],
94 $renderedNewsletter['body']['text'],
95 ] = explode($divider, $this->shortcodes->replace($body));
96
97 if ($newsletter->getWpPostId()) {
98 $context = [
99 'recipient_email' => $subscriber ? $subscriber->getEmail() : $emailAddress,
100 'newsletter_id' => $newsletter->getId(),
101 'is_preview' => true,
102 ];
103
104 // For automation emails, add sample WooCommerce order/customer data for preview
105 if ($newsletter->isAutomation() || $newsletter->isAutomationTransactional()) {
106 $automationId = $newsletter->getOptionValue('automationId');
107 if ($automationId) {
108 // Extend personalization tags based on automation subjects before personalizing
109 $this->personalizationTagManager->extendPersonalizationTagsByAutomationSubjects((int)$automationId);
110 $context = $this->addSampleDataToContext($context);
111 }
112 }
113
114 $this->personalizer->set_context($context);
115 $renderedNewsletter['subject'] = $this->personalizer->personalize_content($renderedNewsletter['subject']);
116 $renderedNewsletter['body']['html'] = $this->personalizer->personalize_content($renderedNewsletter['body']['html']);
117 $renderedNewsletter['body']['text'] = $this->personalizer->personalize_content($renderedNewsletter['body']['text']);
118 $renderedNewsletter['body']['text'] = $this->personalizationTagLinkResolver->resolveMarkdownLinks($renderedNewsletter['body']['text'], $context);
119 }
120
121 $renderedNewsletter['id'] = $newsletter->getId();
122
123 $extraParams = [
124 'unsubscribe_url' => $this->wp->homeUrl(),
125 'meta' => $this->mailerMetaInfo->getPreviewMetaInfo(),
126 ];
127
128 $result = $this->mailerFactory->getDefaultMailer()->send($renderedNewsletter, $emailAddress, $extraParams);
129 if ($result['response'] === false) {
130 $error = sprintf(
131 // translators: %s contains the actual error message.
132 __('The email could not be sent: %s', 'mailpoet'),
133 $result['error']->getMessage()
134 );
135 throw new SendPreviewException($error);
136 }
137 }
138
139 /**
140 * Add sample WooCommerce order/customer data to context for preview.
141 *
142 * @param array<string, mixed> $context Existing context
143 * @return array<string, mixed> Context with sample data added
144 */
145 private function addSampleDataToContext(array $context): array {
146 $order = $this->wooCommerceDummyData->getOrder();
147 if ($order instanceof \WC_Order) {
148 $context['order'] = $order;
149 }
150
151 $customer = $this->wooCommerceDummyData->getCustomer();
152 if ($customer instanceof \WC_Customer) {
153 $context['customer'] = $customer;
154 }
155
156 // Allow extensions (like premium plugin) to add additional sample data for preview
157 /** @var array<string, mixed> $context */
158 $context = $this->wp->applyFilters('mailpoet_automation_email_preview_sample_data', $context);
159
160 return $context;
161 }
162 }
163