PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.14.8
Independent Analytics – WordPress Analytics Plugin v2.14.8
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Overview / WP_Options_Storage.php
independent-analytics / IAWP / Overview Last commit date
Modules 3 months ago Form_Field.php 5 months ago Form_Field_Option.php 1 year ago Module_Refresh_Job.php 1 year ago Overview.php 1 year ago WP_Options_Storage.php 9 months ago
WP_Options_Storage.php
124 lines
1 <?php
2
3 namespace IAWP\Overview;
4
5 use IAWPSCOPED\Illuminate\Support\Collection;
6 /**
7 * Storing an array of data in wp_options? Easily manipulate it with WP_Options_Storage!
8 * @internal
9 */
10 class WP_Options_Storage
11 {
12 private $option_name;
13 public function __construct(string $option_name)
14 {
15 $this->option_name = $option_name;
16 }
17 public function all() : array
18 {
19 return \get_option($this->option_name, []);
20 }
21 /**
22 * Find a record by its id.
23 *
24 * @param string|null $id
25 *
26 * @return array|null
27 */
28 public function find_by_id(?string $id) : ?array
29 {
30 if ($id === null) {
31 return null;
32 }
33 $records = \get_option($this->option_name, []);
34 return Collection::make($records)->first(function ($module) use($id) {
35 return $module['id'] === $id;
36 });
37 }
38 /**
39 * Check if a record exists.
40 *
41 * @param string $id
42 *
43 * @return bool
44 */
45 public function exists(?string $id) : bool
46 {
47 return $this->find_by_id($id) !== null;
48 }
49 /**
50 * Insert a record. If it contains an id that's already in use, the existing record will be
51 * completely replaced by the new one.
52 *
53 * @param array $attributes
54 *
55 * @return string Inserted records id
56 */
57 public function insert(array $attributes) : ?string
58 {
59 // TODO It needs to preserve the position if it's updating an existing record...
60 if (!\is_array($attributes)) {
61 return null;
62 }
63 if (!\array_key_exists('id', $attributes)) {
64 $attributes['id'] = $this->generate_id();
65 }
66 $match_found = \false;
67 $records = \get_option($this->option_name, []);
68 $new_records = Collection::make($records)->map(function ($record) use($attributes, &$match_found) {
69 // Replace the existing record, if any
70 if ($record['id'] === $attributes['id']) {
71 $match_found = \true;
72 return $attributes;
73 }
74 return $record;
75 });
76 if (!$match_found) {
77 $new_records->push($attributes);
78 }
79 \update_option($this->option_name, $new_records->all(), \false);
80 return $attributes['id'];
81 }
82 /**
83 * Delete a record by its id.
84 *
85 * @param string|null $id
86 *
87 * @return bool
88 */
89 public function delete(?string $id) : bool
90 {
91 if ($id === null) {
92 return \false;
93 }
94 $records = \get_option($this->option_name, []);
95 $new_records = Collection::make($records)->reject(function ($module) use($id) {
96 return $module['id'] === $id;
97 })->values()->all();
98 \update_option($this->option_name, $new_records, \false);
99 // Return true if a record was deleted
100 return \count($records) === \count($new_records) + 1;
101 }
102 public function generate_id() : string
103 {
104 return \bin2hex(\random_bytes(16));
105 }
106 /**
107 * Reorder the records
108 *
109 * @param string[] $ids
110 *
111 * @return void
112 */
113 public function set_order(array $ids) : void
114 {
115 $records = \get_option($this->option_name, []);
116 $sorted_records = Collection::make($records)->sort(function ($a, $b) use($ids) {
117 $a_index = \array_search($a['id'], $ids);
118 $b_index = \array_search($b['id'], $ids);
119 return $a_index <=> $b_index;
120 })->values()->all();
121 \update_option($this->option_name, $sorted_records, \false);
122 }
123 }
124