PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 7.9.8
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v7.9.8
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 7.8.7 All 46 releases
gamipress / gamipress.php

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

520 lines 14.9 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.8
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.8' );
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 }
136
137 /**
138 * Include plugin libraries
139 *
140 * @access private
141 * @since 1.0.0
142 * @return void
143 */
144 private function libraries() {
145
146 // Custom Tables
147 require_once GAMIPRESS_DIR . 'libraries/ct/init.php';
148 require_once GAMIPRESS_DIR . 'libraries/ct-ajax-list-table/ct-ajax-list-table.php';
149
150 // CMB2
151 require_once GAMIPRESS_DIR . 'libraries/cmb2/init.php';
152 require_once GAMIPRESS_DIR . 'libraries/cmb2-metatabs-options/cmb2_metatabs_options.php';
153 require_once GAMIPRESS_DIR . 'libraries/cmb2-tabs/cmb2-tabs.php';
154 require_once GAMIPRESS_DIR . 'libraries/cmb2-field-tooltip/cmb2-field-tooltip.php';
155 require_once GAMIPRESS_DIR . 'libraries/cmb2-field-edd-license/cmb2-field-edd-license.php';
156 require_once GAMIPRESS_DIR . 'libraries/cmb2-conditional-fields/cmb2-conditional-fields.php';
157
158 // GamiPress CMB2 fields
159 require_once GAMIPRESS_DIR . 'libraries/advanced-select-field-type.php';
160 require_once GAMIPRESS_DIR . 'libraries/size-field-type.php';
161 require_once GAMIPRESS_DIR . 'libraries/display-field-type.php';
162 require_once GAMIPRESS_DIR . 'libraries/button-field-type.php';
163 require_once GAMIPRESS_DIR . 'libraries/html-field-type.php';
164 require_once GAMIPRESS_DIR . 'libraries/points-field-type.php';
165
166 }
167
168 /**
169 * Include plugin classes
170 *
171 * @access private
172 * @since 1.0.0
173 * @return void
174 */
175 private function classes() {
176
177 require_once GAMIPRESS_DIR . 'classes/database.php';
178 require_once GAMIPRESS_DIR . 'classes/badge-builder-icons.php';
179
180 }
181
182 /**
183 * Include compatibility files
184 *
185 * @access private
186 * @since 1.2.8
187 * @return void
188 */
189 private function compatibility() {
190
191 // WordPress backward compatibility
192 require_once GAMIPRESS_DIR . 'includes/compatibility/wordpress.php';
193
194 // GamiPress backward compatibility
195 require_once GAMIPRESS_DIR . 'includes/compatibility/1.2.8.php';
196 require_once GAMIPRESS_DIR . 'includes/compatibility/1.3.1.php';
197 require_once GAMIPRESS_DIR . 'includes/compatibility/1.4.3.php';
198 require_once GAMIPRESS_DIR . 'includes/compatibility/1.4.7.php';
199 require_once GAMIPRESS_DIR . 'includes/compatibility/1.5.0.php';
200 require_once GAMIPRESS_DIR . 'includes/compatibility/1.5.1.php';
201 require_once GAMIPRESS_DIR . 'includes/compatibility/1.6.5.php';
202 require_once GAMIPRESS_DIR . 'includes/compatibility/1.8.0.php';
203 require_once GAMIPRESS_DIR . 'includes/compatibility/1.8.6.php';
204 require_once GAMIPRESS_DIR . 'includes/compatibility/1.8.7.php';
205
206 }
207
208 /**
209 * Include plugin files
210 *
211 * @access private
212 * @since 1.0.0
213 * @return void
214 */
215 private function includes() {
216
217 // The rest of files
218 require_once GAMIPRESS_DIR . 'includes/admin.php';
219 require_once GAMIPRESS_DIR . 'includes/custom-tables.php';
220 require_once GAMIPRESS_DIR . 'includes/post-types.php';
221 require_once GAMIPRESS_DIR . 'includes/privacy.php';
222 require_once GAMIPRESS_DIR . 'includes/emails.php';
223 require_once GAMIPRESS_DIR . 'includes/activity-functions.php';
224 require_once GAMIPRESS_DIR . 'includes/ajax-functions.php';
225 require_once GAMIPRESS_DIR . 'includes/api.php';
226 require_once GAMIPRESS_DIR . 'includes/blocks.php';
227 require_once GAMIPRESS_DIR . 'includes/cache.php';
228 require_once GAMIPRESS_DIR . 'includes/functions.php';
229 require_once GAMIPRESS_DIR . 'includes/listeners.php';
230 require_once GAMIPRESS_DIR . 'includes/network.php';
231 require_once GAMIPRESS_DIR . 'includes/scripts.php';
232 require_once GAMIPRESS_DIR . 'includes/shortcodes.php';
233 require_once GAMIPRESS_DIR . 'includes/filters.php';
234 require_once GAMIPRESS_DIR . 'includes/rules-engine.php';
235 require_once GAMIPRESS_DIR . 'includes/tags.php';
236 require_once GAMIPRESS_DIR . 'includes/template-functions.php';
237 require_once GAMIPRESS_DIR . 'includes/triggers.php';
238 require_once GAMIPRESS_DIR . 'includes/users.php';
239 require_once GAMIPRESS_DIR . 'includes/widgets.php';
240
241 }
242
243 /**
244 * Include integrations files
245 *
246 * @access private
247 * @since 1.0.0
248 * @return void
249 */
250 private function integrations() {
251
252 $integrations_dir = GAMIPRESS_DIR . 'integrations';
253
254 // Setup active plugins
255 $active_plugins = array();
256
257 if( function_exists( 'get_option' ) ) {
258 $active_plugins = (array) get_option( 'active_plugins', array() );
259 }
260
261 // Setup active sitewide plugins
262 $active_sitewide_plugins = array();
263
264 if ( is_multisite() && function_exists( 'get_site_option' ) ) {
265 $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
266
267 if( ! is_array( $active_sitewide_plugins ) ) {
268 $active_sitewide_plugins = array();
269 }
270 }
271
272 $integrations = @opendir( $integrations_dir );
273
274 while ( ( $integration = @readdir( $integrations ) ) !== false ) {
275
276 if ( $integration === '.' || $integration === '..' || $integration === 'index.php' ) {
277 continue;
278 }
279
280 /**
281 * Filter to allow third party plugins skip any integration
282 *
283 * @since 1.0.0
284 *
285 * @param bool $skip
286 * @param string $integration The integration slug as named in gamipress/includes/integrations
287 * @param array $active_plugins
288 * @param array $active_sitewide_plugins
289 *
290 * @return bool
291 */
292 if( apply_filters( 'gamipress_skip_integration', false, $integration, $active_plugins, $active_sitewide_plugins ) ) {
293 continue;
294 }
295
296 // Skip if integration is already active
297 if( $this->is_integration_active( $integration, $active_plugins, $active_sitewide_plugins ) ) {
298 continue;
299 }
300
301 $integration_file = $integrations_dir . DIRECTORY_SEPARATOR . $integration . DIRECTORY_SEPARATOR . $integration . '.php';
302
303 // Skip if no file to load
304 if( ! file_exists( $integration_file ) ) {
305 continue;
306 }
307
308 require_once $integration_file;
309
310 }
311
312 closedir( $integrations );
313
314 }
315
316 /**
317 * Include integrations files
318 *
319 * @access private
320 * @since 1.0.0
321 * @param string $integration
322 * @param array $active_plugins
323 * @param array $active_sitewide_plugins
324 * @return bool
325 */
326 private function is_integration_active( $integration, $active_plugins, $active_sitewide_plugins ) {
327
328 $plugins = array(
329 "gamipress-{$integration}-integration/gamipress-{$integration}.php",
330 "gamipress-{$integration}-integration/gamipress-{$integration}-integration.php",
331 );
332
333 if( $integration === 'elementor' ) {
334 $plugins = array(
335 "gamipress-{$integration}-forms-integration/gamipress-{$integration}-forms.php",
336 );
337 }
338
339 foreach( $plugins as $plugin ) {
340
341 // Bail if plugin is active
342 if( in_array( $plugin, $active_plugins, true ) ) {
343 return true;
344 }
345
346 // Bail if plugin is network wide active
347 if ( isset( $active_sitewide_plugins[$plugin] ) ) {
348 return true;
349 }
350
351 // Consider integration active during it's activation
352 if( isset( $_REQUEST['action'] ) && $_REQUEST['action'] === 'activate'
353 && isset( $_REQUEST['plugin'] ) && $_REQUEST['plugin'] === $plugin ) {
354 return true;
355 }
356
357 // Support for bulk activate
358 if( isset( $_REQUEST['action'] ) && $_REQUEST['action'] === 'activate-selected'
359 && isset( $_REQUEST['checked'] ) && is_array( $_REQUEST['checked'] )
360 && in_array( $plugin, $_REQUEST['checked'] ) ) {
361 return true;
362 }
363
364 }
365
366 return false;
367
368 }
369
370 /**
371 * Setup plugin hooks
372 *
373 * @access private
374 * @since 1.0.0
375 * @return void
376 */
377 private function hooks() {
378
379 // Setup our activation and deactivation hooks
380 register_activation_hook( __FILE__, array( $this, 'activate' ) );
381 register_deactivation_hook( __FILE__, array( $this, 'deactivate' ) );
382
383 // Hook in all our important pieces
384 add_action( 'plugins_loaded', array( $this, 'pre_init' ), 20 );
385 add_action( 'plugins_loaded', array( $this, 'init' ), 50 );
386 add_action( 'plugins_loaded', array( $this, 'post_init' ), 999 );
387 add_action( 'init', array( $this, 'load_textdomain' ), 10 );
388
389 }
390
391 /**
392 * Pre init function
393 *
394 * @access private
395 * @since 1.4.6
396 * @return void
397 */
398 function pre_init() {
399
400 // Load all integrations
401 $this->integrations();
402
403 global $wpdb;
404
405 $this->db = new GamiPress_Database();
406
407 // Setup WordPress database tables
408 $this->db->posts = $wpdb->posts;
409 $this->db->postmeta = $wpdb->postmeta;
410 $this->db->users = $wpdb->users;
411 $this->db->usermeta = $wpdb->usermeta;
412
413 // Setup GamiPress database tables
414 $this->db->logs = $wpdb->gamipress_logs;
415 $this->db->logs_meta = $wpdb->gamipress_logs_meta;
416 $this->db->user_earnings = $wpdb->gamipress_user_earnings;
417 $this->db->user_earnings_meta = $wpdb->gamipress_user_earnings_meta;
418
419 // Trigger our action to let other plugins know that GamiPress is getting initialized
420 do_action( 'gamipress_pre_init' );
421
422 }
423
424 /**
425 * Init function
426 *
427 * @access private
428 * @since 1.4.0
429 * @return void
430 */
431 function init() {
432
433 // Trigger our action to let other plugins know that GamiPress is ready
434 do_action( 'gamipress_init' );
435
436 }
437
438 /**
439 * Post init function
440 *
441 * @access private
442 * @since 1.0.0
443 * @return void
444 */
445 function post_init() {
446
447 // Trigger our action to let other plugins know that GamiPress has been initialized
448 do_action( 'gamipress_post_init' );
449
450 }
451
452 /**
453 * Activation hook for the plugin.
454 */
455 function activate() {
456
457 // Include our important bits
458 $this->libraries();
459 $this->includes();
460
461 require_once GAMIPRESS_DIR . 'includes/install.php';
462
463 gamipress_install();
464
465 }
466
467 /**
468 * Deactivation hook for the plugin.
469 */
470 function deactivate() {
471 flush_rewrite_rules();
472 }
473
474 /**
475 * Internationalization
476 *
477 * @access public
478 * @since 1.0.0
479 * @return void
480 */
481 public function load_textdomain() {
482
483 // Set filter for language directory
484 $lang_dir = GAMIPRESS_DIR . '/languages/';
485 $lang_dir = apply_filters( 'gamipress_languages_directory', $lang_dir );
486
487 // Traditional WordPress plugin locale filter
488 $locale = apply_filters( 'plugin_locale', get_locale(), 'gamipress' );
489 $mofile = sprintf( '%1$s-%2$s.mo', 'gamipress', $locale );
490
491 // Setup paths to current locale file
492 $mofile_local = $lang_dir . $mofile;
493 $mofile_global = WP_LANG_DIR . '/gamipress/' . $mofile;
494
495 if( file_exists( $mofile_global ) ) {
496 // Look in global /wp-content/languages/gamipress/ folder
497 load_textdomain( 'gamipress', $mofile_global );
498 } elseif( file_exists( $mofile_local ) ) {
499 // Look in local /wp-content/plugins/gamipress/languages/ folder
500 load_textdomain( 'gamipress', $mofile_local );
501 } else {
502 // Load the default language files
503 load_plugin_textdomain( 'gamipress', false, $lang_dir );
504 }
505
506 }
507
508 }
509
510 /**
511 * The main function responsible for returning the one true GamiPress instance to functions everywhere
512 *
513 * @since 1.0.0
514 * @return \GamiPress The one true GamiPress
515 */
516 function GamiPress() {
517 return GamiPress::instance();
518 }
519
520 GamiPress();