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 / Segments / SegmentDependencyValidator.php
mailpoet / lib / Segments Last commit date
DynamicSegments 1 month ago RestApi 1 month ago SegmentDependencyValidator.php 3 years ago SegmentListingRepository.php 1 month ago SegmentSaveController.php 2 weeks ago SegmentSubscribersRepository.php 2 weeks ago SegmentsFinder.php 3 years ago SegmentsRepository.php 2 weeks ago SegmentsSimpleListRepository.php 2 months ago SubscribersFinder.php 1 month ago WP.php 2 weeks ago WooCommerce.php 2 weeks ago index.php 3 years ago
SegmentDependencyValidator.php
155 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Segments;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Entities\DynamicSegmentFilterData;
9 use MailPoet\Entities\DynamicSegmentFilterEntity;
10 use MailPoet\Entities\SegmentEntity;
11 use MailPoet\Segments\DynamicSegments\Filters\SubscriberTag;
12 use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
13 use MailPoet\WP\Functions as WPFunctions;
14 use MailPoetVendor\Doctrine\Common\Collections\Collection;
15
16 class SegmentDependencyValidator {
17 private const MAILPOET_PREMIUM_PLUGIN = [
18 'id' => 'mailpoet-premium/mailpoet-premium.php',
19 'name' => 'MailPoet Premium',
20 ];
21
22 private const WOOCOMMERCE_PLUGIN = [
23 'id' => 'woocommerce/woocommerce.php',
24 'name' => 'WooCommerce',
25 ];
26
27 private const WOOCOMMERCE_MEMBERSHIPS_PLUGIN = [
28 'id' => 'woocommerce-memberships/woocommerce-memberships.php',
29 'name' => 'WooCommerce Memberships',
30 ];
31
32 private const WOOCOMMERCE_SUBSCRIPTIONS_PLUGIN = [
33 'id' => 'woocommerce-subscriptions/woocommerce-subscriptions.php',
34 'name' => 'WooCommerce Subscriptions',
35 ];
36
37 private const REQUIRED_PLUGINS_BY_TYPE = [
38 DynamicSegmentFilterData::TYPE_WOOCOMMERCE => [
39 self::WOOCOMMERCE_PLUGIN,
40 ],
41 DynamicSegmentFilterData::TYPE_WOOCOMMERCE_MEMBERSHIP => [
42 self::WOOCOMMERCE_MEMBERSHIPS_PLUGIN,
43 self::WOOCOMMERCE_PLUGIN,
44 ],
45 DynamicSegmentFilterData::TYPE_WOOCOMMERCE_SUBSCRIPTION => [
46 self::WOOCOMMERCE_SUBSCRIPTIONS_PLUGIN,
47 self::WOOCOMMERCE_PLUGIN,
48 ],
49 ];
50
51 private const REQUIRED_PLUGINS_BY_TYPE_AND_ACTION = [
52 DynamicSegmentFilterData::TYPE_USER_ROLE => [
53 SubscriberTag::TYPE => [
54 self::MAILPOET_PREMIUM_PLUGIN,
55 ],
56 ],
57 ];
58
59 /** @var SubscribersFeature */
60 private $subscribersFeature;
61
62 /** @var WPFunctions */
63 private $wp;
64
65 public function __construct(
66 SubscribersFeature $subscribersFeature,
67 WPFunctions $wp
68 ) {
69 $this->subscribersFeature = $subscribersFeature;
70 $this->wp = $wp;
71 }
72
73 /**
74 * @return string[]
75 */
76 public function getMissingPluginsBySegment(SegmentEntity $segment): array {
77 $dynamicFilters = $segment->getDynamicFilters();
78 $missingPluginNames = $this->getMissingPluginsByAllFilters($dynamicFilters);
79 foreach ($dynamicFilters as $dynamicFilter) {
80 $missingPlugins = $this->getMissingPluginsByFilter($dynamicFilter);
81 if (!$missingPlugins) {
82 continue;
83 }
84 foreach ($missingPlugins as $plugin) {
85 $missingPluginNames[] = $plugin['name'];
86 }
87 }
88 return array_unique($missingPluginNames);
89 }
90
91 /**
92 * @param Collection<int, DynamicSegmentFilterEntity> $dynamicFilters
93 */
94 public function getMissingPluginsByAllFilters(Collection $dynamicFilters): array {
95 $missingPluginNames = [];
96 if (
97 count($dynamicFilters) > 1
98 && (!$this->wp->isPluginActive(self::MAILPOET_PREMIUM_PLUGIN['id'])
99 || !$this->subscribersFeature->hasValidPremiumKey()
100 || $this->subscribersFeature->check())
101 ) {
102 $missingPluginNames[] = self::MAILPOET_PREMIUM_PLUGIN['name'];
103 }
104 return $missingPluginNames;
105 }
106
107 public function getMissingPluginsByFilter(DynamicSegmentFilterEntity $dynamicSegmentFilter): array {
108 $config = $this->getRequiredPluginsConfig(
109 $dynamicSegmentFilter->getFilterData()->getFilterType() ?? '',
110 $dynamicSegmentFilter->getFilterData()->getAction()
111 );
112 return $this->getMissingPlugins($config);
113 }
114
115 public function canUseDynamicFilterType(string $type): bool {
116 $config = $this->getRequiredPluginsConfig($type);
117 return empty($this->getMissingPlugins($config));
118 }
119
120 private function getRequiredPluginsConfig(string $type, ?string $action = null): array {
121 $requiredPlugins = [];
122 if (isset(self::REQUIRED_PLUGINS_BY_TYPE[$type])) {
123 $requiredPlugins = self::REQUIRED_PLUGINS_BY_TYPE[$type];
124 }
125 if (isset(self::REQUIRED_PLUGINS_BY_TYPE_AND_ACTION[$type][$action])) {
126 $requiredPlugins = array_merge($requiredPlugins, self::REQUIRED_PLUGINS_BY_TYPE_AND_ACTION[$type][$action]);
127 }
128 return $requiredPlugins;
129 }
130
131 private function getMissingPlugins(array $config): array {
132 $missingPlugins = [];
133 foreach ($config as $requiredPlugin) {
134 if (isset($requiredPlugin['id']) && !$this->wp->isPluginActive($requiredPlugin['id'])) {
135 $missingPlugins[] = $requiredPlugin;
136 }
137 }
138 return $missingPlugins;
139 }
140
141 public function getCustomErrorMessage($missingPlugin) {
142 if (
143 $missingPlugin === self::MAILPOET_PREMIUM_PLUGIN['name']
144 && $this->wp->isPluginActive(self::MAILPOET_PREMIUM_PLUGIN['id'])
145 && (!$this->subscribersFeature->hasValidPremiumKey() || $this->subscribersFeature->check())
146 ) {
147 return [
148 'message' => __('Your current MailPoet plan does not support advanced segments. Please [link]upgrade to a MailPoet Premium plan[/link] to reactivate this segment.', 'mailpoet'),
149 'link' => 'https://account.mailpoet.com',
150 ];
151 }
152 return false;
153 }
154 }
155