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 / Newsletter / Url.php
mailpoet / lib / Newsletter Last commit date
Editor 2 months ago Embed 1 month ago Links 2 months ago Listing 9 months ago Options 2 years ago Preview 1 month ago Renderer 4 days ago RestApi 1 week ago Scheduler 4 days ago Segment 1 year ago Sending 1 week ago Sharing 1 month ago Shortcodes 3 days ago Statistics 1 week ago ViewInBrowser 1 month ago ApiDataSanitizer.php 3 years ago AutomatedLatestContent.php 2 months ago AutomaticEmailsRepository.php 3 years ago BlockPostQuery.php 2 months ago BulkActionController.php 1 month ago BulkActionException.php 1 month ago DynamicProducts.php 11 months ago NewsletterCoupon.php 2 months ago NewsletterDeleteController.php 2 years ago NewsletterHtmlSanitizer.php 2 years ago NewsletterPostsRepository.php 2 years ago NewsletterResendController.php 4 days ago NewsletterSaveController.php 1 month ago NewsletterValidator.php 1 year ago NewslettersRepository.php 2 weeks ago StatusController.php 1 month ago Url.php 2 months ago index.php 3 years ago
Url.php
142 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Newsletter;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Entities\NewsletterEntity;
9 use MailPoet\Entities\SendingQueueEntity;
10 use MailPoet\Entities\SubscriberEntity;
11 use MailPoet\Router\Endpoints\ViewInBrowser as ViewInBrowserEndpoint;
12 use MailPoet\Router\Router;
13 use MailPoet\Subscribers\LinkTokens;
14 use MailPoet\WP\Functions as WPFunctions;
15
16 class Url {
17 public const PUBLIC_SHARE_PATH = '/mailpoet-email/';
18
19 /** @var LinkTokens */
20 private $linkTokens;
21
22 /** @var WPFunctions */
23 private $wp;
24
25 public function __construct(
26 LinkTokens $linkTokens,
27 WPFunctions $wp
28 ) {
29 $this->linkTokens = $linkTokens;
30 $this->wp = $wp;
31 }
32
33 public function getViewInBrowserUrl(
34 ?NewsletterEntity $newsletter,
35 ?SubscriberEntity $subscriber = null,
36 ?SendingQueueEntity $queue = null,
37 bool $preview = true
38 ) {
39 $data = $this->createUrlDataObject($newsletter, $subscriber, $queue, $preview);
40 return Router::buildRequest(
41 ViewInBrowserEndpoint::ENDPOINT,
42 ViewInBrowserEndpoint::ACTION_VIEW,
43 $data
44 );
45 }
46
47 public function getPublicShareUrl(?NewsletterEntity $newsletter): string {
48 if (!$newsletter || !$newsletter->getHash()) {
49 return '';
50 }
51 $identifier = $this->getPublicShareIdentifier($newsletter);
52 if ($this->usesPrettyPermalinks()) {
53 return $this->wp->homeUrl($this->getPublicSharePathPrefix() . $identifier . '/');
54 }
55 return $this->wp->addQueryArg(
56 ['mailpoet_public_email' => $identifier],
57 $this->wp->homeUrl('/')
58 );
59 }
60
61 public function getPublicSharePathPrefix(): string {
62 /**
63 * Filters the URL path prefix used for the public share route.
64 *
65 * Useful when the default `/mailpoet-email/` slug collides with an
66 * existing page or you want to namespace it under another segment.
67 *
68 * @param string $prefix Default `/mailpoet-email/`.
69 */
70 $filtered = $this->wp->applyFilters('mailpoet_public_share_url_prefix', self::PUBLIC_SHARE_PATH);
71 $prefix = is_string($filtered) ? trim($filtered, '/') : '';
72 if ($prefix === '' || !preg_match('#^[a-zA-Z0-9_/-]+$#', $prefix)) {
73 $prefix = trim(self::PUBLIC_SHARE_PATH, '/');
74 }
75 return '/' . $prefix . '/';
76 }
77
78 public function getPublicShareIdentifier(NewsletterEntity $newsletter): string {
79 $hash = $newsletter->getHash();
80 return sprintf(
81 '%s-%s',
82 is_string($hash) ? $hash : '',
83 $this->getPublicShareSlug($newsletter)
84 );
85 }
86
87 public function getPublicShareSlug(NewsletterEntity $newsletter): string {
88 $slug = $this->wp->sanitizeTitle($newsletter->getCampaignNameOrSubject());
89 return $slug ?: 'email';
90 }
91
92 /**
93 * @return array{hash: string, slug: string|null}|null
94 */
95 public function parsePublicShareIdentifier(string $identifier): ?array {
96 if (!preg_match('/^(?P<hash>[0-9a-f]{12})(?:-(?P<slug>[^\/]+))?$/', $identifier, $matches)) {
97 return null;
98 }
99 return [
100 'hash' => $matches['hash'],
101 'slug' => $matches['slug'] ?? null,
102 ];
103 }
104
105 public function usesPrettyPermalinks(): bool {
106 return (string)$this->wp->getOption('permalink_structure', '') !== '';
107 }
108
109 public function createUrlDataObject(
110 ?NewsletterEntity $newsletter,
111 ?SubscriberEntity $subscriber,
112 ?SendingQueueEntity $queue,
113 bool $preview
114 ) {
115 $newsletterId = $newsletter && $newsletter->getId() ? $newsletter->getId() : 0;
116 $newsletterHash = $newsletter && $newsletter->getHash() ? $newsletter->getHash() : 0;
117 $sendingQueueId = $queue && $queue->getId() ? $queue->getId() : 0;
118
119 return [
120 $newsletterId,
121 $newsletterHash,
122 $subscriber && $subscriber->getId() ? $subscriber->getId() : 0,
123 $subscriber && $subscriber->getId() ? $this->linkTokens->getToken($subscriber) : 0,
124 $sendingQueueId,
125 (int)$preview,
126 ];
127 }
128
129 public function transformUrlDataObject($data) {
130 reset($data);
131 if (!is_int(key($data))) return $data;
132 $transformedData = [];
133 $transformedData['newsletter_id'] = (!empty($data[0])) ? $data[0] : false;
134 $transformedData['newsletter_hash'] = (!empty($data[1])) ? $data[1] : false;
135 $transformedData['subscriber_id'] = (!empty($data[2])) ? $data[2] : false;
136 $transformedData['subscriber_token'] = (!empty($data[3])) ? $data[3] : false;
137 $transformedData['queue_id'] = (!empty($data[4])) ? $data[4] : false;
138 $transformedData['preview'] = (!empty($data[5])) ? $data[5] : false;
139 return $transformedData;
140 }
141 }
142