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 / Automation / Integrations / MailPoet / Actions / AutomationSendEmailSubjectResolver.php
mailpoet / lib / Automation / Integrations / MailPoet / Actions Last commit date
AutomationSendEmailSubjectResolver.php 1 month ago SendEmailAction.php 1 month ago SendLatestNewsletterAction.php 2 months ago index.php 3 years ago
AutomationSendEmailSubjectResolver.php
161 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Automation\Integrations\MailPoet\Actions;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Automation\Engine\Control\SubjectTransformerHandler;
9 use MailPoet\Automation\Engine\Data\Automation;
10 use MailPoet\Automation\Engine\Data\Step;
11 use MailPoet\Automation\Engine\Registry;
12 use MailPoet\Entities\NewsletterEntity;
13 use MailPoet\Entities\NewsletterOptionFieldEntity;
14
15 class AutomationSendEmailSubjectResolver {
16 private Registry $registry;
17 private SubjectTransformerHandler $subjectTransformerHandler;
18
19 public function __construct(
20 Registry $registry,
21 SubjectTransformerHandler $subjectTransformerHandler
22 ) {
23 $this->registry = $registry;
24 $this->subjectTransformerHandler = $subjectTransformerHandler;
25 }
26
27 /** @return string[] */
28 public function getGuaranteedSubjectKeysForStep(Automation $automation, Step $sendEmailStep): array {
29 if ($sendEmailStep->getKey() !== SendEmailAction::KEY) {
30 return [];
31 }
32
33 $triggerSteps = $this->getTriggerStepsReachingStep($automation, $sendEmailStep);
34 if ($triggerSteps === []) {
35 return [];
36 }
37
38 return $this->intersectTriggerSubjectKeys($triggerSteps);
39 }
40
41 /** @return string[] */
42 public function getGuaranteedSubjectKeysForEmail(Automation $automation, NewsletterEntity $newsletter): array {
43 $exactStep = $this->getExactSendEmailStep($automation, $newsletter);
44 if ($exactStep) {
45 return $this->getGuaranteedSubjectKeysForStep($automation, $exactStep);
46 }
47
48 $steps = $this->getSendEmailStepsReferencingNewsletter($automation, $newsletter);
49 if ($steps === []) {
50 return [];
51 }
52
53 $subjectKeySets = array_map(function (Step $step) use ($automation): array {
54 return $this->getGuaranteedSubjectKeysForStep($automation, $step);
55 }, $steps);
56
57 return $this->intersectSubjectKeySets($subjectKeySets);
58 }
59
60 public function hasGuaranteedSubjectForEmail(Automation $automation, NewsletterEntity $newsletter, string $subjectKey): bool {
61 return in_array($subjectKey, $this->getGuaranteedSubjectKeysForEmail($automation, $newsletter), true);
62 }
63
64 /** @return Step[] */
65 private function getTriggerStepsReachingStep(Automation $automation, Step $targetStep): array {
66 $triggerSteps = [];
67 foreach ($automation->getTriggers() as $triggerStep) {
68 if ($this->stepCanReachStep($automation, $triggerStep, $targetStep)) {
69 $triggerSteps[] = $triggerStep;
70 }
71 }
72 return $triggerSteps;
73 }
74
75 private function stepCanReachStep(Automation $automation, Step $fromStep, Step $toStep): bool {
76 $steps = $automation->getSteps();
77 $stack = [$fromStep->getId()];
78 $visited = [];
79
80 while ($stack !== []) {
81 $stepId = array_pop($stack);
82 if (!is_string($stepId) || isset($visited[$stepId])) {
83 continue;
84 }
85 $visited[$stepId] = true;
86
87 if ($stepId === $toStep->getId()) {
88 return true;
89 }
90
91 $step = $steps[$stepId] ?? null;
92 if (!$step instanceof Step) {
93 continue;
94 }
95
96 foreach ($step->getNextStepIds() as $nextStepId) {
97 $stack[] = $nextStepId;
98 }
99 }
100
101 return false;
102 }
103
104 /** @param Step[] $triggerSteps */
105 private function intersectTriggerSubjectKeys(array $triggerSteps): array {
106 $subjectKeySets = [];
107 foreach ($triggerSteps as $triggerStep) {
108 $trigger = $this->registry->getTrigger($triggerStep->getKey());
109 if (!$trigger) {
110 return [];
111 }
112 $subjectKeySets[] = $this->subjectTransformerHandler->getSubjectKeysForTrigger($trigger);
113 }
114
115 return $this->intersectSubjectKeySets($subjectKeySets);
116 }
117
118 /** @param array<int, string[]> $subjectKeySets */
119 private function intersectSubjectKeySets(array $subjectKeySets): array {
120 if ($subjectKeySets === []) {
121 return [];
122 }
123
124 $subjectKeys = array_shift($subjectKeySets);
125 foreach ($subjectKeySets as $nextSubjectKeys) {
126 $subjectKeys = array_values(array_intersect($subjectKeys, $nextSubjectKeys));
127 }
128 $subjectKeys = array_values(array_unique($subjectKeys));
129 sort($subjectKeys);
130 return $subjectKeys;
131 }
132
133 private function getExactSendEmailStep(Automation $automation, NewsletterEntity $newsletter): ?Step {
134 $stepId = $newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_AUTOMATION_STEP_ID);
135 if (!is_string($stepId) || $stepId === '') {
136 return null;
137 }
138
139 $step = $automation->getStep($stepId);
140 return $step instanceof Step && $step->getKey() === SendEmailAction::KEY ? $step : null;
141 }
142
143 /** @return Step[] */
144 private function getSendEmailStepsReferencingNewsletter(Automation $automation, NewsletterEntity $newsletter): array {
145 $newsletterId = $newsletter->getId();
146 $wpPostId = $newsletter->getWpPostId();
147
148 return array_values(array_filter($automation->getSteps(), function (Step $step) use ($newsletterId, $wpPostId): bool {
149 if ($step->getKey() !== SendEmailAction::KEY) {
150 return false;
151 }
152
153 $args = $step->getArgs();
154 $emailId = $args['email_id'] ?? null;
155 $emailWpPostId = $args['email_wp_post_id'] ?? null;
156 return ($newsletterId !== null && (int)$emailId === (int)$newsletterId)
157 || ($wpPostId !== null && (int)$emailWpPostId === (int)$wpPostId);
158 }));
159 }
160 }
161