PluginProbe ʕ •ᴥ•ʔ
Admin Columns / 7.1.4
Admin Columns v7.1.4
7.1.4 7.0.19 2.3.5 2.4 2.4.1 2.4.10 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.6.1 2.5.6.2 2.5.6.3 2.5.6.4 3.0 3.0.1 3.0.2 3.0.3 3.0.5 3.0.7 3.1 3.1.1 3.1.10 3.1.2 3.1.3 3.1.5 3.2.3 3.2.7 3.3.1 3.4.1 3.4.6 3.4.8 4.0.1 4.0.3 4.1.6 4.2.2 4.2.5 4.3 4.3.2 4.4.1 4.4.4 4.4.5 4.5.5 4.6.1 4.7.18 4.7.19 4.7.20 4.7.7 7.0.13 7.0.14 7.0.16 trunk 1.0 1.1 1.1.3 1.2 1.2.1 1.3 1.3.1 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.5.1 1.4.6 1.4.6.1 1.4.6.2 1.4.6.3 1.4.6.4 1.4.7 1.4.8 1.4.9 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2 2.2.1 2.2.1.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.5.1 2.2.6 2.2.6.1 2.2.6.2 2.2.6.3 2.2.6.4 2.2.7 2.2.8 2.2.8.1 2.2.9 2.3.1 2.3.2 2.3.3
codepress-admin-columns / classes / Plugin / Update / V7004.php
codepress-admin-columns / classes / Plugin / Update Last commit date
V4000.php 2 days ago V7000.php 2 days ago V7004.php 2 days ago
V7004.php
123 lines
1 <?php
2
3 declare(strict_types=1);
4
5 namespace AC\Plugin\Update;
6
7 use AC\Column\ColumnIdGenerator;
8 use AC\Plugin\Update;
9 use AC\Plugin\Version;
10
11 class V7004 extends Update
12 {
13 private ColumnIdGenerator $generator;
14
15 public function __construct(ColumnIdGenerator $generator)
16 {
17 parent::__construct(new Version('7.0.4'));
18
19 $this->generator = $generator;
20 }
21
22 public function apply_update(): void
23 {
24 // just in case we need a bit of extra time to execute our upgrade script
25 $max_exec = (int)ini_get('max_execution_time');
26 if ($max_exec > 0 && $max_exec < 120) {
27 @set_time_limit(120);
28 }
29
30 $this->update_database_column_name();
31 }
32
33 private function update_database_column_name(): void
34 {
35 global $wpdb;
36
37 $results = $wpdb->get_results(
38 "SELECT id, list_key, columns
39 FROM {$wpdb->prefix}admin_columns"
40 );
41
42 if (! $results) {
43 return;
44 }
45
46 foreach ($results as $row) {
47 $columns = $row->columns
48 ? unserialize($row->columns, ['allowed_classes' => false])
49 : [];
50
51 if (! $columns || ! is_array($columns)) {
52 continue;
53 }
54
55 $original_column_names = $this->get_original_column_names($row->list_key);
56
57 $update = false;
58
59 foreach ($columns as $key => $settings) {
60 $type = $settings['type'] ?? null;
61
62 if (null === $type) {
63 continue;
64 }
65
66 // Fix 1. original columns must have the same 'name' as their 'type' argument
67 if (in_array($type, $original_column_names, true)) {
68 $columns[$key]['name'] = $type;
69 $update = true;
70 continue;
71 }
72
73 // Fix 2: 'name' argument must be present. use 'key' as 'name'.
74 if (! isset($settings['name'])) {
75 $columns[$key]['name'] = is_numeric($key) && ((int)$key) < 1000
76 ? (string)$this->generator->generate()
77 : $key;
78
79 $update = true;
80 }
81 }
82
83 // Fix 3: the stored array should not be associative.
84 if ($this->is_associative_array($columns)) {
85 // reset keys
86 $columns = array_values($columns);
87 $update = true;
88 }
89
90 if ($update) {
91 $wpdb->query(
92 $wpdb->prepare(
93 "UPDATE {$wpdb->prefix}admin_columns SET columns = %s WHERE id = %d",
94 serialize($columns),
95 $row->id
96 )
97 );
98 }
99 }
100 }
101
102 private function is_associative_array(array $array): bool
103 {
104 return array_keys($array) !== range(0, count($array) - 1);
105 }
106
107 private function get_original_column_names(string $table_id): array
108 {
109 static $tables = [];
110
111 if (! isset($tables[$table_id])) {
112 $values = get_option('_ac_columns_default_' . $table_id);
113
114 $tables[$table_id] = $values && is_array($values)
115 ? array_keys($values)
116 : [];
117 }
118
119 return $tables[$table_id];
120 }
121
122 }
123