PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
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 / AdminPages / Pages / NewsletterEditor.php
mailpoet / lib / AdminPages / Pages Last commit date
AbstractAutomationEmbed.php 5 months ago Automation.php 2 years ago AutomationAnalytics.php 2 months ago AutomationEditor.php 2 months ago AutomationFlowEmbed.php 5 months ago AutomationPreviewEmbed.php 2 months ago AutomationTemplates.php 2 years ago CustomFields.php 2 months ago DynamicSegments.php 2 months ago ExperimentalFeatures.php 3 years ago FormEditor.php 1 week ago Forms.php 2 months ago Help.php 2 months ago Homepage.php 2 years ago Landingpage.php 2 years ago Logs.php 1 month ago NewsletterEditor.php 2 months ago Newsletters.php 2 months ago Settings.php 5 months ago StaticSegments.php 2 months ago Subscribers.php 1 week ago SubscribersExport.php 3 years ago SubscribersImport.php 2 months ago Tags.php 2 months ago Upgrade.php 1 year ago WelcomeWizard.php 2 months ago WooCommerceSetup.php 2 months ago index.php 3 years ago
NewsletterEditor.php
200 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\AdminPages\Pages;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\AdminPages\AssetsController;
9 use MailPoet\AdminPages\PageRenderer;
10 use MailPoet\Entities\NewsletterEntity;
11 use MailPoet\Entities\SubscriberEntity;
12 use MailPoet\Form\Util\CustomFonts;
13 use MailPoet\Newsletter\NewslettersRepository;
14 use MailPoet\Newsletter\Renderer\Blocks\Coupon;
15 use MailPoet\Newsletter\Shortcodes\ShortcodesHelper;
16 use MailPoet\NewsletterTemplates\BrandStyles;
17 use MailPoet\Settings\SettingsController;
18 use MailPoet\Settings\UserFlagsController;
19 use MailPoet\Subscribers\SubscribersRepository;
20 use MailPoet\WooCommerce\Helper as WooCommerceHelper;
21 use MailPoet\WooCommerce\TransactionalEmailHooks;
22 use MailPoet\WooCommerce\TransactionalEmails;
23 use MailPoet\WooCommerce\TransactionalEmails\Template as WooTransactionalEmailTemplate;
24 use MailPoet\WP\AutocompletePostListLoader as WPPostListLoader;
25 use MailPoet\WP\Functions as WPFunctions;
26
27 class NewsletterEditor {
28 private const DATE_FORMAT = 'Y-m-d H:i:s';
29
30 private PageRenderer $pageRenderer;
31 private SettingsController $settings;
32 private UserFlagsController $userFlags;
33 private WooCommerceHelper $woocommerceHelper;
34 private WPFunctions $wp;
35 private TransactionalEmails $wcTransactionalEmails;
36 private ShortcodesHelper $shortcodesHelper;
37 private SubscribersRepository $subscribersRepository;
38 private TransactionalEmailHooks $wooEmailHooks;
39 private WPPostListLoader $wpPostListLoader;
40 private CustomFonts $customFonts;
41 private AssetsController $assetsController;
42 private BrandStyles $brandStyles;
43 private WooTransactionalEmailTemplate $template;
44 private NewslettersRepository $newslettersRepository;
45
46 public function __construct(
47 PageRenderer $pageRenderer,
48 SettingsController $settings,
49 UserFlagsController $userFlags,
50 WooCommerceHelper $woocommerceHelper,
51 WPFunctions $wp,
52 TransactionalEmails $wcTransactionalEmails,
53 ShortcodesHelper $shortcodesHelper,
54 SubscribersRepository $subscribersRepository,
55 TransactionalEmailHooks $wooEmailHooks,
56 WPPostListLoader $wpPostListLoader,
57 CustomFonts $customFonts,
58 AssetsController $assetsController,
59 WooTransactionalEmailTemplate $template,
60 BrandStyles $brandStyles,
61 NewslettersRepository $newslettersRepository
62 ) {
63 $this->pageRenderer = $pageRenderer;
64 $this->settings = $settings;
65 $this->userFlags = $userFlags;
66 $this->woocommerceHelper = $woocommerceHelper;
67 $this->wp = $wp;
68 $this->wcTransactionalEmails = $wcTransactionalEmails;
69 $this->shortcodesHelper = $shortcodesHelper;
70 $this->subscribersRepository = $subscribersRepository;
71 $this->wooEmailHooks = $wooEmailHooks;
72 $this->wpPostListLoader = $wpPostListLoader;
73 $this->customFonts = $customFonts;
74 $this->assetsController = $assetsController;
75 $this->template = $template;
76 $this->brandStyles = $brandStyles;
77 $this->newslettersRepository = $newslettersRepository;
78 }
79
80 public function render() {
81 $this->setupImageSize();
82 $this->assetsController->setupNewsletterEditorDependencies();
83 $newsletterId = isset($_GET['id']) && is_numeric($_GET['id']) ? (int)$_GET['id'] : 0;
84 $woocommerceTemplateId = (int)$this->settings->get(TransactionalEmails::SETTING_EMAIL_ID, null);
85 if (
86 $woocommerceTemplateId
87 && $newsletterId === $woocommerceTemplateId
88 && !$this->woocommerceHelper->isWooCommerceActive()
89 ) {
90 $location = 'admin.php?page=mailpoet-settings&enable-customizer-notice#woocommerce';
91 if (headers_sent()) {
92 echo '<script>window.location = "' . esc_js($location) . '";</script>';
93 } else {
94 header('Location: ' . $location, true, 302);
95 }
96 exit;
97 }
98
99 $subscriber = $this->subscribersRepository->getCurrentWPUser();
100 $subscriberData = $subscriber ? $this->formatSubscriber($subscriber) : [];
101 $woocommerceData = [];
102 $originalTemplateBody = null;
103 if ($this->woocommerceHelper->isWooCommerceActive()) {
104 $wcEmailSettings = $this->wcTransactionalEmails->getWCEmailSettings();
105
106 // Activate hooks for Woo emails styles so that we always load styles set in Woo email customizer
107 if ($newsletterId === (int)$this->settings->get(TransactionalEmails::SETTING_EMAIL_ID)) {
108 $this->wooEmailHooks->overrideStylesForWooEmails();
109 $originalTemplateBody = $this->template->create($wcEmailSettings);
110 }
111 $discountTypes = $this->woocommerceHelper->wcGetCouponTypes();
112 $discountType = (string)current(array_keys($discountTypes));
113 $amountMax = strpos($discountType, 'percent') !== false ? 100 : null;
114 $woocommerceData = [
115 'email_headings' => $this->wcTransactionalEmails->getEmailHeadings(),
116 'customizer_enabled' => (bool)$this->settings->get('woocommerce.use_mailpoet_editor'),
117 'coupon' => [
118 'config' => [
119 'discount_types' => array_map(function($label, $value): array {
120 return ['label' => $label, 'value' => $value];
121 }, $discountTypes, array_keys($discountTypes)),
122 'code_placeholder' => Coupon::CODE_PLACEHOLDER,
123 'price_decimal_separator' => $this->woocommerceHelper->wcGetPriceDecimalSeparator(),
124 ],
125 'defaults' => [
126 'code' => Coupon::CODE_PLACEHOLDER,
127 'discountType' => $discountType,
128 'amountMax' => $amountMax,
129 ],
130 ],
131 ];
132 $woocommerceData = array_merge($wcEmailSettings, $woocommerceData);
133 }
134
135 // Check if newsletter is a confirmation email type (includes per-list confirmation emails)
136 $newsletter = $newsletterId ? $this->newslettersRepository->findOneById($newsletterId) : null;
137 $isConfirmationEmailType = $newsletter && $newsletter->getType() === NewsletterEntity::TYPE_CONFIRMATION_EMAIL_CUSTOMIZER;
138
139 $data = [
140 'customFontsEnabled' => $this->customFonts->displayCustomFonts(),
141 'shortcodes' => $this->shortcodesHelper->getShortcodes(),
142 'settings' => $this->settings->getAll(),
143 'editor_tutorial_seen' => $this->userFlags->get('editor_tutorial_seen'),
144 'current_wp_user' => array_merge($subscriberData, $this->wp->wpGetCurrentUser()->to_array()),
145 'woocommerce' => $woocommerceData,
146 'is_wc_transactional_email' => $newsletterId === $woocommerceTemplateId,
147 'is_confirmation_email_type' => $isConfirmationEmailType,
148 'is_confirmation_email_customizer_enabled' => (bool)$this->settings->get('signup_confirmation.use_mailpoet_editor', false),
149 'original_template_body' => $originalTemplateBody,
150 'product_categories' => $this->wpPostListLoader->getWooCommerceCategories(),
151 'products' => $this->wpPostListLoader->getProducts(),
152 'brand_styles' => [
153 'available' => $this->brandStyles->isAvailable(),
154 ],
155 'api' => [
156 'root' => rtrim($this->wp->escUrlRaw($this->wp->restUrl()), '/'),
157 'nonce' => $this->wp->wpCreateNonce('wp_rest'),
158 ],
159 ];
160 $this->wp->wpEnqueueMedia();
161 $this->wp->wpEnqueueStyle('editor', $this->wp->includesUrl('css/editor.css'));
162 $this->pageRenderer->displayPage('newsletter/editor.html', $data);
163 }
164
165 private function formatSubscriber(SubscriberEntity $subscriber): array {
166 return [
167 'id' => $subscriber->getId(),
168 'wp_user_id' => $subscriber->getWpUserId(),
169 'is_woocommerce_user' => (string)$subscriber->getIsWoocommerceUser(), // BC compatibility
170 'first_name' => $subscriber->getFirstName(),
171 'last_name' => $subscriber->getLastName(),
172 'email' => $subscriber->getEmail(),
173 'status' => $subscriber->getStatus(),
174 'subscribed_ip' => $subscriber->getSubscribedIp(),
175 'confirmed_ip' => $subscriber->getConfirmedIp(),
176 'confirmed_at' => ($confirmedAt = $subscriber->getConfirmedAt()) ? $confirmedAt->format(self::DATE_FORMAT) : null,
177 'last_subscribed_at' => ($lastSubscribedAt = $subscriber->getLastSubscribedAt()) ? $lastSubscribedAt->format(self::DATE_FORMAT) : null,
178 'created_at' => ($createdAt = $subscriber->getCreatedAt()) ? $createdAt->format(self::DATE_FORMAT) : null,
179 'updated_at' => ($updatedAt = $subscriber->getUpdatedAt()) ? $updatedAt->format(self::DATE_FORMAT) : null,
180 'deleted_at' => ($deletedAt = $subscriber->getDeletedAt()) ? $deletedAt->format(self::DATE_FORMAT) : null,
181 'unconfirmed_data' => $subscriber->getUnconfirmedData(),
182 'source' => $subscriber->getSource(),
183 'count_confirmation' => $subscriber->getConfirmationsCount(),
184 'unsubscribe_token' => $subscriber->getUnsubscribeToken(),
185 'link_token' => $subscriber->getLinkToken(),
186 ];
187 }
188
189 private function setupImageSize(): void {
190 $this->wp->addFilter(
191 'image_size_names_choose',
192 function ($sizes): array {
193 return array_merge($sizes, [
194 'mailpoet_newsletter_max' => __('MailPoet Newsletter', 'mailpoet'),
195 ]);
196 }
197 );
198 }
199 }
200