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 / Twig / Functions.php
mailpoet / lib / Twig Last commit date
Analytics.php 2 years ago Assets.php 1 year ago Filters.php 9 months ago Functions.php 3 months ago Handlebars.php 2 years ago I18n.php 2 months ago index.php 3 years ago
Functions.php
468 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Twig;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\DI\ContainerWrapper;
9 use MailPoet\Referrals\UrlDecorator;
10 use MailPoet\Settings\SettingsController;
11 use MailPoet\Util\FreeDomains;
12 use MailPoet\Util\Notices\PendingApprovalNotice;
13 use MailPoet\WooCommerce\Helper as WooCommerceHelper;
14 use MailPoet\WP\Functions as WPFunctions;
15 use MailPoet\WPCOM\DotcomHelperFunctions;
16 use MailPoetVendor\Carbon\Carbon;
17 use MailPoetVendor\Twig\Extension\AbstractExtension;
18 use MailPoetVendor\Twig\TwigFunction;
19
20 class Functions extends AbstractExtension {
21
22 /** @var SettingsController */
23 private $settings = null;
24
25 /** @var WooCommerceHelper */
26 private $woocommerceHelper = null;
27
28 /** @var WPFunctions */
29 private $wp = null;
30
31 /** @var UrlDecorator */
32 private $referralUrlDecorator = null;
33
34 /** @var PendingApprovalNotice */
35 private $pendingApprovalNotice = null;
36
37 private function getWooCommerceHelper(): WooCommerceHelper {
38 if ($this->woocommerceHelper === null) {
39 $this->woocommerceHelper = new WooCommerceHelper($this->getWp());
40 }
41 return $this->woocommerceHelper;
42 }
43
44 private function getreferralUrlDecorator(): UrlDecorator {
45 if ($this->referralUrlDecorator === null) {
46 $this->referralUrlDecorator = new UrlDecorator($this->getWp(), $this->getSettings());
47 }
48 return $this->referralUrlDecorator;
49 }
50
51 private function getSettings(): SettingsController {
52 if ($this->settings === null) {
53 $this->settings = SettingsController::getInstance();
54 }
55 return $this->settings;
56 }
57
58 private function getDotcomHelperFunctions(): DotcomHelperFunctions {
59 return ContainerWrapper::getInstance()->get(DotcomHelperFunctions::class);
60 }
61
62 private function getWp(): WPFunctions {
63 if ($this->wp === null) {
64 $this->wp = WPFunctions::get();
65 }
66 return $this->wp;
67 }
68
69 private function getPendingApprovalNotice(): PendingApprovalNotice {
70 if ($this->pendingApprovalNotice === null) {
71 $this->pendingApprovalNotice = ContainerWrapper::getInstance()->get(PendingApprovalNotice::class);
72 }
73 return $this->pendingApprovalNotice;
74 }
75
76 public function getFunctions() {
77 return [
78 new TwigFunction(
79 'json_encode',
80 [$this, 'jsonEncode'],
81 ['is_safe' => ['all']]
82 ),
83 new TwigFunction(
84 'json_decode',
85 'json_decode',
86 ['is_safe' => ['all']]
87 ),
88 new TwigFunction(
89 'wp_nonce_field',
90 'wp_nonce_field',
91 ['is_safe' => ['all']]
92 ),
93 new TwigFunction(
94 'params',
95 [$this, 'params'],
96 ['is_safe' => ['all']]
97 ),
98 new TwigFunction(
99 'admin_url',
100 'admin_url',
101 ['is_safe' => ['all']]
102 ),
103 new TwigFunction(
104 'get_option',
105 'get_option',
106 ['is_safe' => ['all']]
107 ),
108 new TwigFunction(
109 'sending_frequency',
110 [$this, 'getSendingFrequency'],
111 ['is_safe' => ['all']]
112 ),
113 new TwigFunction(
114 'wp_date_format',
115 [$this, 'getWPDateFormat'],
116 ['is_safe' => ['all']]
117 ),
118 new TwigFunction(
119 'mailpoet_version',
120 [$this, 'getMailPoetVersion'],
121 ['is_safe' => ['all']]
122 ),
123 new TwigFunction(
124 'mailpoet_premium_version',
125 [$this, 'getMailPoetPremiumVersion'],
126 ['is_safe' => ['all']]
127 ),
128 new TwigFunction(
129 'wp_date_format',
130 [$this, 'getWPDateFormat'],
131 ['is_safe' => ['all']]
132 ),
133 new TwigFunction(
134 'wp_time_format',
135 [$this, 'getWPTimeFormat'],
136 ['is_safe' => ['all']]
137 ),
138 new TwigFunction(
139 'wp_datetime_format',
140 [$this, 'getWPDateTimeFormat'],
141 ['is_safe' => ['all']]
142 ),
143 new TwigFunction(
144 'do_action',
145 'do_action',
146 ['is_safe' => ['all']]
147 ),
148 new TwigFunction(
149 'is_rtl',
150 [$this, 'isRtl'],
151 ['is_safe' => ['all']]
152 ),
153 new TwigFunction(
154 'number_format_i18n',
155 'number_format_i18n',
156 ['is_safe' => ['all']]
157 ),
158 new TwigFunction(
159 'mailpoet_locale',
160 [$this, 'getTwoLettersLocale'],
161 ['is_safe' => ['all']]
162 ),
163 new TwigFunction(
164 'mailpoet_free_domains',
165 [$this, 'getFreeDomains'],
166 ['is_safe' => ['all']]
167 ),
168 new TwigFunction(
169 'is_woocommerce_active',
170 [$this, 'isWoocommerceActive'],
171 ['is_safe' => ['all']]
172 ),
173 new TwigFunction(
174 'is_woocommerce_email_improvements_enabled',
175 [$this, 'isWoocommerceEmailImprovementsEnabled'],
176 ['is_safe' => ['all']]
177 ),
178 new TwigFunction(
179 'get_woocommerce_version',
180 [$this, 'getWooCommerceVersion'],
181 ['is_safe' => ['all']]
182 ),
183 new TwigFunction(
184 'wp_start_of_week',
185 [$this, 'getWPStartOfWeek'],
186 ['is_safe' => ['all']]
187 ),
188 new TwigFunction(
189 'stats_color',
190 [$this, 'statsColor'],
191 ['is_safe' => ['all']]
192 ),
193 new TwigFunction(
194 'clicked_stats_text',
195 [$this, 'clickedStatsText'],
196 ['is_safe' => ['all']]
197 ),
198 new TwigFunction(
199 'stats_number_format_i18n',
200 [$this, 'statsNumberFormatI18n'],
201 ['is_safe' => ['all']]
202 ),
203 new TwigFunction(
204 'clicked_stats_text_garden',
205 [$this, 'clickedStatsTextGarden'],
206 ['is_safe' => ['all']]
207 ),
208 new TwigFunction(
209 'clicked_stats_badge_color',
210 [$this, 'clickedStatsBadgeColor'],
211 ['is_safe' => ['all']]
212 ),
213 new TwigFunction(
214 'add_referral_id',
215 [$this, 'addReferralId'],
216 ['is_safe' => ['all']]
217 ),
218 new TwigFunction(
219 'is_loading_3rd_party_enabled',
220 [$this, 'libs3rdPartyEnabled'],
221 ['is_safe' => ['all']]
222 ),
223 new TwigFunction(
224 'is_dotcom_ecommerce_plan',
225 [$this, 'isDotcomEcommercePlan'],
226 ['is_safe' => ['all']]
227 ),
228 new TwigFunction(
229 'is_dotcom',
230 [$this, 'isDotcom'],
231 ['is_safe' => ['all']]
232 ),
233 new TwigFunction(
234 'is_garden',
235 [$this, 'isGarden'],
236 ['is_safe' => ['all']]
237 ),
238 new TwigFunction(
239 'pending_approval_message',
240 [$this, 'pendingApprovalMessage'],
241 ['is_safe' => ['html']]
242 ),
243 new TwigFunction(
244 'get_product_placeholder_img',
245 [$this, 'wcPlaceholderImgSrc'],
246 ['is_safe' => ['all']]
247 ),
248 new TwigFunction(
249 'get_wc_page_url',
250 [$this, 'wcPageUrl'],
251 ['is_safe' => ['all']]
252 ),
253 ];
254 }
255
256 public function getSendingFrequency() {
257 /** @var string[] $args */
258 $args = func_get_args();
259 $value = (int)array_shift($args);
260
261 $label = null;
262 $labels = [
263 'minute' => __('every minute', 'mailpoet'),
264 // translators: %1$d is the amount of minutes.
265 'minutes' => __('every %1$d minutes', 'mailpoet'),
266 'hour' => __('every hour', 'mailpoet'),
267 // translators: %1$d is the amount of hours.
268 'hours' => __('every %1$d hours', 'mailpoet'),
269 ];
270
271 if ($value >= 60) {
272 // we're dealing with hours
273 if ($value === 60) {
274 $label = $labels['hour'];
275 } else {
276 $label = $labels['hours'];
277 }
278 $value /= 60;
279 } else {
280 // we're dealing with minutes
281 if ($value === 1) {
282 $label = $labels['minute'];
283 } else {
284 $label = $labels['minutes'];
285 }
286 }
287
288 return sprintf($label, $value);
289 }
290
291 public function getWPDateFormat() {
292 return $this->getWp()->getOption('date_format') ?: 'F j, Y';
293 }
294
295 public function getWPStartOfWeek() {
296 return $this->getWp()->getOption('start_of_week') ?: 0;
297 }
298
299 public function getMailPoetVersion() {
300 return MAILPOET_VERSION;
301 }
302
303 public function getMailPoetPremiumVersion() {
304 return (defined('MAILPOET_PREMIUM_VERSION')) ? MAILPOET_PREMIUM_VERSION : false;
305 }
306
307 public function getWPTimeFormat() {
308 return $this->getWp()->getOption('time_format') ?: 'g:i a';
309 }
310
311 public function getWPDateTimeFormat() {
312 return sprintf('%s %s', $this->getWPDateFormat(), $this->getWPTimeFormat());
313 }
314
315 public function params($key = null) {
316 $args = $this->getWp()->stripslashesDeep($_GET);
317 if (array_key_exists($key, $args)) {
318 return $args[$key];
319 }
320 return null;
321 }
322
323 public function installedInLastTwoWeeks() {
324 $maxNumberOfWeeks = 2;
325 $installedAt = Carbon::createFromFormat('Y-m-d H:i:s', $this->getSettings()->get('installed_at'));
326 if ($installedAt === false) {
327 return false;
328 }
329 return $installedAt->diffInWeeks(Carbon::now()) < $maxNumberOfWeeks;
330 }
331
332 public function isRtl() {
333 return $this->getWp()->isRtl();
334 }
335
336 public function getTwoLettersLocale() {
337 return explode('_', $this->getWp()->getLocale())[0];
338 }
339
340 public function getFreeDomains() {
341 return FreeDomains::FREE_DOMAINS;
342 }
343
344 public function isWoocommerceActive() {
345 return $this->getWooCommerceHelper()->isWooCommerceActive();
346 }
347
348 public function isWoocommerceEmailImprovementsEnabled() {
349 return $this->getWooCommerceHelper()->isWooCommerceEmailImprovementsEnabled();
350 }
351
352 public function getWooCommerceVersion() {
353 return $this->getWooCommerceHelper()->getWooCommerceVersion();
354 }
355
356 public function statsColor($percentage) {
357 if ($percentage > 3) {
358 return '#7ed321';
359 } elseif ($percentage > 1) {
360 return '#ff9f00';
361 } else {
362 return '#f559c3';
363 }
364 }
365
366 public function clickedStatsText($clicked) {
367 if ($clicked > 3) {
368 return __('Excellent', 'mailpoet');
369 } elseif ($clicked > 1) {
370 return __('Good', 'mailpoet');
371 } else {
372 return __('Average', 'mailpoet');
373 }
374 }
375
376 public function clickedStatsTextGarden($clicked) {
377 if ($clicked > 3) {
378 return __('Excellent', 'mailpoet');
379 } elseif ($clicked > 1) {
380 return __('Good', 'mailpoet');
381 } elseif ($clicked > 0) {
382 return __('Average', 'mailpoet');
383 } else {
384 return __('Poor', 'mailpoet');
385 }
386 }
387
388 public function clickedStatsBadgeColor($clicked) {
389 if ($clicked > 3) {
390 return '#C6E1C6'; // Stable (green) — Excellent
391 } elseif ($clicked > 1) {
392 return '#B5D4EF'; // Informational (blue) — Good
393 } elseif ($clicked > 0) {
394 return '#DCDCDE'; // Draft (gray) — Average
395 } else {
396 return '#F5E6AB'; // Medium (yellow) — Poor
397 }
398 }
399
400 /**
401 * Wrapper around number_format_i18n() to return two decimals digits if the number
402 * is smaller than 0.1 and one decimal digit if the number is equal or greater
403 * than 0.1.
404 *
405 * @param int|float $number
406 *
407 * @return string
408 */
409 public function statsNumberFormatI18n($number) {
410 if ($number < 0.1) {
411 $decimals = 2;
412 } else {
413 $decimals = 1;
414 }
415
416 return number_format_i18n($number, $decimals);
417 }
418
419 public function addReferralId($url) {
420 return $this->getreferralUrlDecorator()->decorate($url);
421 }
422
423 public function libs3rdPartyEnabled(): bool {
424 return $this->getSettings()->get('3rd_party_libs.enabled') === '1';
425 }
426
427 public function isDotcomEcommercePlan(): bool {
428 if (function_exists('wc_calypso_bridge_is_ecommerce_plan')) {
429 return wc_calypso_bridge_is_ecommerce_plan();
430 }
431 return false;
432 }
433
434 public function isDotcom(): bool {
435 return $this->getDotcomHelperFunctions()->isDotcom();
436 }
437
438 public function isGarden(): bool {
439 return $this->getDotcomHelperFunctions()->isGarden();
440 }
441
442 public function pendingApprovalMessage(): string {
443 return $this->getPendingApprovalNotice()->getPendingApprovalMessage();
444 }
445
446 public function wcPlaceholderImgSrc(string $size = 'woocommerce_thumbnail'): string {
447 return esc_url($this->getWooCommerceHelper()->wcPlaceholderImgSrc($size));
448 }
449
450 public function wcPageUrl(string $page): string {
451 return esc_url($this->getWooCommerceHelper()->wcGetPagePermalink($page));
452 }
453
454 /**
455 * Safely encodes data to JSON for use in script tags.
456 * Always includes JSON_HEX_TAG to prevent breaking out of script context
457 * and JSON_UNESCAPED_SLASHES for better readability.
458 *
459 * @param mixed $data
460 * @param int $flags
461 * @return string|false
462 */
463 public function jsonEncode($data, $flags = 0) {
464 $flags = $flags | JSON_HEX_TAG | JSON_UNESCAPED_SLASHES;
465 return json_encode($data, $flags);
466 }
467 }
468