PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 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 / PostEditorBlocks / WooCommerceBlocksIntegration.php
mailpoet / lib / PostEditorBlocks Last commit date
ManageSubscriptionBlock.php 1 month ago MarketingOptinBlock.php 2 years ago NewsletterBlock.php 2 months ago PostEditorBlock.php 1 month ago SubscriptionFormBlock.php 7 months ago WooCommerceBlocksIntegration.php 1 day ago index.php 3 years ago
WooCommerceBlocksIntegration.php
214 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\PostEditorBlocks;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use Automattic\WooCommerce\StoreApi\Schemas\ExtendSchema;
9 use Automattic\WooCommerce\StoreApi\Schemas\V1\CheckoutSchema;
10 use Automattic\WooCommerce\StoreApi\StoreApi;
11 use MailPoet\Config\Env;
12 use MailPoet\Entities\SubscriberEntity;
13 use MailPoet\Segments\WooCommerce as WooSegment;
14 use MailPoet\Settings\SettingsController;
15 use MailPoet\Subscribers\SubscribersRepository;
16 use MailPoet\Subscribers\TrackingConsentCapture;
17 use MailPoet\WooCommerce\Helper as WooHelper;
18 use MailPoet\WooCommerce\Subscription as WooCommerceSubscription;
19 use MailPoet\WP\Functions as WPFunctions;
20
21 class WooCommerceBlocksIntegration {
22 /** @var SettingsController */
23 private $settings;
24
25 /** @var WPFunctions */
26 private $wp;
27
28 /** @var WooCommerceSubscription */
29 private $woocommerceSubscription;
30
31 /** @var WooSegment */
32 private $wooSegment;
33
34 /** @var SubscribersRepository */
35 private $subscribersRepository;
36
37 /** @var WooHelper */
38 private $wooHelper;
39
40 /** @var TrackingConsentCapture */
41 private $trackingConsentCapture;
42
43 public function __construct(
44 WPFunctions $wp,
45 SettingsController $settings,
46 WooCommerceSubscription $woocommerceSubscription,
47 WooSegment $wooSegment,
48 SubscribersRepository $subscribersRepository,
49 WooHelper $wooHelper,
50 TrackingConsentCapture $trackingConsentCapture
51 ) {
52 $this->wp = $wp;
53 $this->settings = $settings;
54 $this->woocommerceSubscription = $woocommerceSubscription;
55 $this->wooSegment = $wooSegment;
56 $this->subscribersRepository = $subscribersRepository;
57 $this->wooHelper = $wooHelper;
58 $this->trackingConsentCapture = $trackingConsentCapture;
59 }
60
61 public function init() {
62 $this->wp->addAction(
63 'woocommerce_blocks_checkout_block_registration',
64 [$this, 'registerCheckoutFrontendBlocks'],
65 15 // Run after AutomateWoo hooks
66 );
67 $addDataAttributesToBlockHook = '__experimental_woocommerce_blocks_checkout_update_order_from_request';
68 $hooksVersionMatrix = [
69 '7.2.0' => 'woocommerce_store_api_checkout_update_order_from_request',
70 '6.3.0' => 'woocommerce_blocks_checkout_update_order_from_request',
71 ];
72 foreach ($hooksVersionMatrix as $version => $hook) {
73 if (!$this->wooHelper->isWooCommerceBlocksActive($version)) {
74 continue;
75 }
76
77 $addDataAttributesToBlockHook = $hook;
78 break;
79 }
80 $this->wp->addAction(
81 $addDataAttributesToBlockHook,
82 [$this, 'processCheckoutBlockOptin'],
83 5, // Run before AutomateWoo hooks
84 2
85 );
86 $this->wp->addFilter(
87 '__experimental_woocommerce_blocks_add_data_attributes_to_block',
88 [$this, 'addDataAttributesToBlock']
89 );
90 $block = $this->wp->registerBlockTypeFromMetadata(Env::$assetsPath . '/dist/js/marketing-optin-block');
91 // We need to force the script to load in the footer. register_block_type always adds the script to the header.
92 if ($block instanceof \WP_Block_Type && isset($block->editor_script) && $block->editor_script) { // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
93 $wpScripts = $this->wp->getWpScripts();
94 $wpScripts->add_data($block->editor_script, 'group', 1); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
95 }
96
97 $this->extendRestApi();
98 }
99
100 /**
101 * Load blocks in frontend with Checkout.
102 */
103 public function registerCheckoutFrontendBlocks($integration_registry) {
104 $integration_registry->register(new MarketingOptinBlock(
105 [
106 'defaultText' => $this->settings->get('woocommerce.optin_on_checkout.message', ''),
107 'optinEnabled' => $this->settings->get('woocommerce.optin_on_checkout.enabled', false),
108 'trackingConsentEnabled' => $this->trackingConsentCapture->isCaptureEnabled(),
109 'trackingConsentText' => $this->trackingConsentCapture->getCopy(
110 SubscriberEntity::TRACKING_CONSENT_METHOD_WOOCOMMERCE_CHECKOUT
111 ),
112 ],
113 $this->wp
114 ));
115
116 $this->unregisterAutomateWooCheckoutBlock($integration_registry);
117 }
118
119 public function unregisterAutomateWooCheckoutBlock($integration_registry) {
120 if (!$this->settings->get('woocommerce.optin_on_checkout.enabled', false)) {
121 return;
122 }
123
124 $blockName = 'automatewoo';
125
126 $isAutomateWooRegistered = $integration_registry->is_registered($blockName);
127 if ($isAutomateWooRegistered) {
128 $integration_registry->unregister($blockName);
129 }
130 }
131
132 public function addDataAttributesToBlock(array $blocks) {
133 $blocks[] = 'mailpoet/marketing-optin-block';
134 return $blocks;
135 }
136
137 public function extendRestApi() {
138 if (!$this->settings->get('woocommerce.optin_on_checkout.enabled', false)) {
139 return;
140 }
141
142 $extend = StoreApi::container()->get(ExtendSchema::class);
143 $extend->register_endpoint_data(
144 [
145 'endpoint' => CheckoutSchema::IDENTIFIER,
146 'namespace' => 'mailpoet',
147 'schema_callback' => function () {
148 return [
149 'optin' => [
150 'description' => __('Subscribe to marketing opt-in.', 'mailpoet'),
151 'type' => ['boolean', 'null'],
152 ],
153 // Deliberately a second field rather than part of 'optin': consent
154 // to open and click tracking may never be bundled with the
155 // marketing opt-in.
156 'tracking_consent' => [
157 'description' => __('Allow tracking of email opens and link clicks.', 'mailpoet'),
158 'type' => ['boolean', 'null'],
159 ],
160 ];
161 },
162 ]
163 );
164
165 $this->unregisterAutomateWooCheckoutApiEndpoint();
166 }
167
168 public function unregisterAutomateWooCheckoutApiEndpoint() {
169 $extend = StoreApi::container()->get(ExtendSchema::class);
170 $extend->register_endpoint_data(
171 [
172 'endpoint' => CheckoutSchema::IDENTIFIER,
173 'namespace' => 'automatewoo',
174 'schema_callback' => null,
175 ]
176 );
177 }
178
179 public function processCheckoutBlockOptin(\WC_Order $order, $request) {
180 $checkoutOptin = isset($request['extensions']['mailpoet']['optin']) ? (bool)$request['extensions']['mailpoet']['optin'] : false;
181 $trackingConsent = isset($request['extensions']['mailpoet']['tracking_consent'])
182 ? (bool)$request['extensions']['mailpoet']['tracking_consent']
183 : false;
184
185 // Emulate checkout opt-in triggering for AutomateWoo
186 if ($checkoutOptin) {
187 // Multi-dimensional array inside an ArrayAccess object
188 // cannot be modified directly, so an intermediate variable is used
189 $requestExtensions = $request['extensions'];
190 $requestExtensions['automatewoo']['optin'] = 'On';
191 $request['extensions'] = $requestExtensions;
192 }
193
194 if (!$order->get_billing_email()) {
195 return;
196 }
197
198 // Fetch existing woo subscriber and in case there is not any sync as guest
199 $email = $order->get_billing_email();
200 $subscriber = $this->subscribersRepository->findOneBy(['email' => $email, 'isWoocommerceUser' => true]);
201 if (!$subscriber instanceof SubscriberEntity) {
202 $this->wooSegment->synchronizeGuestCustomer($order->get_id());
203 $subscriber = $this->subscribersRepository->findOneBy(['email' => $email, 'isWoocommerceUser' => true]);
204 }
205
206 // Subscriber not found and guest sync failed
207 if (!$subscriber instanceof SubscriberEntity) {
208 return null;
209 }
210
211 $this->woocommerceSubscription->handleSubscriberOptin($subscriber, $checkoutOptin, $trackingConsent);
212 }
213 }
214