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