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 / BookingAutomationEmailPattern.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
BookingAutomationEmailPattern.php
278 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 * Booking automation email pattern.
14 */
15 class BookingAutomationEmailPattern extends Pattern {
16 public const VARIANT_ABANDONED_SPOT = 'abandoned-spot';
17 public const VARIANT_NEW_BOOKING = 'new-booking';
18 public const VARIANT_PRE_VISIT_REMINDER = 'pre-visit-reminder';
19 public const VARIANT_PRE_VISIT_WHAT_TO_EXPECT = 'pre-visit-what-to-expect';
20 public const VARIANT_PRE_VISIT_TIPS = 'pre-visit-tips';
21 public const VARIANT_POST_VISIT_REVIEW = 'post-visit-review';
22 public const VARIANT_NEXT_BOOKING_NUDGE = 'next-booking-nudge';
23
24 protected $name = 'booking-abandoned-spot';
25 protected $block_types = ['core/post-content']; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
26 protected $template_types = ['email-template']; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
27 protected $categories = ['bookings'];
28 protected $post_types = [EmailEditor::MAILPOET_EMAIL_POST_TYPE]; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
29
30 /** @var string */
31 private $variant;
32
33 public function __construct(
34 CdnAssetUrl $cdnAssetUrl,
35 string $variant
36 ) {
37 parent::__construct($cdnAssetUrl);
38 $this->variant = $variant;
39
40 if ($variant === self::VARIANT_NEW_BOOKING) {
41 $this->name = 'booking-new-booking-follow-up';
42 } elseif ($variant === self::VARIANT_PRE_VISIT_REMINDER) {
43 $this->name = 'booking-pre-visit-reminder';
44 } elseif ($variant === self::VARIANT_PRE_VISIT_WHAT_TO_EXPECT) {
45 $this->name = 'booking-pre-visit-what-to-expect';
46 } elseif ($variant === self::VARIANT_PRE_VISIT_TIPS) {
47 $this->name = 'booking-pre-visit-tips';
48 } elseif ($variant === self::VARIANT_POST_VISIT_REVIEW) {
49 $this->name = 'booking-post-visit-review';
50 } elseif ($variant === self::VARIANT_NEXT_BOOKING_NUDGE) {
51 $this->name = 'booking-next-booking-nudge';
52 }
53 }
54
55 protected function get_content(): string { // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
56 if ($this->variant === self::VARIANT_NEW_BOOKING) {
57 return $this->buildContent(
58 __('Your booking is confirmed', 'mailpoet'),
59 [
60 sprintf(
61 /* translators: %s: Subscriber first name personalization tag */
62 __('Hi %s, your booking is confirmed. We’re looking forward to seeing you.', 'mailpoet'),
63 $this->getSubscriberFirstNameTag()
64 ),
65 sprintf(
66 /* translators: %s: WooCommerce booking product name personalization tag */
67 __('You booked %s. Keep this email handy so the details are easy to find.', 'mailpoet'),
68 '<!--[mailpoet/woocommerce-booking-product-name]-->'
69 ),
70 $this->getBookingDetailsCopy(),
71 __('If anything changes or you have questions before your visit, reply to this email and we’ll help.', 'mailpoet'),
72 ],
73 __('Visit our site', 'mailpoet'),
74 __('See you soon,', 'mailpoet')
75 );
76 }
77
78 if ($this->variant === self::VARIANT_PRE_VISIT_REMINDER) {
79 return $this->buildContent(
80 __('Your booking is coming up', 'mailpoet'),
81 [
82 sprintf(
83 /* translators: %s: Subscriber first name personalization tag */
84 __('Hi %s, this is a friendly reminder about your upcoming booking.', 'mailpoet'),
85 $this->getSubscriberFirstNameTag()
86 ),
87 $this->getBookingDetailsCopy(),
88 __('Please arrive a few minutes early so we can get everything started on time. Reply to this email if you need to make a change.', 'mailpoet'),
89 ],
90 __('Visit our site', 'mailpoet'),
91 __('We’ll see you soon,', 'mailpoet')
92 );
93 }
94
95 if ($this->variant === self::VARIANT_PRE_VISIT_WHAT_TO_EXPECT) {
96 return $this->buildContent(
97 __('What to expect at your booking', 'mailpoet'),
98 [
99 sprintf(
100 /* translators: 1: Subscriber first name personalization tag, 2: WooCommerce booking product name personalization tag */
101 __('Hi %1$s, here are a few details for your upcoming %2$s booking.', 'mailpoet'),
102 $this->getSubscriberFirstNameTag(),
103 '<!--[mailpoet/woocommerce-booking-product-name]-->'
104 ),
105 $this->getBookingDetailsCopy(),
106 __('Please arrive a few minutes early and bring anything you need for the visit. If you have questions, reply to this email before your appointment.', 'mailpoet'),
107 ],
108 __('View our site', 'mailpoet'),
109 __('See you soon,', 'mailpoet')
110 );
111 }
112
113 if ($this->variant === self::VARIANT_PRE_VISIT_TIPS) {
114 return $this->buildContent(
115 __('Make the most of your booking', 'mailpoet'),
116 [
117 sprintf(
118 /* translators: 1: Subscriber first name personalization tag, 2: WooCommerce booking product name personalization tag */
119 __('Hi %1$s, your %2$s booking is coming up soon. A little preparation can help you get the most out of it.', 'mailpoet'),
120 $this->getSubscriberFirstNameTag(),
121 '<!--[mailpoet/woocommerce-booking-product-name]-->'
122 ),
123 $this->getBookingDetailsCopy(),
124 __('Review the details, plan enough time before and after your visit, and reply to this email if there is anything we should know ahead of time.', 'mailpoet'),
125 ],
126 __('Review details', 'mailpoet'),
127 __('We’ll see you soon,', 'mailpoet')
128 );
129 }
130
131 if ($this->variant === self::VARIANT_POST_VISIT_REVIEW) {
132 return $this->buildContent(
133 __('How was your booking?', 'mailpoet'),
134 [
135 sprintf(
136 /* translators: 1: Subscriber first name personalization tag, 2: WooCommerce booking product name personalization tag */
137 __('Hi %1$s, thanks for joining us for %2$s. We hope everything went smoothly.', 'mailpoet'),
138 $this->getSubscriberFirstNameTag(),
139 '<!--[mailpoet/woocommerce-booking-product-name]-->'
140 ),
141 $this->getBookingDetailsCopy(),
142 __('Your feedback helps us improve future bookings. Send us a quick note or visit our site to leave feedback.', 'mailpoet'),
143 ],
144 __('Leave feedback', 'mailpoet'),
145 __('Thank you,', 'mailpoet')
146 );
147 }
148
149 if ($this->variant === self::VARIANT_NEXT_BOOKING_NUDGE) {
150 return $this->buildContent(
151 __('Ready for your next booking?', 'mailpoet'),
152 [
153 sprintf(
154 /* translators: 1: Subscriber first name personalization tag, 2: WooCommerce booking product name personalization tag */
155 __('Hi %1$s, it’s been a little while since your %2$s booking, and we’d love to welcome you back.', 'mailpoet'),
156 $this->getSubscriberFirstNameTag(),
157 '<!--[mailpoet/woocommerce-booking-product-name]-->'
158 ),
159 sprintf(
160 /* translators: %s: WooCommerce booking start date personalization tag */
161 __('Last time, you joined us on %s. We hope it was time well spent.', 'mailpoet'),
162 '<!--[mailpoet/woocommerce-booking-start-date]-->'
163 ),
164 __('Whenever you’re ready for your next visit, we’ll be glad to have you. Just reply to this email if you’d like a hand picking a time.', 'mailpoet'),
165 ],
166 __('Book again', 'mailpoet'),
167 __('Hope to see you soon,', 'mailpoet')
168 );
169 }
170
171 return $this->buildContent(
172 __('Your booking spot is waiting', 'mailpoet'),
173 [
174 sprintf(
175 /* translators: %s: Subscriber first name personalization tag */
176 __('Hi %s, it looks like you started a booking but did not finish reserving your spot.', 'mailpoet'),
177 $this->getSubscriberFirstNameTag()
178 ),
179 sprintf(
180 /* translators: %s: WooCommerce booking product name personalization tag */
181 __('If you still want to book %s, come back and complete your reservation while availability is still open.', 'mailpoet'),
182 '<!--[mailpoet/woocommerce-booking-product-name]-->'
183 ),
184 __('Booking availability can change quickly, so finishing sooner gives you the best chance of keeping the time you selected.', 'mailpoet'),
185 ],
186 __('Return to our site', 'mailpoet'),
187 __('Hope to see you soon,', 'mailpoet')
188 );
189 }
190
191 protected function get_title(): string { // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
192 if ($this->variant === self::VARIANT_NEW_BOOKING) {
193 return __('Booking Confirmation Follow-up', 'mailpoet');
194 }
195
196 if ($this->variant === self::VARIANT_PRE_VISIT_REMINDER) {
197 return __('Booking Pre-visit Reminder', 'mailpoet');
198 }
199
200 if ($this->variant === self::VARIANT_PRE_VISIT_WHAT_TO_EXPECT) {
201 return __('Booking Preparation', 'mailpoet');
202 }
203
204 if ($this->variant === self::VARIANT_PRE_VISIT_TIPS) {
205 return __('Booking Tips', 'mailpoet');
206 }
207
208 if ($this->variant === self::VARIANT_POST_VISIT_REVIEW) {
209 return __('Booking Review Request', 'mailpoet');
210 }
211
212 if ($this->variant === self::VARIANT_NEXT_BOOKING_NUDGE) {
213 return __('Next Booking Nudge', 'mailpoet');
214 }
215
216 return __('Abandoned Booking Reminder', 'mailpoet');
217 }
218
219 /**
220 * @param string[] $paragraphs
221 */
222 private function buildContent(string $heading, array $paragraphs, string $buttonText, string $signoff): string {
223 $paragraphBlocks = '';
224 foreach ($paragraphs as $paragraph) {
225 $paragraphBlocks .= '
226 <!-- wp:paragraph {"style":{"typography":{"fontSize":"16px"},"spacing":{"padding":{"top":"0","bottom":"var:preset|spacing|30"}}}} -->
227 <p style="padding-top:0;padding-bottom:var(--wp--preset--spacing--30);font-size:16px">' . $paragraph . '</p>
228 <!-- /wp:paragraph -->';
229 }
230
231 return '
232 <!-- wp:group {"style":{"spacing":{"padding":{"right":"var:preset|spacing|40","left":"var:preset|spacing|40"}}},"layout":{"type":"constrained"}} -->
233 <div class="wp-block-group" style="padding-right:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)">
234 <!-- wp:heading {"level":1} -->
235 <h1 class="wp-block-heading">' . $heading . '</h1>
236 <!-- /wp:heading -->
237
238 ' . $paragraphBlocks . '
239
240 <!-- wp:buttons {"style":{"spacing":{"padding":{"bottom":"var:preset|spacing|30"}}},"layout":{"type":"flex","justifyContent":"left"}} -->
241 <div class="wp-block-buttons" style="padding-bottom:var(--wp--preset--spacing--30)">
242 <!-- 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"}}}} -->
243 <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>
244 <!-- /wp:button -->
245 </div>
246 <!-- /wp:buttons -->
247
248 <!-- wp:paragraph {"fontSize":"medium"} -->
249 <p class="has-medium-font-size">' . $signoff . '</p>
250 <!-- /wp:paragraph -->
251
252 <!-- wp:paragraph {"fontSize":"medium"} -->
253 <p class="has-medium-font-size">–<!--[woocommerce/site-title]--></p>
254 <!-- /wp:paragraph -->
255 </div>
256 <!-- /wp:group -->
257 ';
258 }
259
260 private function getBookingDetailsCopy(): string {
261 return sprintf(
262 /* translators: 1: WooCommerce booking start date tag, 2: WooCommerce booking end date tag, 3: WooCommerce booking persons count tag */
263 __('Details: starts %1$s, ends %2$s, for %3$s person(s).', 'mailpoet'),
264 '<!--[mailpoet/woocommerce-booking-start-date]-->',
265 '<!--[mailpoet/woocommerce-booking-end-date]-->',
266 '<!--[mailpoet/woocommerce-booking-persons-count]-->'
267 );
268 }
269
270 private function getSubscriberFirstNameTag(): string {
271 return sprintf(
272 '<!--[mailpoet/subscriber-firstname default="%s"]-->',
273 /* translators: Default placeholder used when no subscriber name is available in "Hi %s" */
274 esc_attr(_x('there', 'subscriber name placeholder', 'mailpoet'))
275 );
276 }
277 }
278