PluginProbe ʕ •ᴥ•ʔ
Pods – Custom Content Types and Fields / 3.2.7
Pods – Custom Content Types and Fields v3.2.7
trunk 1.14.8 2.7.31.3 2.8.23.3 2.9.19.3 3.0.10.3 3.1.4.1 3.2.0 3.2.1 3.2.1.1 3.2.2 3.2.4 3.2.5 3.2.6 3.2.7 3.2.7.1 3.2.8 3.2.8.1 3.2.8.2 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9
pods / sql / upgrade / PodsUpgrade.php
pods / sql / upgrade Last commit date
PodsUpgrade.php 2 years ago PodsUpgrade_2_0_0.php 2 years ago PodsUpgrade_2_1_0.php 4 years ago
PodsUpgrade.php
315 lines
1 <?php
2
3 /**
4 * @package Pods\Upgrade
5 */
6 class PodsUpgrade {
7
8 /**
9 * @var array
10 */
11 public $tables = array();
12
13 /**
14 * @var array
15 */
16 protected $progress = array();
17
18 /**
19 * @var PodsAPI
20 */
21 protected $api = null;
22
23 /**
24 * @var string
25 */
26 protected $version = null;
27
28 /**
29 *
30 */
31 public function __construct() {
32 $this->api = pods_api();
33
34 $this->get_tables();
35 $this->get_progress();
36 }
37
38 /**
39 * @param null $_blog_id Blog ID to install.
40 */
41 public function install( $_blog_id = null ) {
42 /**
43 * @var $wpdb WPDB
44 */
45 global $wpdb;
46
47 // Switch DB table prefixes
48 if ( null !== $_blog_id && $_blog_id !== $wpdb->blogid ) {
49 switch_to_blog( pods_absint( $_blog_id ) );
50 } else {
51 $_blog_id = null;
52 }
53
54 $pods_version = get_option( 'pods_version' );
55
56 do_action( 'pods_install', PODS_VERSION, $pods_version, $_blog_id );
57
58 /**
59 * Allow filtering of whether the Pods SQL installation should be run. Return false to bypass.
60 *
61 * @param bool $run Whether the Pods SQL installation should be run.
62 */
63 $run = apply_filters( 'pods_install_run', true, PODS_VERSION, $pods_version, $_blog_id );
64
65 if ( false !== $run && ! pods_tableless() && 0 === (int) pods_v( 'pods_bypass_install' ) ) {
66 $sql = file_get_contents( PODS_DIR . 'sql/dump.sql' );
67 $sql = apply_filters( 'pods_install_sql', $sql, PODS_VERSION, $pods_version, $_blog_id );
68
69 $charset_collate = 'DEFAULT CHARSET utf8';
70
71 if ( ! empty( $wpdb->charset ) ) {
72 $charset_collate = "DEFAULT CHARSET {$wpdb->charset}";
73 }
74
75 if ( ! empty( $wpdb->collate ) ) {
76 $charset_collate .= " COLLATE {$wpdb->collate}";
77 }
78
79 if ( 'DEFAULT CHARSET utf8' !== $charset_collate ) {
80 $sql = str_replace( 'DEFAULT CHARSET utf8', $charset_collate, $sql );
81 }
82
83 $sql = explode( ";\n", str_replace( array( "\r", 'wp_' ), array( "\n", $wpdb->prefix ), $sql ) );
84 $sql = array_map( 'trim', $sql );
85 $sql = array_filter( $sql );
86
87 foreach ( $sql as $query ) {
88 pods_query( $query, 'Cannot setup SQL tables' );
89 }
90
91 // Auto activate component.
92 if ( ! PodsInit::$components ) {
93 if ( ! pods_light() ) {
94 PodsInit::$components = pods_components();
95 }
96 }
97
98 if ( PodsInit::$components ) {
99 PodsInit::$components->activate_component( 'templates' );
100 PodsInit::$components->activate_component( 'migrate-packages' );
101 }
102 }//end if
103
104 do_action( 'pods_install_post', PODS_VERSION, $pods_version, $_blog_id );
105 }
106
107 /**
108 * Handle dbDelta for Pods tables.
109 *
110 * @since 2.8.9
111 */
112 public function delta_tables() {
113 global $wpdb;
114
115 if ( pods_tableless() ) {
116 return;
117 }
118
119 $pods_version = get_option( 'pods_version' );
120
121 $sql = file_get_contents( PODS_DIR . 'sql/dump.sql' );
122 $sql = apply_filters( 'pods_install_sql', $sql, PODS_VERSION, $pods_version, get_current_blog_id() );
123
124 $charset_collate = 'DEFAULT CHARSET utf8';
125
126 if ( ! empty( $wpdb->charset ) ) {
127 $charset_collate = "DEFAULT CHARSET {$wpdb->charset}";
128 }
129
130 if ( ! empty( $wpdb->collate ) ) {
131 $charset_collate .= " COLLATE {$wpdb->collate}";
132 }
133
134 if ( 'DEFAULT CHARSET utf8' !== $charset_collate ) {
135 $sql = str_replace( 'DEFAULT CHARSET utf8', $charset_collate, $sql );
136 }
137
138 $sql = explode( ";\n", str_replace( array( "\r", 'wp_' ), array( "\n", $wpdb->prefix ), $sql ) );
139
140 // Remove empty lines and queries.
141 $sql = array_map( 'trim', $sql );
142 $sql = array_filter( $sql );
143
144 // dbDelta will handle what we need.
145 $sql = str_replace( 'CREATE TABLE IF NOT EXISTS', 'CREATE TABLE', $sql );
146
147 if ( empty( $sql ) ) {
148 return;
149 }
150
151 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
152
153 pods_debug( $sql );
154
155 pods_debug( dbDelta( $sql ) );
156 }
157
158 /**
159 *
160 */
161 public function get_tables() {
162 /**
163 * @var $wpdb WPDB
164 */
165 global $wpdb;
166
167 $tables = $wpdb->get_results( "SHOW TABLES LIKE '{$wpdb->prefix}pod%'", ARRAY_N );
168
169 if ( ! empty( $tables ) ) {
170 foreach ( $tables as $table ) {
171 $this->tables[] = $table[0];
172 }
173 }
174 }
175
176 /**
177 *
178 */
179 public function get_progress() {
180 $methods = get_class_methods( $this );
181
182 foreach ( $methods as $method ) {
183 if ( 0 === strpos( $method, 'migrate_' ) ) {
184 $this->progress[ str_replace( 'migrate_', '', $method ) ] = false;
185 }
186 }
187
188 if ( empty( $this->version ) ) {
189 return;
190 }
191
192 $progress = (array) get_option( 'pods_framework_upgrade_' . str_replace( '.', '_', $this->version ), [] );
193
194 if ( ! empty( $progress ) ) {
195 $this->progress = array_merge( $this->progress, $progress );
196 }
197 }
198
199 /**
200 * @param $params
201 *
202 * @return mixed|void
203 */
204 public function ajax( $params ) {
205 if ( ! isset( $params->step ) ) {
206 return pods_error( __( 'Invalid upgrade process.', 'pods' ) );
207 }
208
209 if ( ! isset( $params->type ) ) {
210 return pods_error( __( 'Invalid upgrade method.', 'pods' ) );
211 }
212
213 if ( ! method_exists( $this, $params->step . '_' . $params->type ) ) {
214 return pods_error( __( 'Upgrade method not found.', 'pods' ) );
215 }
216
217 return call_user_func( array( $this, $params->step . '_' . $params->type ), $params );
218 }
219
220 /**
221 * @param $method
222 * @param $v
223 * @param null $x
224 */
225 public function update_progress( $method, $v, $x = null ) {
226 if ( empty( $this->version ) ) {
227 return;
228 }
229
230 $method = str_replace( 'migrate_', '', $method );
231
232 if ( null !== $x ) {
233 $this->progress[ $method ][ $x ] = (boolean) $v;
234 } else {
235 $this->progress[ $method ] = $v;
236 }
237
238 update_option( 'pods_framework_upgrade_' . str_replace( '.', '_', $this->version ), $this->progress );
239 }
240
241 /**
242 * @param $method
243 * @param null $x
244 *
245 * @return bool
246 */
247 public function check_progress( $method, $x = null ) {
248 $method = str_replace( 'migrate_', '', $method );
249
250 if ( isset( $this->progress[ $method ] ) ) {
251 if ( null === $x ) {
252 return $this->progress[ $method ];
253 } elseif ( isset( $this->progress[ $method ][ $x ] ) ) {
254 return (boolean) $this->progress[ $method ][ $x ];
255 }
256 }
257
258 return false;
259 }
260
261 /**
262 *
263 */
264 public function upgraded() {
265 if ( empty( $this->version ) ) {
266 return;
267 }
268
269 $upgraded = get_option( 'pods_framework_upgraded' );
270
271 if ( empty( $upgraded ) || ! is_array( $upgraded ) ) {
272 $upgraded = array();
273 }
274
275 delete_option( 'pods_framework_upgrade_' . str_replace( '.', '_', $this->version ) );
276
277 if ( ! in_array( $this->version, $upgraded, true ) ) {
278 $upgraded[] = $this->version;
279 }
280
281 update_option( 'pods_framework_upgraded', $upgraded );
282 }
283
284 /**
285 *
286 */
287 public function cleanup() {
288 /**
289 * @var $wpdb WPDB
290 */
291 global $wpdb;
292
293 foreach ( $this->tables as $table ) {
294 if ( false !== strpos( $table, "{$wpdb->prefix}pod_" ) || "{$wpdb->prefix}pod" === $table ) {
295 pods_query( "DROP TABLE `{$table}`", false );
296 }
297 }
298
299 delete_option( 'pods_roles' );
300 delete_option( 'pods_version' );
301 delete_option( 'pods_framework_upgrade_2_0' );
302 delete_option( 'pods_framework_upgrade_2_0_sister_ids' );
303 delete_option( 'pods_framework_upgraded_1_x' );
304
305 delete_option( 'pods_disable_file_browser' );
306 delete_option( 'pods_files_require_login' );
307 delete_option( 'pods_files_require_login_cap' );
308 delete_option( 'pods_disable_file_upload' );
309 delete_option( 'pods_upload_require_login' );
310 delete_option( 'pods_upload_require_login_cap' );
311
312 pods_query( "DELETE FROM `@wp_postmeta` WHERE `meta_key` LIKE '_pods_1x_%'" );
313 }
314 }
315