PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 7.9.9
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v7.9.9
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 / gamipress.php

gamipress.php in GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI 7.9.9, at gamipress.php

526 lines 15.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: GamiPress
4 * Plugin URI: https://gamipress.com
5 * Description: The most flexible and powerful gamification system for WordPress.
6 * Version: 7.9.9
7 * Author: GamiPress
8 * Author URI: https://gamipress.com/
9 * Text Domain: gamipress
10 * Domain Path: /languages/
11 * Requires PHP: 7.0
12 * Requires at least: 4.4
13 * Tested up to: 7.0
14 * License: GPLv3
15 *
16 * @package GamiPress
17 * @author GamiPress <[email protected]>, Ruben Garcia <[email protected]>
18 * @copyright Copyright (c) GamiPress
19 */
20
21 final class GamiPress {
22
23 /**
24 * @var GamiPress $instance The one true GamiPress
25 * @since 1.0.0
26 */
27 private static $instance;
28
29 /**
30 * @var array $settings GamiPress stored settings
31 * @since 1.0.2
32 */
33 public $settings = null;
34
35 /**
36 * @var array $points_types GamiPress registered points types
37 * @since 1.0.0
38 */
39 public $points_types = array();
40
41 /**
42 * @var array $achievement_types GamiPress registered achievement types
43 * @since 1.0.0
44 */
45 public $achievement_types = array();
46
47 /**
48 * @var array $achievement_types GamiPress registered rank types
49 * @since 1.3.1
50 */
51 public $rank_types = array();
52
53 /**
54 * @var array $requirement_types GamiPress registered requirement types
55 * @since 1.0.5
56 */
57 public $requirement_types = array();
58
59 /**
60 * @var array $activity_triggers GamiPress registered activity triggers
61 * @since 1.0.0
62 */
63 public $activity_triggers = array();
64
65 /**
66 * @var array $shortcodes GamiPress registered shortcodes
67 * @since 1.0.0
68 */
69 public $shortcodes = array();
70
71 /**
72 * @var GamiPress_Database $db GamiPress database object
73 * @since 1.4.0
74 */
75 public $db;
76
77 /**
78 * @var bool $db GamiPress network wide active mark
79 * @since 1.4.0
80 */
81 public $network_wide_active = null;
82
83 /**
84 * @var array $cache GamiPress cache class
85 * @since 1.4.0
86 */
87 public $cache = array();
88
89 /**
90 * Get active instance
91 *
92 * @access public
93 * @since 1.0.0
94 * @return GamiPress self::$instance The one true GamiPress
95 */
96 public static function instance() {
97
98 if( ! self::$instance ) {
99
100 self::$instance = new GamiPress();
101 self::$instance->constants();
102 self::$instance->libraries();
103 self::$instance->classes();
104 self::$instance->compatibility();
105 self::$instance->includes();
106 self::$instance->hooks();
107
108 }
109
110 return self::$instance;
111
112 }
113
114 /**
115 * Setup plugin constants
116 *
117 * @access private
118 * @since 1.0.0
119 * @return void
120 */
121 private function constants() {
122
123 // Plugin version
124 define( 'GAMIPRESS_VER', '7.9.9' );
125
126 // Plugin file
127 define( 'GAMIPRESS_FILE', __FILE__ );
128
129 // Plugin path
130 define( 'GAMIPRESS_DIR', plugin_dir_path( __FILE__ ) );
131
132 // Plugin URL
133 define( 'GAMIPRESS_URL', plugin_dir_url( __FILE__ ) );
134
135 // Credentials vars
136 define( 'GAMIPRESS_CRED_VAR', 'c' );
137 define( 'GAMIPRESS_CRED_KEY', '1991092202300020110720144557' );
138 define( 'GAMIPRESS_CRED_SALT', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' );
139
140 }
141
142 /**
143 * Include plugin libraries
144 *
145 * @access private
146 * @since 1.0.0
147 * @return void
148 */
149 private function libraries() {
150
151 // Custom Tables
152 require_once GAMIPRESS_DIR . 'libraries/ct/init.php';
153 require_once GAMIPRESS_DIR . 'libraries/ct-ajax-list-table/ct-ajax-list-table.php';
154
155 // CMB2
156 require_once GAMIPRESS_DIR . 'libraries/cmb2/init.php';
157 require_once GAMIPRESS_DIR . 'libraries/cmb2-metatabs-options/cmb2_metatabs_options.php';
158 require_once GAMIPRESS_DIR . 'libraries/cmb2-tabs/cmb2-tabs.php';
159 require_once GAMIPRESS_DIR . 'libraries/cmb2-field-tooltip/cmb2-field-tooltip.php';
160 require_once GAMIPRESS_DIR . 'libraries/cmb2-field-edd-license/cmb2-field-edd-license.php';
161 require_once GAMIPRESS_DIR . 'libraries/cmb2-conditional-fields/cmb2-conditional-fields.php';
162
163 // GamiPress CMB2 fields
164 require_once GAMIPRESS_DIR . 'libraries/advanced-select-field-type.php';
165 require_once GAMIPRESS_DIR . 'libraries/size-field-type.php';
166 require_once GAMIPRESS_DIR . 'libraries/display-field-type.php';
167 require_once GAMIPRESS_DIR . 'libraries/button-field-type.php';
168 require_once GAMIPRESS_DIR . 'libraries/html-field-type.php';
169 require_once GAMIPRESS_DIR . 'libraries/points-field-type.php';
170
171 }
172
173 /**
174 * Include plugin classes
175 *
176 * @access private
177 * @since 1.0.0
178 * @return void
179 */
180 private function classes() {
181
182 require_once GAMIPRESS_DIR . 'classes/database.php';
183 require_once GAMIPRESS_DIR . 'classes/badge-builder-icons.php';
184
185 }
186
187 /**
188 * Include compatibility files
189 *
190 * @access private
191 * @since 1.2.8
192 * @return void
193 */
194 private function compatibility() {
195
196 // WordPress backward compatibility
197 require_once GAMIPRESS_DIR . 'includes/compatibility/wordpress.php';
198
199 // GamiPress backward compatibility
200 require_once GAMIPRESS_DIR . 'includes/compatibility/1.2.8.php';
201 require_once GAMIPRESS_DIR . 'includes/compatibility/1.3.1.php';
202 require_once GAMIPRESS_DIR . 'includes/compatibility/1.4.3.php';
203 require_once GAMIPRESS_DIR . 'includes/compatibility/1.4.7.php';
204 require_once GAMIPRESS_DIR . 'includes/compatibility/1.5.0.php';
205 require_once GAMIPRESS_DIR . 'includes/compatibility/1.5.1.php';
206 require_once GAMIPRESS_DIR . 'includes/compatibility/1.6.5.php';
207 require_once GAMIPRESS_DIR . 'includes/compatibility/1.8.0.php';
208 require_once GAMIPRESS_DIR . 'includes/compatibility/1.8.6.php';
209 require_once GAMIPRESS_DIR . 'includes/compatibility/1.8.7.php';
210
211 }
212
213 /**
214 * Include plugin files
215 *
216 * @access private
217 * @since 1.0.0
218 * @return void
219 */
220 private function includes() {
221
222 // The rest of files
223 require_once GAMIPRESS_DIR . 'includes/admin.php';
224 require_once GAMIPRESS_DIR . 'includes/custom-tables.php';
225 require_once GAMIPRESS_DIR . 'includes/post-types.php';
226 require_once GAMIPRESS_DIR . 'includes/privacy.php';
227 require_once GAMIPRESS_DIR . 'includes/emails.php';
228 require_once GAMIPRESS_DIR . 'includes/credentials.php';
229 require_once GAMIPRESS_DIR . 'includes/activity-functions.php';
230 require_once GAMIPRESS_DIR . 'includes/ajax-functions.php';
231 require_once GAMIPRESS_DIR . 'includes/api.php';
232 require_once GAMIPRESS_DIR . 'includes/blocks.php';
233 require_once GAMIPRESS_DIR . 'includes/cache.php';
234 require_once GAMIPRESS_DIR . 'includes/functions.php';
235 require_once GAMIPRESS_DIR . 'includes/listeners.php';
236 require_once GAMIPRESS_DIR . 'includes/network.php';
237 require_once GAMIPRESS_DIR . 'includes/scripts.php';
238 require_once GAMIPRESS_DIR . 'includes/shortcodes.php';
239 require_once GAMIPRESS_DIR . 'includes/filters.php';
240 require_once GAMIPRESS_DIR . 'includes/rules-engine.php';
241 require_once GAMIPRESS_DIR . 'includes/tags.php';
242 require_once GAMIPRESS_DIR . 'includes/template-functions.php';
243 require_once GAMIPRESS_DIR . 'includes/triggers.php';
244 require_once GAMIPRESS_DIR . 'includes/users.php';
245 require_once GAMIPRESS_DIR . 'includes/widgets.php';
246
247 }
248
249 /**
250 * Include integrations files
251 *
252 * @access private
253 * @since 1.0.0
254 * @return void
255 */
256 private function integrations() {
257
258 $integrations_dir = GAMIPRESS_DIR . 'integrations';
259
260 // Setup active plugins
261 $active_plugins = array();
262
263 if( function_exists( 'get_option' ) ) {
264 $active_plugins = (array) get_option( 'active_plugins', array() );
265 }
266
267 // Setup active sitewide plugins
268 $active_sitewide_plugins = array();
269
270 if ( is_multisite() && function_exists( 'get_site_option' ) ) {
271 $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
272
273 if( ! is_array( $active_sitewide_plugins ) ) {
274 $active_sitewide_plugins = array();
275 }
276 }
277
278 $integrations = @opendir( $integrations_dir );
279
280 while ( ( $integration = @readdir( $integrations ) ) !== false ) {
281
282 if ( $integration === '.' || $integration === '..' || $integration === 'index.php' ) {
283 continue;
284 }
285
286 /**
287 * Filter to allow third party plugins skip any integration
288 *
289 * @since 1.0.0
290 *
291 * @param bool $skip
292 * @param string $integration The integration slug as named in gamipress/includes/integrations
293 * @param array $active_plugins
294 * @param array $active_sitewide_plugins
295 *
296 * @return bool
297 */
298 if( apply_filters( 'gamipress_skip_integration', false, $integration, $active_plugins, $active_sitewide_plugins ) ) {
299 continue;
300 }
301
302 // Skip if integration is already active
303 if( $this->is_integration_active( $integration, $active_plugins, $active_sitewide_plugins ) ) {
304 continue;
305 }
306
307 $integration_file = $integrations_dir . DIRECTORY_SEPARATOR . $integration . DIRECTORY_SEPARATOR . $integration . '.php';
308
309 // Skip if no file to load
310 if( ! file_exists( $integration_file ) ) {
311 continue;
312 }
313
314 require_once $integration_file;
315
316 }
317
318 closedir( $integrations );
319
320 }
321
322 /**
323 * Include integrations files
324 *
325 * @access private
326 * @since 1.0.0
327 * @param string $integration
328 * @param array $active_plugins
329 * @param array $active_sitewide_plugins
330 * @return bool
331 */
332 private function is_integration_active( $integration, $active_plugins, $active_sitewide_plugins ) {
333
334 $plugins = array(
335 "gamipress-{$integration}-integration/gamipress-{$integration}.php",
336 "gamipress-{$integration}-integration/gamipress-{$integration}-integration.php",
337 );
338
339 if( $integration === 'elementor' ) {
340 $plugins = array(
341 "gamipress-{$integration}-forms-integration/gamipress-{$integration}-forms.php",
342 );
343 }
344
345 foreach( $plugins as $plugin ) {
346
347 // Bail if plugin is active
348 if( in_array( $plugin, $active_plugins, true ) ) {
349 return true;
350 }
351
352 // Bail if plugin is network wide active
353 if ( isset( $active_sitewide_plugins[$plugin] ) ) {
354 return true;
355 }
356
357 // Consider integration active during it's activation
358 if( isset( $_REQUEST['action'] ) && $_REQUEST['action'] === 'activate'
359 && isset( $_REQUEST['plugin'] ) && $_REQUEST['plugin'] === $plugin ) {
360 return true;
361 }
362
363 // Support for bulk activate
364 if( isset( $_REQUEST['action'] ) && $_REQUEST['action'] === 'activate-selected'
365 && isset( $_REQUEST['checked'] ) && is_array( $_REQUEST['checked'] )
366 && in_array( $plugin, $_REQUEST['checked'] ) ) {
367 return true;
368 }
369
370 }
371
372 return false;
373
374 }
375
376 /**
377 * Setup plugin hooks
378 *
379 * @access private
380 * @since 1.0.0
381 * @return void
382 */
383 private function hooks() {
384
385 // Setup our activation and deactivation hooks
386 register_activation_hook( __FILE__, array( $this, 'activate' ) );
387 register_deactivation_hook( __FILE__, array( $this, 'deactivate' ) );
388
389 // Hook in all our important pieces
390 add_action( 'plugins_loaded', array( $this, 'pre_init' ), 20 );
391 add_action( 'plugins_loaded', array( $this, 'init' ), 50 );
392 add_action( 'plugins_loaded', array( $this, 'post_init' ), 999 );
393 add_action( 'init', array( $this, 'load_textdomain' ), 10 );
394
395 }
396
397 /**
398 * Pre init function
399 *
400 * @access private
401 * @since 1.4.6
402 * @return void
403 */
404 function pre_init() {
405
406 // Load all integrations
407 $this->integrations();
408
409 global $wpdb;
410
411 $this->db = new GamiPress_Database();
412
413 // Setup WordPress database tables
414 $this->db->posts = $wpdb->posts;
415 $this->db->postmeta = $wpdb->postmeta;
416 $this->db->users = $wpdb->users;
417 $this->db->usermeta = $wpdb->usermeta;
418
419 // Setup GamiPress database tables
420 $this->db->logs = $wpdb->gamipress_logs;
421 $this->db->logs_meta = $wpdb->gamipress_logs_meta;
422 $this->db->user_earnings = $wpdb->gamipress_user_earnings;
423 $this->db->user_earnings_meta = $wpdb->gamipress_user_earnings_meta;
424
425 // Trigger our action to let other plugins know that GamiPress is getting initialized
426 do_action( 'gamipress_pre_init' );
427
428 }
429
430 /**
431 * Init function
432 *
433 * @access private
434 * @since 1.4.0
435 * @return void
436 */
437 function init() {
438
439 // Trigger our action to let other plugins know that GamiPress is ready
440 do_action( 'gamipress_init' );
441
442 }
443
444 /**
445 * Post init function
446 *
447 * @access private
448 * @since 1.0.0
449 * @return void
450 */
451 function post_init() {
452
453 // Trigger our action to let other plugins know that GamiPress has been initialized
454 do_action( 'gamipress_post_init' );
455
456 }
457
458 /**
459 * Activation hook for the plugin.
460 */
461 function activate() {
462
463 // Include our important bits
464 $this->libraries();
465 $this->includes();
466
467 require_once GAMIPRESS_DIR . 'includes/install.php';
468
469 gamipress_install();
470
471 }
472
473 /**
474 * Deactivation hook for the plugin.
475 */
476 function deactivate() {
477 flush_rewrite_rules();
478 }
479
480 /**
481 * Internationalization
482 *
483 * @access public
484 * @since 1.0.0
485 * @return void
486 */
487 public function load_textdomain() {
488
489 // Set filter for language directory
490 $lang_dir = GAMIPRESS_DIR . '/languages/';
491 $lang_dir = apply_filters( 'gamipress_languages_directory', $lang_dir );
492
493 // Traditional WordPress plugin locale filter
494 $locale = apply_filters( 'plugin_locale', get_locale(), 'gamipress' );
495 $mofile = sprintf( '%1$s-%2$s.mo', 'gamipress', $locale );
496
497 // Setup paths to current locale file
498 $mofile_local = $lang_dir . $mofile;
499 $mofile_global = WP_LANG_DIR . '/gamipress/' . $mofile;
500
501 if( file_exists( $mofile_global ) ) {
502 // Look in global /wp-content/languages/gamipress/ folder
503 load_textdomain( 'gamipress', $mofile_global );
504 } elseif( file_exists( $mofile_local ) ) {
505 // Look in local /wp-content/plugins/gamipress/languages/ folder
506 load_textdomain( 'gamipress', $mofile_local );
507 } else {
508 // Load the default language files
509 load_plugin_textdomain( 'gamipress', false, $lang_dir );
510 }
511
512 }
513
514 }
515
516 /**
517 * The main function responsible for returning the one true GamiPress instance to functions everywhere
518 *
519 * @since 1.0.0
520 * @return \GamiPress The one true GamiPress
521 */
522 function GamiPress() {
523 return GamiPress::instance();
524 }
525
526 GamiPress();