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 / EmailEditor / Integrations / MailPoet / Patterns / Library / SubscriptionAutomationEmailPattern.php
mailpoet / lib / EmailEditor / Integrations / MailPoet / Patterns / Library Last commit date
AbandonedCartPattern.php 4 months ago AbandonedCartReminderPattern.php 1 month ago AbandonedCartWithDiscountPattern.php 1 month ago AbstractAbandonedCartPattern.php 5 months ago AskForReviewPostPurchasePattern.php 1 month ago BirthdayEmailPattern.php 1 month ago BookingAutomationEmailPattern.php 1 month ago CategoryPurchaseFollowUpPattern.php 1 month ago EducationalCampaignPattern.php 1 month ago EventInvitationPattern.php 3 months ago FirstPurchaseThankYouPattern.php 1 month ago NewArrivalsAnnouncementPattern.php 3 months ago NewProductsAnnouncementPattern.php 3 months ago NewsletterPattern.php 4 months ago PostPurchaseThankYouPattern.php 1 month ago ProductPurchaseFollowUpPattern.php 1 month ago ProductRestockNotificationPattern.php 5 months ago SaleAnnouncementPattern.php 3 months ago SubscriptionAutomationEmailPattern.php 1 month ago TagPurchaseFollowUpPattern.php 1 month ago WelcomeEmailPattern.php 1 month ago WelcomeWithDiscountEmailPattern.php 1 month ago WinBackCustomerPattern.php 1 month ago index.php 1 year ago
SubscriptionAutomationEmailPattern.php
251 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\EmailEditor\Integrations\MailPoet\Patterns\Library;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\EmailEditor\Integrations\MailPoet\EmailEditor;
9 use MailPoet\EmailEditor\Integrations\MailPoet\Patterns\Pattern;
10 use MailPoet\Util\CdnAssetUrl;
11
12 /**
13 * Subscription automation email pattern.
14 */
15 class SubscriptionAutomationEmailPattern extends Pattern {
16 public const VARIANT_PURCHASE = 'purchase';
17 public const VARIANT_RENEWAL = 'renewal';
18 public const VARIANT_FAILED_RENEWAL = 'failed-renewal';
19 public const VARIANT_CHURNED = 'churned';
20 public const VARIANT_TRIAL_ENDED = 'trial-ended';
21 public const VARIANT_WIN_BACK = 'win-back';
22
23 protected $name = 'subscription-purchase-follow-up';
24 protected $block_types = ['core/post-content']; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
25 protected $template_types = ['email-template']; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
26 protected $categories = ['subscriptions'];
27 protected $post_types = [EmailEditor::MAILPOET_EMAIL_POST_TYPE]; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
28
29 /** @var string */
30 private $variant;
31
32 public function __construct(
33 CdnAssetUrl $cdnAssetUrl,
34 string $variant
35 ) {
36 parent::__construct($cdnAssetUrl);
37 $this->variant = $variant;
38
39 if ($variant === self::VARIANT_RENEWAL) {
40 $this->name = 'subscription-renewal-follow-up';
41 } elseif ($variant === self::VARIANT_FAILED_RENEWAL) {
42 $this->name = 'subscription-failed-renewal-follow-up';
43 } elseif ($variant === self::VARIANT_CHURNED) {
44 $this->name = 'subscription-churned-follow-up';
45 } elseif ($variant === self::VARIANT_TRIAL_ENDED) {
46 $this->name = 'subscription-trial-ended-follow-up';
47 } elseif ($variant === self::VARIANT_WIN_BACK) {
48 $this->name = 'subscription-win-back';
49 }
50 }
51
52 protected function get_content(): string { // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
53 if ($this->variant === self::VARIANT_RENEWAL) {
54 return $this->buildContent(
55 __('Your subscription renewed', 'mailpoet'),
56 [
57 sprintf(
58 /* translators: %s: Subscriber first name personalization tag */
59 __('Hi %s, your subscription has renewed successfully. Thanks for staying with us.', 'mailpoet'),
60 $this->getSubscriberFirstNameTag()
61 ),
62 sprintf(
63 /* translators: %s: WooCommerce subscription title personalization tag */
64 __('Your %s subscription is active for the new billing period, so there is nothing you need to do right now.', 'mailpoet'),
65 '<!--[mailpoet/woocommerce-subscription-title]-->'
66 ),
67 __('We’ll keep working to make every renewal worth it. If you have questions, reply to this email and we’ll help.', 'mailpoet'),
68 ],
69 __('Visit our site', 'mailpoet'),
70 __('Thanks for being with us,', 'mailpoet')
71 );
72 }
73
74 if ($this->variant === self::VARIANT_FAILED_RENEWAL) {
75 return $this->buildContent(
76 __('We couldn’t renew your subscription', 'mailpoet'),
77 [
78 sprintf(
79 /* translators: %s: Subscriber first name personalization tag */
80 __('Hi %s, we tried to renew your subscription but the payment did not go through.', 'mailpoet'),
81 $this->getSubscriberFirstNameTag()
82 ),
83 sprintf(
84 /* translators: %s: WooCommerce subscription title personalization tag */
85 __('To keep %s active, please sign in to your account and update your payment details.', 'mailpoet'),
86 '<!--[mailpoet/woocommerce-subscription-title]-->'
87 ),
88 __('If you already updated your details, you can ignore this message. If you need help, reply and we’ll take a look.', 'mailpoet'),
89 ],
90 __('Visit our site', 'mailpoet'),
91 __('We’re here to help,', 'mailpoet')
92 );
93 }
94
95 if ($this->variant === self::VARIANT_CHURNED) {
96 return $this->buildContent(
97 __('We’d value your feedback', 'mailpoet'),
98 [
99 sprintf(
100 /* translators: %s: Subscriber first name personalization tag */
101 __('Hi %s, we noticed your subscription has ended. We’re sorry to see you go.', 'mailpoet'),
102 $this->getSubscriberFirstNameTag()
103 ),
104 sprintf(
105 /* translators: %s: WooCommerce subscription title personalization tag */
106 __('If %s was not the right fit, we’d be grateful to know what would have made it better for you.', 'mailpoet'),
107 '<!--[mailpoet/woocommerce-subscription-title]-->'
108 ),
109 __('You can reply directly to this email. Every note helps us improve the experience for future subscribers.', 'mailpoet'),
110 ],
111 __('Visit our site', 'mailpoet'),
112 __('Thanks for your feedback,', 'mailpoet')
113 );
114 }
115
116 if ($this->variant === self::VARIANT_TRIAL_ENDED) {
117 return $this->buildContent(
118 __('Your trial has ended', 'mailpoet'),
119 [
120 sprintf(
121 /* translators: %s: Subscriber first name personalization tag */
122 __('Hi %s, thanks for trying us. We hope your trial gave you a useful look at what’s included.', 'mailpoet'),
123 $this->getSubscriberFirstNameTag()
124 ),
125 sprintf(
126 /* translators: %s: WooCommerce subscription title personalization tag */
127 __('If %s helped you, you can keep the benefits going from your account on our site.', 'mailpoet'),
128 '<!--[mailpoet/woocommerce-subscription-title]-->'
129 ),
130 __('Still deciding? Reply with any questions and we’ll help you choose the next step.', 'mailpoet'),
131 ],
132 __('Visit our site', 'mailpoet'),
133 __('Thanks for trying us,', 'mailpoet')
134 );
135 }
136
137 if ($this->variant === self::VARIANT_WIN_BACK) {
138 return $this->buildContent(
139 __('See what’s new', 'mailpoet'),
140 [
141 sprintf(
142 /* translators: %s: Subscriber first name personalization tag */
143 __('Hi %s, it’s been a while since your subscription ended, and we’d love to welcome you back.', 'mailpoet'),
144 $this->getSubscriberFirstNameTag()
145 ),
146 sprintf(
147 /* translators: %s: WooCommerce subscription title personalization tag */
148 __('We’ve been improving the experience around %s, with new reasons to give it another look.', 'mailpoet'),
149 '<!--[mailpoet/woocommerce-subscription-title]-->'
150 ),
151 __('When you’re ready, visit our site to see what’s changed and start again.', 'mailpoet'),
152 ],
153 __('Visit our site', 'mailpoet'),
154 __('Hope to see you again,', 'mailpoet')
155 );
156 }
157
158 return $this->buildContent(
159 __('Welcome to your subscription', 'mailpoet'),
160 [
161 sprintf(
162 /* translators: %s: Subscriber first name personalization tag */
163 __('Hi %s, thanks for subscribing. Your subscription is active, and we’re glad to have you with us.', 'mailpoet'),
164 $this->getSubscriberFirstNameTag()
165 ),
166 sprintf(
167 /* translators: %s: WooCommerce subscription title personalization tag */
168 __('You’re subscribed to %s. We’ll send you useful updates, renewal reminders, and anything you need to get the most from it.', 'mailpoet'),
169 '<!--[mailpoet/woocommerce-subscription-title]-->'
170 ),
171 __('You can review billing, renewals, and subscription details from your account on our site.', 'mailpoet'),
172 ],
173 __('Visit our site', 'mailpoet'),
174 __('Thanks for joining us,', 'mailpoet')
175 );
176 }
177
178 protected function get_title(): string { // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
179 if ($this->variant === self::VARIANT_RENEWAL) {
180 return __('Subscription Renewal Follow-up', 'mailpoet');
181 }
182
183 if ($this->variant === self::VARIANT_FAILED_RENEWAL) {
184 return __('Subscription Failed Renewal Follow-up', 'mailpoet');
185 }
186
187 if ($this->variant === self::VARIANT_CHURNED) {
188 return __('Subscription Churned Follow-up', 'mailpoet');
189 }
190
191 if ($this->variant === self::VARIANT_TRIAL_ENDED) {
192 return __('Subscription Trial Ended Follow-up', 'mailpoet');
193 }
194
195 if ($this->variant === self::VARIANT_WIN_BACK) {
196 return __('Subscription Win-back', 'mailpoet');
197 }
198
199 return __('Subscription Purchase Follow-up', 'mailpoet');
200 }
201
202 /**
203 * @param string[] $paragraphs
204 */
205 private function buildContent(string $heading, array $paragraphs, string $buttonText, string $signoff): string {
206 $paragraphBlocks = '';
207 foreach ($paragraphs as $paragraph) {
208 $paragraphBlocks .= '
209 <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"},"spacing":{"padding":{"top":"0","bottom":"var:preset|spacing|30"}}}} -->
210 <p style="padding-top:0;padding-bottom:var(--wp--preset--spacing--30);font-size:16px">' . $paragraph . '</p>
211 <!-- /wp:paragraph -->';
212 }
213
214 return '
215 <!-- wp:group {"style":{"spacing":{"padding":{"right":"var:preset|spacing|40","left":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
216 <div class="wp-block-group" style="padding-right:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)">
217 <!-- wp:heading {"level":1} -->
218 <h1 class="wp-block-heading">' . $heading . '</h1>
219 <!-- /wp:heading -->
220
221 ' . $paragraphBlocks . '
222
223 <!-- wp:buttons {"style":{"spacing":{"padding":{"bottom":"var:preset|spacing|30"}}},"layout":{"type":"flex","justifyContent":"left"}} -->
224 <div class="wp-block-buttons" style="padding-bottom:var(--wp--preset--spacing--30)">
225 <!-- wp:button {"style":{"typography":{"fontSize":"16px"},"spacing":{"padding":{"top":"var:preset|spacing|10","bottom":"var:preset|spacing|10","left":"var:preset|spacing|20","right":"var:preset|spacing|20"}}}} -->
226 <div class="wp-block-button"><a class="wp-block-button__link has-custom-font-size wp-element-button" style="padding-top:var(--wp--preset--spacing--10);padding-bottom:var(--wp--preset--spacing--10);padding-left:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);font-size:16px" href="[mailpoet/site-homepage-url]">' . $buttonText . '</a></div>
227 <!-- /wp:button -->
228 </div>
229 <!-- /wp:buttons -->
230
231 <!-- wp:paragraph {"fontSize":"medium"} -->
232 <p class="has-medium-font-size">' . $signoff . '</p>
233 <!-- /wp:paragraph -->
234
235 <!-- wp:paragraph {"fontSize":"medium"} -->
236 <p class="has-medium-font-size">–<!--[woocommerce/site-title]--></p>
237 <!-- /wp:paragraph -->
238 </div>
239 <!-- /wp:group -->
240 ';
241 }
242
243 private function getSubscriberFirstNameTag(): string {
244 return sprintf(
245 '<!--[mailpoet/subscriber-firstname default="%s"]-->',
246 /* translators: Default placeholder used when no subscriber name is available in "Hi %s" */
247 esc_attr(_x('there', 'subscriber name placeholder', 'mailpoet'))
248 );
249 }
250 }
251