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