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 / AdminPages / Pages / DynamicSegments.php
mailpoet / lib / AdminPages / Pages Last commit date
AbstractAutomationEmbed.php 5 months ago Automation.php 2 years ago AutomationAnalytics.php 2 months ago AutomationEditor.php 2 months ago AutomationFlowEmbed.php 5 months ago AutomationPreviewEmbed.php 2 months ago AutomationTemplates.php 2 years ago CustomFields.php 2 months ago DynamicSegments.php 2 months ago ExperimentalFeatures.php 3 years ago FormEditor.php 1 week ago Forms.php 2 months ago Help.php 2 months ago Homepage.php 2 years ago Landingpage.php 2 years ago Logs.php 1 month ago NewsletterEditor.php 2 months ago Newsletters.php 2 months ago Settings.php 5 months ago StaticSegments.php 2 months ago Subscribers.php 1 week ago SubscribersExport.php 3 years ago SubscribersImport.php 2 months ago Tags.php 2 months ago Upgrade.php 1 year ago WelcomeWizard.php 2 months ago WooCommerceSetup.php 2 months ago index.php 3 years ago
DynamicSegments.php
263 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\AdminPages\Pages;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\AdminPages\AssetsController;
9 use MailPoet\AdminPages\PageRenderer;
10 use MailPoet\API\JSON\ResponseBuilders\CustomFieldsResponseBuilder;
11 use MailPoet\Automation\Engine\Data\Automation;
12 use MailPoet\Automation\Engine\Storage\AutomationStorage;
13 use MailPoet\CustomFields\CustomFieldsRepository;
14 use MailPoet\Entities\DynamicSegmentFilterData;
15 use MailPoet\Entities\FormEntity;
16 use MailPoet\Entities\SegmentEntity;
17 use MailPoet\Form\FormsRepository;
18 use MailPoet\Newsletter\NewslettersRepository;
19 use MailPoet\Segments\SegmentDependencyValidator;
20 use MailPoet\Segments\SegmentsRepository;
21 use MailPoet\WooCommerce\Helper as WooCommerceHelper;
22 use MailPoet\WP\AutocompletePostListLoader as WPPostListLoader;
23 use MailPoet\WP\Functions as WPFunctions;
24 use MailPoetVendor\Doctrine\Common\Collections\Criteria;
25
26 class DynamicSegments {
27 /** @var AssetsController */
28 private $assetsController;
29
30 /** @var PageRenderer */
31 private $pageRenderer;
32
33 /** @var WPFunctions */
34 private $wp;
35
36 /** @var WooCommerceHelper */
37 private $woocommerceHelper;
38
39 /** @var WPPostListLoader */
40 private $wpPostListLoader;
41
42 /** @var SegmentDependencyValidator */
43 private $segmentDependencyValidator;
44
45 /** @var CustomFieldsRepository */
46 private $customFieldsRepository;
47
48 /** @var CustomFieldsResponseBuilder */
49 private $customFieldsResponseBuilder;
50
51 /** @var SegmentsRepository */
52 private $segmentsRepository;
53
54 /** @var NewslettersRepository */
55 private $newslettersRepository;
56
57 /** @var FormsRepository */
58 private $formsRepository;
59
60 /** @var AutomationStorage */
61 private $automationStorage;
62
63 public function __construct(
64 AssetsController $assetsController,
65 PageRenderer $pageRenderer,
66 WPFunctions $wp,
67 WooCommerceHelper $woocommerceHelper,
68 WPPostListLoader $wpPostListLoader,
69 CustomFieldsRepository $customFieldsRepository,
70 CustomFieldsResponseBuilder $customFieldsResponseBuilder,
71 SegmentDependencyValidator $segmentDependencyValidator,
72 SegmentsRepository $segmentsRepository,
73 NewslettersRepository $newslettersRepository,
74 FormsRepository $formsRepository,
75 AutomationStorage $automationStorage
76 ) {
77 $this->assetsController = $assetsController;
78 $this->pageRenderer = $pageRenderer;
79 $this->wp = $wp;
80 $this->woocommerceHelper = $woocommerceHelper;
81 $this->wpPostListLoader = $wpPostListLoader;
82 $this->segmentDependencyValidator = $segmentDependencyValidator;
83 $this->customFieldsRepository = $customFieldsRepository;
84 $this->customFieldsResponseBuilder = $customFieldsResponseBuilder;
85 $this->segmentsRepository = $segmentsRepository;
86 $this->newslettersRepository = $newslettersRepository;
87 $this->formsRepository = $formsRepository;
88 $this->automationStorage = $automationStorage;
89 }
90
91 /**
92 * @return void
93 */
94 public function render() {
95 $data = [];
96 $customFields = $this->customFieldsRepository->findBy(['deletedAt' => null], ['name' => 'asc']);
97 $data['custom_fields'] = $this->customFieldsResponseBuilder->buildBatch($customFields);
98
99 $wpRoles = $this->wp->getEditableRoles();
100 $data['wordpress_editable_roles_list'] = array_map(function($roleId, $role) {
101 return [
102 'role_id' => $roleId,
103 'role_name' => $role['name'],
104 ];
105 }, array_keys($wpRoles), $wpRoles);
106
107 $data['newsletters_list'] = $this->getNewslettersList();
108
109 $data['static_segments_list'] = [];
110 $criteria = new Criteria();
111 $criteria->where(Criteria::expr()->isNull('deletedAt'));
112 $criteria->andWhere(Criteria::expr()->neq('type', SegmentEntity::TYPE_DYNAMIC));
113 $criteria->orderBy(['name' => 'ASC']);
114 $segments = $this->segmentsRepository->matching($criteria);
115 foreach ($segments as $segment) {
116 $data['static_segments_list'][] = [
117 'id' => $segment->getId(),
118 'name' => $segment->getName(),
119 'type' => $segment->getType(),
120 'description' => $segment->getDescription(),
121 ];
122 }
123
124 $data['product_attributes'] = [];
125 if ($this->woocommerceHelper->isWooCommerceActive()) {
126 $productAttributes = $this->woocommerceHelper->wcGetAttributeTaxonomies();
127
128 foreach ($productAttributes as $attribute) {
129 $taxonomy = 'pa_' . $attribute->attribute_name;// phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
130 $attributeTerms = $this->wp->getTerms(
131 [
132 'taxonomy' => $taxonomy,
133 'hide_empty' => false,
134 ]
135 );
136
137 if ((!$attributeTerms instanceof \WP_Error) && !isset($attributeTerms['errors'])) {
138 $data['product_attributes'][$taxonomy] = [ // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
139 'id' => $attribute->attribute_id, // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
140 'label' => $attribute->attribute_label, // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
141 'terms' => $attributeTerms,
142 'taxonomy' => $taxonomy,
143 ];
144 }
145 }
146
147 // Fetch local attributes used for product variations
148 $data['local_product_attributes'] = [];
149 $localAttributes = $this->getLocalAttributesUsedInProductVariations();
150 foreach ($localAttributes as $localAttribute => $values) {
151 $data['local_product_attributes'][$localAttribute] = [
152 'name' => $localAttribute,
153 'values' => $values,
154 ];
155 }
156 }
157
158 $data['product_categories'] = $this->wpPostListLoader->getWooCommerceCategories();
159 $data['product_tags'] = $this->wpPostListLoader->getWooCommerceTags();
160
161 $data['products'] = $this->wpPostListLoader->getProducts();
162 $data['variable_products'] = $this->woocommerceHelper->isWooCommerceActive()
163 ? $this->wpPostListLoader->getVariableProducts()
164 : [];
165 $data['membership_plans'] = $this->wpPostListLoader->getMembershipPlans();
166 $data['subscription_products'] = $this->wpPostListLoader->getSubscriptionProducts();
167 $wcCountries = $this->woocommerceHelper->isWooCommerceActive() ? $this->woocommerceHelper->getAllowedCountries() : [];
168 $data['woocommerce_countries'] = array_map(function ($code, $name) {
169 return [
170 'name' => $name,
171 'code' => $code,
172 ];
173 }, array_keys($wcCountries), $wcCountries);
174 $data['can_use_woocommerce_memberships'] = $this->segmentDependencyValidator->canUseDynamicFilterType(
175 DynamicSegmentFilterData::TYPE_WOOCOMMERCE_MEMBERSHIP
176 );
177 $data['can_use_woocommerce_subscriptions'] = $this->segmentDependencyValidator->canUseDynamicFilterType(
178 DynamicSegmentFilterData::TYPE_WOOCOMMERCE_SUBSCRIPTION
179 );
180 $wooCurrencySymbol = $this->woocommerceHelper->isWooCommerceActive() ? $this->woocommerceHelper->getWoocommerceCurrencySymbol() : '';
181 $data['woocommerce_currency_symbol'] = html_entity_decode($wooCurrencySymbol, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401);
182 $data['signup_forms'] = array_map(function(FormEntity $form) {
183 return [
184 'id' => $form->getId(),
185 'name' => $form->getName(),
186 ];
187 }, $this->formsRepository->findAll());
188
189 $data['woocommerce_payment_methods'] = [];
190 $data['woocommerce_shipping_methods'] = [];
191
192 if ($this->woocommerceHelper->isWooCommerceActive()) {
193 $allGateways = $this->woocommerceHelper->getPaymentGateways()->payment_gateways();
194 $paymentMethods = [];
195 foreach ($allGateways as $gatewayId => $gateway) {
196 $paymentMethods[] = [
197 'id' => $gatewayId,
198 'name' => $gateway->get_method_title(),
199 ];
200 }
201 $data['woocommerce_payment_methods'] = $paymentMethods;
202
203 $data['woocommerce_shipping_methods'] = array_values($this->woocommerceHelper->getShippingMethodInstancesData());
204 }
205 $data['automations'] = array_map(function(Automation $automation) {
206 return [
207 'id' => (string)$automation->getId(),
208 'name' => $automation->getName(),
209 ];
210 }, $this->automationStorage->getAutomations());
211
212 $this->assetsController->setupDynamicSegmentsDependencies();
213 $this->assetsController->setupDataViewsDependencies();
214 $data['api'] = [
215 'root' => rtrim($this->wp->escUrlRaw($this->wp->restUrl()), '/'),
216 'nonce' => $this->wp->wpCreateNonce('wp_rest'),
217 ];
218 $this->pageRenderer->displayPage('segments/dynamic.html', $data);
219 }
220
221 private function getLocalAttributesUsedInProductVariations(): array {
222 $attributes = [];
223
224 if (!$this->woocommerceHelper->isWooCommerceActive()) {
225 return $attributes;
226 }
227 global $wpdb;
228
229 $results = $wpdb->get_results($wpdb->prepare("
230 SELECT DISTINCT pm.meta_key, pm.meta_value
231 FROM %i pm
232 INNER JOIN %i p ON pm.post_id = p.ID
233 WHERE pm.meta_key LIKE %s
234 AND p.post_type = 'product_variation'
235 GROUP BY pm.meta_key, pm.meta_value
236 ", $wpdb->postmeta, $wpdb->posts, 'attribute_%'), ARRAY_A);
237
238 foreach ($results as $result) {
239 $attribute = substr($result['meta_key'], 10);
240 if (!isset($attributes[$attribute])) {
241 $attributes[$attribute] = [];
242 }
243 $attributes[$attribute][] = $result['meta_value'];
244 }
245
246 return $attributes;
247 }
248
249 private function getNewslettersList(): array {
250 $result = [];
251 foreach ($this->newslettersRepository->getStandardAndAutomationNewsletterList() as $newsletter) {
252 $result[] = [
253 'id' => (string)$newsletter->getId(),
254 'subject' => $newsletter->getSubject(),
255 'name' => $newsletter->getCampaignNameOrSubject(),
256 'type' => $newsletter->getType(),
257 'sent_at' => ($sentAt = $newsletter->getSentAt()) ? $sentAt->format('Y-m-d H:i:s') : null,
258 ];
259 }
260 return $result;
261 }
262 }
263