PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.0
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.0
4.11.0 4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Framework / Experiments / ExperimentManager.php
wp-staging / Framework / Experiments Last commit date
Experiment.php 1 day ago ExperimentManager.php 1 day ago ExperimentsRegistry.php 1 day ago
ExperimentManager.php
161 lines
1 <?php
2
3 namespace WPStaging\Framework\Experiments;
4
5
6
7
8
9
10
11
12
13 class ExperimentManager
14 {
15
16 const OPTION_ASSIGNMENTS = 'wpstg_experiments';
17
18
19 private $registry;
20
21
22 private $assignments = null;
23
24 public function __construct(ExperimentsRegistry $registry)
25 {
26 $this->registry = $registry;
27 }
28
29
30
31
32
33
34
35
36
37
38 public function getVariant(string $experimentId): string
39 {
40 $assigned = $this->getAssignedVariant($experimentId);
41 if ($assigned !== '') {
42 return $assigned;
43 }
44
45 $experiment = $this->registry->get($experimentId);
46 if ($experiment === null || !$experiment->isRunning()) {
47 return '';
48 }
49
50 return $this->assign($experiment);
51 }
52
53
54
55
56
57
58
59 public function getAssignedVariant(string $experimentId): string
60 {
61 $assignments = $this->getAssignments();
62 if (!isset($assignments[$experimentId])) {
63 return '';
64 }
65
66 $experiment = $this->registry->get($experimentId);
67 if ($experiment === null || !$experiment->hasVariant($assignments[$experimentId])) {
68 return '';
69 }
70
71 return $assignments[$experimentId];
72 }
73
74 public function isVariant(string $experimentId, string $variant): bool
75 {
76 return $this->getAssignedVariant($experimentId) === $variant;
77 }
78
79
80
81
82
83
84
85
86
87
88
89 public function getAttribution(): array
90 {
91 foreach ($this->registry->all() as $experiment) {
92 $variant = $this->getAssignedVariant($experiment->getId());
93 if ($variant === '') {
94 continue;
95 }
96
97 return [
98 'experiment' => $experiment->getId(),
99 'variant' => $variant,
100 ];
101 }
102
103 return [];
104 }
105
106
107
108
109 public function reset()
110 {
111 $this->assignments = null;
112 delete_option(self::OPTION_ASSIGNMENTS);
113 }
114
115 private function assign(Experiment $experiment): string
116 {
117
118
119 $variants = $experiment->getVariants();
120 $variant = $variants[wp_rand(0, count($variants) - 1)];
121
122
123 if (add_option(self::OPTION_ASSIGNMENTS, [$experiment->getId() => $variant], '', false)) {
124 $this->assignments = [$experiment->getId() => $variant];
125
126 return $variant;
127 }
128
129 $this->assignments = null;
130
131 $assigned = $this->getAssignedVariant($experiment->getId());
132 if ($assigned !== '') {
133 return $assigned;
134 }
135
136 $assignments = $this->getAssignments();
137 $assignments[$experiment->getId()] = $variant;
138 update_option(self::OPTION_ASSIGNMENTS, $assignments, false);
139 $this->assignments = $assignments;
140
141 return $variant;
142 }
143
144 private function getAssignments(): array
145 {
146 if ($this->assignments !== null) {
147 return $this->assignments;
148 }
149
150 $assignments = get_option(self::OPTION_ASSIGNMENTS, []);
151
152 if (!is_array($assignments)) {
153 $assignments = [];
154 }
155
156 $this->assignments = array_filter($assignments, 'is_string');
157
158 return $this->assignments;
159 }
160 }
161