PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 7.9.6
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v7.9.6
8.0.5 8.0.4 8.0.3 8.0.1 8.0.2 8.0.0 7.9.9.7 7.9.9.6 7.9.9.5 7.9.9.4 7.9.9.3 7.9.9.2 7.9.9.1 7.9.9 7.9.8 7.9.7 7.9.6 7.9.5 7.9.4 7.9.3 7.9.2 7.9.1 7.9.0 7.8.9 7.8.8 All 47 releases
gamipress / includes / admin / upgrades / 1.2.8.php

1.2.8.php in GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI 7.9.6, at includes/admin/upgrades/1.2.8.php

557 lines 18.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * 1.2.8 Upgrades
4 *
5 * @package GamiPress\Admin\Upgrades\1.2.8
6 * @since 1.2.8
7 */
8 // Exit if accessed directly
9 if( !defined( 'ABSPATH' ) ) exit;
10
11 /**
12 * Return 1.2.8 as last required upgrade
13 *
14 * @return string
15 */
16 function gamipress_128_is_last_required_upgrade() {
17
18 return '1.2.8';
19
20 }
21 add_filter( 'gamipress_get_last_required_upgrade', 'gamipress_128_is_last_required_upgrade', 128 );
22
23 /**
24 * Process 1.2.8 upgrades
25 *
26 * @param string $stored_version
27 *
28 * @return string
29 */
30 function gamipress_128_upgrades( $stored_version ) {
31
32 // Already upgrade
33 if ( version_compare( $stored_version, '1.2.8', '>=' ) ) {
34 return $stored_version;
35 }
36
37 // Prevent run upgrade until database tables are created
38 if( ! gamipress_database_table_exists( GamiPress()->db->logs ) || ! gamipress_database_table_exists( GamiPress()->db->user_earnings ) ) {
39 return $stored_version;
40 }
41
42 // Check if there is something to migrate
43 $upgrade_check = gamipress_128_maybe_upgrade();
44
45 if( $upgrade_check === 0 ) {
46
47 // There is nothing to update, so upgrade
48 $stored_version = '1.2.8';
49
50 } else if( is_gamipress_upgrade_completed( 'migrate_user_earnings' ) && is_gamipress_upgrade_completed( 'migrate_logs' ) ) {
51
52 // Migrations are finished, so upgrade
53 $stored_version = '1.2.8';
54
55 }
56
57 return $stored_version;
58
59 }
60 add_filter( 'gamipress_process_upgrades', 'gamipress_128_upgrades', 128 );
61
62 /**
63 * 1.2.8 upgrades notices
64 */
65 function gamipress_128_upgrades_notices() {
66
67 // Bail if GamiPress is active network wide and we are not in main site
68 if( gamipress_is_network_wide_active() && ! is_main_site() ) {
69 return;
70 }
71
72 // Check user permissions
73 if ( ! current_user_can( gamipress_get_manager_capability() ) ) {
74 return;
75 }
76
77 // Already upgraded!
78 if( is_gamipress_upgraded_to( '1.2.8' ) ) {
79 return;
80 }
81
82 // Prevent run upgrade until database tables are created
83 if( ! gamipress_database_table_exists( GamiPress()->db->logs ) || ! gamipress_database_table_exists( GamiPress()->db->user_earnings ) ) {
84 return;
85 }
86
87 $running_upgrade = get_option( 'gamipress_running_upgrade' );
88
89 // Other upgrade already running
90 if( $running_upgrade && $running_upgrade !== '1.2.8' ) {
91 return;
92 }
93
94 if( ! is_gamipress_upgrade_completed( 'migrate_user_earnings' ) || ! is_gamipress_upgrade_completed( 'migrate_logs' ) ) :
95 ?>
96 <div id="gamipress-upgrade-notice" class="updated">
97
98 <?php if( $running_upgrade === '1.2.8' ) : ?>
99
100 <p>
101 <?php _e( 'Upgrading GamiPress database...', 'gamipress' ); ?>
102 </p>
103 <div class="gamipress-upgrade-progress" data-running-upgrade="1.2.8">
104 <div class="gamipress-upgrade-progress-bar" style="width: 0%;"></div>
105 </div>
106
107 <?php else : ?>
108
109 <p>
110 <?php _e( 'GamiPress needs to upgrade the database. <strong>Please backup your database before starting this upgrade.</strong> This upgrade routine will be making changes to the database that are not reversible.', 'gamipress' ); ?>
111 </p>
112 <p>
113 <a href="javascript:void(0);" onClick="jQuery(this).parent().next('p').slideToggle();" class="button"><?php _e( 'Learn more about this upgrade', 'gamipress' ); ?></a>
114 <a href="javascript:void(0);" onClick="gamipress_start_upgrade('1.2.8')" class="button button-primary"><?php _e( 'Start the upgrade', 'gamipress' ); ?></a>
115 </p>
116 <p style="display: none;">
117 <?php _e( '<strong>About this upgrade:</strong><br />This is a <strong><em>mandatory</em></strong> update that will migrate all user earnings and logs with their meta data to a new custom database table. This upgrade provides better performance and scalability.', 'gamipress' ); ?>
118 </p>
119
120 <?php endif; ?>
121
122 </div>
123 <?php
124 endif;
125
126 }
127 add_action( 'admin_notices', 'gamipress_128_upgrades_notices' );
128
129 /**
130 * Return the number of entries to upgrade
131 *
132 * @return int
133 */
134 function gamipress_128_upgrade_size() {
135
136 global $wpdb;
137
138 $upgrade_size = 0;
139
140 // Retrieve the count of users earnings to upgrade
141 if( ! is_gamipress_upgrade_completed( 'migrate_user_earnings' ) ) {
142
143 $users_count = $wpdb->get_var($wpdb->prepare(
144 "SELECT COUNT(*)
145 FROM $wpdb->usermeta AS u
146 WHERE u.meta_key = %s",
147 "_gamipress_achievements"
148 ));
149
150 $upgrade_size += absint($users_count);
151
152 }
153
154 // Retrieve the count of logs to upgrade
155 if( ! is_gamipress_upgrade_completed( 'migrate_logs' ) ) {
156
157 $posts = GamiPress()->db->posts;
158 $logs_meta = GamiPress()->db->logs_meta;
159
160 $logs_count = $wpdb->get_var( $wpdb->prepare(
161 "SELECT COUNT(*)
162 FROM {$posts} AS p
163 WHERE p.post_type = %s
164 AND ID NOT IN (
165 SELECT lm.meta_value FROM {$logs_meta} AS lm WHERE lm.meta_key = %s
166 )",
167 'gamipress-log',
168 '_gamipress_legacy_log_id'
169 ) );
170
171 $upgrade_size += absint( $logs_count );
172
173 }
174
175 return $upgrade_size;
176
177 }
178
179 /**
180 * Ajax function to meet the upgrade size
181 */
182 function gamipress_ajax_128_upgrade_info() {
183 // Security check, forces to die if not security passed
184 check_ajax_referer( 'gamipress_admin', 'nonce' );
185
186 // Already upgraded
187 if ( is_gamipress_upgraded_to( '1.2.8' ) ) {
188 wp_send_json_success( array( 'upgraded' => true ) );
189 }
190
191 $upgrade_size = gamipress_128_upgrade_size();
192
193 wp_send_json_success( array( 'total' => $upgrade_size ) );
194 }
195 add_action( 'wp_ajax_gamipress_128_upgrade_info', 'gamipress_ajax_128_upgrade_info' );
196
197 /**
198 * Ajax process of 1.2.8 upgrades
199 */
200 function gamipress_ajax_process_128_upgrade() {
201 // Security check, forces to die if not security passed
202 check_ajax_referer( 'gamipress_admin', 'nonce' );
203
204 global $wpdb;
205
206 $posts = GamiPress()->db->posts;
207 $logs = GamiPress()->db->logs;
208 $logs_meta = GamiPress()->db->logs_meta;
209
210 // Already upgraded
211 if ( is_gamipress_upgraded_to( '1.2.8' ) ) {
212 wp_send_json_success( array( 'upgraded' => true ) );
213 }
214
215 ignore_user_abort( true );
216 set_time_limit( 0 );
217
218 // Add option to meet that upgrade process has been started
219 update_option( 'gamipress_running_upgrade', '1.2.8' );
220
221 $current = isset( $_REQUEST['current'] ) ? absint( $_REQUEST['current'] ) : 0;
222
223 // ----------------------------
224 // User earnings migration
225 // ----------------------------
226 if( ! is_gamipress_upgrade_completed( 'migrate_user_earnings' ) ) {
227
228 // Migrate from user meta _gamipress_achievements to gamipress_user_earnings table
229 $ct_table = ct_setup_table( 'gamipress_user_earnings' );
230
231 // Retrieve all user IDs with the meta _gamipress_achievements
232 $results = $wpdb->get_results( $wpdb->prepare(
233 "SELECT u.user_id, u.meta_value
234 FROM $wpdb->usermeta AS u
235 WHERE u.meta_key = %s",
236 '_gamipress_achievements'
237 ) );
238
239 foreach( $results as $result ) {
240
241 $user_id = $result->user_id;
242 $user_earnings = maybe_unserialize( $result->meta_value );
243
244 if( is_array( $user_earnings ) ) {
245
246 foreach( $user_earnings as $user_earning ) {
247
248 // Skip if not is a user earning
249 if( ! $user_earning || ! is_object( $user_earning ) ) {
250 continue;
251 }
252
253 $user_earnings_table = GamiPress()->db->user_earnings;
254
255 $exists = $wpdb->get_var( $wpdb->prepare(
256 "SELECT COUNT(*)
257 FROM {$user_earnings_table}
258 WHERE user_id = %d
259 AND post_id = %d
260 AND date = %s
261 LIMIT 1;",
262 absint( $user_id ),
263 absint( $user_earning->ID ),
264 date( 'Y-m-d H:i:s', $user_earning->date_earned )
265 ) );
266
267 // Skip if already exists
268 if( absint( $exists ) ) {
269 continue;
270 }
271
272
273 // Insert from the user _gamipress_achievements meta to gamipress_user_earnings table
274 $ct_table->db->insert( array(
275 'user_id' => $user_id,
276 'post_id' => $user_earning->ID,
277 'post_type' => $user_earning->post_type,
278 'points' => $user_earning->points,
279 'points_type' => $user_earning->points_type,
280 'date' => date( 'Y-m-d H:i:s', $user_earning->date_earned ),
281 ) );
282
283 }
284
285 }
286
287 $current++;
288 }
289
290 gamipress_set_upgrade_complete( 'migrate_user_earnings' );
291
292 }
293
294 // ----------------------------
295 // Logs migration
296 // ----------------------------
297 if( is_gamipress_upgrade_completed( 'migrate_user_earnings' ) && ! is_gamipress_upgrade_completed( 'migrate_logs' ) ) {
298
299 $ct_table = ct_setup_table( 'gamipress_logs' );
300 $prefix = '_gamipress_';
301
302 $limit = 50;
303
304 $logs = $wpdb->get_results( $wpdb->prepare(
305 "SELECT *
306 FROM {$posts}
307 WHERE post_type = %s
308 AND ID NOT IN (
309 SELECT lm.meta_value FROM {$logs_meta} AS lm WHERE lm.meta_key = %s
310 )
311 ORDER BY ID ASC
312 LIMIT %d;",
313 'gamipress-log',
314 $prefix . 'legacy_log_id',
315 $limit
316 ) );
317
318 foreach( $logs as $log ) {
319
320 $type = get_post_meta( $log->ID, $prefix . 'type', true );
321
322 $exists = $wpdb->get_var( $wpdb->prepare(
323 "SELECT COUNT(*)
324 FROM {$logs_meta}
325 WHERE ( meta_key = %s
326 AND meta_value = %s )
327 LIMIT 1;",
328 $prefix . 'legacy_log_id',
329 $log->ID
330 ) );
331
332 // Skip if already exists
333 if( absint( $exists ) ) {
334 continue;
335 }
336
337 // Insert from posts to gamipress_logs table
338 $log_id = $ct_table->db->insert( array(
339 'title' => $log->post_title,
340 'description' => $log->post_excerpt,
341 'type' => $type,
342 'access' => $log->post_status === 'publish' ? 'public' : 'private',
343 'user_id' => $log->post_author,
344 'date' => $log->post_date,
345 ) );
346
347 if( $log_id ) {
348
349 // Legacy Log ID
350 $ct_table->meta->db->insert( array(
351 'log_id' => $log_id,
352 'meta_key' => $prefix . 'legacy_log_id',
353 'meta_value' => $log->ID,
354 ) );
355
356 // Update log meta data based on type
357 if( $type === 'event_trigger' ) {
358
359 $trigger = get_post_meta( $log->ID, $prefix . 'trigger_type', true );
360
361 // Trigger Type
362 $ct_table->meta->db->insert( array(
363 'log_id' => $log_id,
364 'meta_key' => $prefix . 'trigger_type',
365 'meta_value' => $trigger,
366 ) );
367
368 // Count
369 $ct_table->meta->db->insert( array(
370 'log_id' => $log_id,
371 'meta_key' => $prefix . 'count',
372 'meta_value' => get_post_meta( $log->ID, $prefix . 'count', true ),
373 ) );
374
375 // If is a specific activity trigger, then add the achievement_post field
376 if( in_array( $trigger, array_keys( gamipress_get_specific_activity_triggers() ) ) ) {
377
378 // Achievement Attached Post ID
379 $ct_table->meta->db->insert( array(
380 'log_id' => $log_id,
381 'meta_key' => $prefix . 'achievement_post',
382 'meta_value' => get_post_meta( $log->ID, $prefix . 'achievement_post', true ),
383 ) );
384
385 }
386
387 // GamiPress Social Share support
388 $social_network = get_post_meta( $log->ID, $prefix . 'social_network', true );
389
390 if( $social_network ) {
391
392 $ct_table->meta->db->insert( array(
393 'log_id' => $log_id,
394 'meta_key' => $prefix . 'social_network',
395 'meta_value' => get_post_meta( $log->ID, $prefix . 'social_network', true ),
396 ) );
397
398 }
399
400 } else if( $type === 'achievement_earn' || $type === 'achievement_award' ) {
401
402 // Achievement ID
403 $ct_table->meta->db->insert( array(
404 'log_id' => $log_id,
405 'meta_key' => $prefix . 'achievement_id',
406 'meta_value' => get_post_meta( $log->ID, $prefix . 'achievement_id', true ),
407 ) );
408
409 } else if( $type === 'points_award' || $type === 'points_earn' ) {
410
411 // Points
412 $ct_table->meta->db->insert( array(
413 'log_id' => $log_id,
414 'meta_key' => $prefix . 'points',
415 'meta_value' => get_post_meta( $log->ID, $prefix . 'points', true ),
416 ) );
417
418 // Points Type
419 $ct_table->meta->db->insert( array(
420 'log_id' => $log_id,
421 'meta_key' => $prefix . 'points_type',
422 'meta_value' => get_post_meta( $log->ID, $prefix . 'points_type', true ),
423 ) );
424
425 // Total Points
426 $ct_table->meta->db->insert( array(
427 'log_id' => $log_id,
428 'meta_key' => $prefix . 'total_points',
429 'meta_value' => get_post_meta( $log->ID, $prefix . 'total_points', true ),
430 ) );
431
432 if( $type === 'points_award' ) {
433
434 // Admin ID
435 $ct_table->meta->db->insert( array(
436 'log_id' => $log_id,
437 'meta_key' => $prefix . 'admin_id',
438 'meta_value' => get_post_meta( $log->ID, $prefix . 'admin_id', true ),
439 ) );
440
441 }
442 }
443
444 $current++;
445 }
446
447 }
448
449 $logs_count = $wpdb->get_var( $wpdb->prepare(
450 "SELECT COUNT(*)
451 FROM {$posts} AS p
452 WHERE p.post_type = %s
453 AND ID NOT IN (
454 SELECT lm.meta_value FROM {$ct_table->meta->db->table_name} AS lm WHERE lm.meta_key = %s
455 )",
456 'gamipress-log',
457 '_gamipress_legacy_log_id'
458 ) );
459
460 if( absint( $logs_count ) === 0 ) {
461 gamipress_set_upgrade_complete( 'migrate_logs' );
462 }
463
464 }
465
466 // Successfully upgraded
467 if( is_gamipress_upgrade_completed( 'migrate_user_earnings' ) && is_gamipress_upgrade_completed( 'migrate_logs' ) ) {
468
469 // Last step, remove all old data
470 $wpdb->delete( $wpdb->usermeta, array(
471 'meta_key' => '_gamipress_achievements'
472 ) );
473
474 $wpdb->delete( $posts, array(
475 'post_type' => 'gamipress-log'
476 ) );
477
478 // Remove option to meet that upgrade process has been finished
479 delete_option( 'gamipress_running_upgrade' );
480
481 // Updated stored version
482 update_option( 'gamipress_version', '1.2.8' );
483
484 wp_send_json_success( array( 'upgraded' => true ) );
485 }
486
487 wp_send_json_success( array( 'current' => $current ) );
488
489 }
490 add_action( 'wp_ajax_gamipress_process_128_upgrade', 'gamipress_ajax_process_128_upgrade' );
491
492 function gamipress_ajax_stop_process_128_upgrade() {
493 // Security check, forces to die if not security passed
494 check_ajax_referer( 'gamipress_admin', 'nonce' );
495
496 $running_upgrade = get_option( 'gamipress_running_upgrade' );
497
498 // Check if is out upgrade
499 if( $running_upgrade === '1.2.8' ) {
500 delete_option( 'gamipress_running_upgrade' );
501 }
502
503 wp_send_json_success();
504 }
505 add_action( 'wp_ajax_gamipress_stop_process_128_upgrade', 'gamipress_ajax_stop_process_128_upgrade' );
506
507 /**
508 * Check if it is necessary upgrade
509 *
510 * @return int
511 */
512 function gamipress_128_maybe_upgrade() {
513
514 global $wpdb;
515
516 $upgrade_check = 0;
517
518 // Retrieve the count of users earnings to upgrade
519 if( ! is_gamipress_upgrade_completed( 'migrate_user_earnings' ) ) {
520
521 $users_count = $wpdb->get_var($wpdb->prepare(
522 "SELECT COUNT(*)
523 FROM $wpdb->usermeta AS u
524 WHERE u.meta_key = %s
525 LIMIT 1",
526 "_gamipress_achievements"
527 ));
528
529 $upgrade_check += absint($users_count);
530
531 }
532
533 // Retrieve the count of logs to upgrade
534 if( ! is_gamipress_upgrade_completed( 'migrate_logs' ) ) {
535
536 $posts = GamiPress()->db->posts;
537 $logs_meta = GamiPress()->db->logs_meta;
538
539 $logs_count = $wpdb->get_var( $wpdb->prepare(
540 "SELECT COUNT(*)
541 FROM {$posts} AS p
542 WHERE p.post_type = %s
543 AND ID NOT IN (
544 SELECT lm.meta_value FROM {$logs_meta} AS lm WHERE lm.meta_key = %s
545 )
546 LIMIT 1",
547 'gamipress-log',
548 '_gamipress_legacy_log_id'
549 ) );
550
551 $upgrade_check += absint( $logs_count );
552
553 }
554
555 return $upgrade_check;
556
557 }