PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.35.1
MailPoet – Newsletters, Email Marketing, and Automation v5.35.1
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 / Automation / Integrations / WooCommerce / Triggers / BuysAProductTrigger.php
mailpoet / lib / Automation / Integrations / WooCommerce / Triggers Last commit date
AbandonedCart 1 year ago Orders 3 months ago BuysAProductTrigger.php 2 years ago BuysFromACategoryTrigger.php 2 years ago BuysFromATagTrigger.php 1 year ago index.php 3 years ago
BuysAProductTrigger.php
159 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Automation\Integrations\WooCommerce\Triggers;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Automation\Engine\Control\FilterHandler;
9 use MailPoet\Automation\Engine\Data\Field;
10 use MailPoet\Automation\Engine\Data\Filter;
11 use MailPoet\Automation\Engine\Data\FilterGroup;
12 use MailPoet\Automation\Engine\Data\StepRunArgs;
13 use MailPoet\Automation\Engine\Data\StepValidationArgs;
14 use MailPoet\Automation\Engine\Data\Subject;
15 use MailPoet\Automation\Engine\Hooks;
16 use MailPoet\Automation\Engine\Integration\Trigger;
17 use MailPoet\Automation\Engine\Storage\AutomationRunStorage;
18 use MailPoet\Automation\Engine\WordPress;
19 use MailPoet\Automation\Integrations\Core\Filters\EnumArrayFilter;
20 use MailPoet\Automation\Integrations\Core\Filters\EnumFilter;
21 use MailPoet\Automation\Integrations\WooCommerce\Subjects\CustomerSubject;
22 use MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderStatusChangeSubject;
23 use MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderSubject;
24 use MailPoet\Validator\Builder;
25 use MailPoet\Validator\Schema\ObjectSchema;
26 use MailPoet\WooCommerce\Helper as WooCommerceHelper;
27
28 class BuysAProductTrigger implements Trigger {
29 public const KEY = 'woocommerce:buys-a-product';
30
31 /** @var WordPress */
32 private $wp;
33
34 /** @var WooCommerceHelper */
35 private $wc;
36
37 /** @var AutomationRunStorage */
38 private $automationRunStorage;
39
40 /** @var FilterHandler */
41 private $filterHandler;
42
43 public function __construct(
44 WordPress $wp,
45 WooCommerceHelper $wc,
46 AutomationRunStorage $automationRunStorage,
47 FilterHandler $filterHandler
48 ) {
49 $this->wp = $wp;
50 $this->wc = $wc;
51 $this->automationRunStorage = $automationRunStorage;
52 $this->filterHandler = $filterHandler;
53 }
54
55 public function getKey(): string {
56 return self::KEY;
57 }
58
59 public function getName(): string {
60 // translators: automation trigger title
61 return __('Customer buys a product', 'mailpoet');
62 }
63
64 public function getArgsSchema(): ObjectSchema {
65 return Builder::object([
66 'product_ids' => Builder::array(
67 Builder::integer()
68 )->minItems(1)->required(),
69 'to' => Builder::string()->required()->default('wc-completed'),
70 ]);
71 }
72
73 public function getSubjectKeys(): array {
74 return [
75 OrderSubject::KEY,
76 OrderStatusChangeSubject::KEY,
77 CustomerSubject::KEY,
78 ];
79 }
80
81 public function validate(StepValidationArgs $args): void {
82 }
83
84 public function registerHooks(): void {
85 $this->wp->addAction(
86 'woocommerce_order_status_changed',
87 [
88 $this,
89 'handle',
90 ],
91 10,
92 3
93 );
94 }
95
96 /**
97 * @param int $orderId
98 * @param string $from
99 * @param string $to
100 * @return void
101 */
102 public function handle($orderId, $from, $to): void {
103 $order = $this->wc->wcGetOrder($orderId);
104 if (!$order) {
105 return;
106 }
107 $this->wp->doAction(Hooks::TRIGGER, $this, [
108 new Subject(OrderSubject::KEY, ['order_id' => $orderId]),
109 new Subject(CustomerSubject::KEY, ['customer_id' => $order->get_customer_id(), 'order_id' => $orderId]),
110 new Subject(OrderStatusChangeSubject::KEY, ['from' => $from, 'to' => $to]),
111 ]);
112 }
113
114 public function isTriggeredBy(StepRunArgs $args): bool {
115
116 //Trigger the run only once.
117 $orderSubjectData = $args->getSingleSubjectEntryByClass(OrderSubject::class)->getSubjectData();
118 if ($this->automationRunStorage->getCountByAutomationAndSubject($args->getAutomation(), $orderSubjectData) > 0) {
119 return false;
120 }
121 $group = new FilterGroup(
122 '',
123 FilterGroup::OPERATOR_AND,
124 $this->getFilters($args)
125 );
126 return $this->filterHandler->matchesGroup($group, $args);
127 }
128
129 protected function getFilters(StepRunArgs $args): array {
130 $triggerArgs = $args->getStep()->getArgs();
131 $filters = [
132 Filter::fromArray([
133 'id' => '',
134 'field_type' => Field::TYPE_ENUM_ARRAY,
135 'field_key' => 'woocommerce:order:products',
136 'condition' => EnumArrayFilter::CONDITION_MATCHES_ANY_OF,
137 'args' => [
138 'value' => $triggerArgs['product_ids'] ?? [],
139 ],
140 ]),
141 ];
142 $status = str_replace('wc-', '', $triggerArgs['to'] ?? 'completed');
143 if ($status === 'any') {
144 return $filters;
145 }
146
147 $filters[] = Filter::fromArray([
148 'id' => '',
149 'field_type' => Field::TYPE_ENUM,
150 'field_key' => 'woocommerce:order:status',
151 'condition' => EnumFilter::IS_ANY_OF,
152 'args' => [
153 'value' => [$status],
154 ],
155 ]);
156 return $filters;
157 }
158 }
159