PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.2.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.2.1
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / learnpress.php

learnpress.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.2.1, at learnpress.php

888 lines 23.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: LearnPress
4 * Plugin URI: http://thimpress.com/learnpress
5 * Description: LearnPress is a WordPress complete solution for creating a Learning Management System (LMS). It can help you to create courses, lessons and quizzes.
6 * Author: ThimPress
7 * Version: 4.2.1
8 * Author URI: http://thimpress.com
9 * Requires at least: 5.8
10 * Tested up to: 6.1.1
11 * Requires PHP: 7.0
12 * Text Domain: learnpress
13 * Domain Path: /languages/
14 *
15 * @package LearnPress
16 */
17
18 /**
19 * Prevent loading this file directly
20 */
21 defined( 'ABSPATH' ) || exit();
22
23 if ( ! defined( 'LP_PLUGIN_FILE' ) ) {
24 define( 'LP_PLUGIN_FILE', __FILE__ );
25 require_once 'inc/lp-constants.php';
26 }
27
28 if ( ! class_exists( 'LearnPress' ) ) {
29 /**
30 * Class LearnPress
31 *
32 * Version 3.0.1
33 */
34 class LearnPress {
35 /**
36 * Current version of the plugin
37 *
38 * @var string
39 */
40 public $version = LEARNPRESS_VERSION;
41 /**
42 * Version database require, use for this LP source
43 *
44 * @var int
45 */
46 public $db_version = 4;
47
48 /**
49 * The single instance of the class
50 *
51 * @var LearnPress object
52 */
53 private static $_instance = null;
54
55 /**
56 * Store the session class
57 *
58 * @var LP_Session_Handler
59 */
60 public $session = null;
61
62 /**
63 * @var LP_Profile
64 */
65 public $profile = null;
66
67 /**
68 * @var LP_Cart object
69 */
70 public $cart = false;
71
72 /**
73 * @var LP_Settings
74 */
75 public $settings = null;
76
77 /**
78 * @var null
79 */
80 public $schedule = null;
81
82 /**
83 * @var array
84 */
85 public $query_vars = array();
86
87 /**
88 * Table prefixes
89 *
90 * @var array
91 */
92 protected $_table_prefixes = array();
93
94 /**
95 * @var null
96 */
97 public $query = null;
98
99 /**
100 * @var array
101 */
102 public $global = array();
103
104 /**
105 * @var LP_Template
106 */
107 public $template = null;
108
109 /**
110 * @var LP_Core_API
111 */
112 public $api = null;
113
114 /**
115 * @var LP_Admin_Core_API
116 */
117 public $admin_api = null;
118
119 /**
120 * @var string
121 */
122 public $thim_core_version_require = '2.0.0';
123
124 /**
125 *
126 */
127 public $theme_support = null;
128
129 public $gateways = null;
130
131 /**
132 * LearnPress constructor.
133 */
134 protected function __construct() {
135 if ( self::$_instance ) {
136 return;
137 }
138 self::$_instance = $this;
139
140 update_option( 'learnpress_version', $this->version );
141
142 // Define constant .
143 $this->plugin_defines();
144
145 // define table prefixes .
146 $this->define_tables();
147
148 // Include files .
149 $this->includes();
150
151 // Copy mu plugin.
152 $this->mu_plugin();
153
154 // hooks .
155 $this->init_hooks();
156 }
157
158 /**
159 * Define constant.
160 */
161 protected function plugin_defines() {
162
163 }
164
165 /**
166 * Defines database table names.
167 */
168 public function define_tables() {
169 global $wpdb;
170
171 $tables = array(
172 'sessions',
173 'sections',
174 'section_items',
175 'user_items',
176 'user_itemmeta',
177 'user_item_results',
178 'order_items',
179 'order_itemmeta',
180 'quiz_questions',
181 'question_answers',
182 'question_answermeta',
183 );
184
185 foreach ( $tables as $short_name ) {
186 $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
187 $this->_table_prefixes[ 'tbl_' . $short_name ] = $table_name;
188
189 $backward_key = 'learnpress_' . $short_name;
190 $wpdb->{$backward_key} = $table_name;
191 }
192 }
193
194 /**
195 * Includes needed files.
196 */
197 public function includes() {
198 // Include required files load anywhere, both frontend and backend.
199 $this->include_files_global();
200
201 // include files when LP ready run - after setup success .
202 if ( ! LP_Install::instance()->tables_install_done() ) {
203 return;
204 }
205
206 // Include required files Backend.
207 $this->include_files_admin();
208
209 // Include required files Frontend.
210 $this->include_files_frontend();
211
212 new LP_Query();
213 }
214
215 /**
216 * load files anywhere, both frontend and backend
217 *
218 * @return void
219 */
220 private function include_files_global() {
221 require_once 'inc/Helper/Singleton.php';
222 require_once 'inc/class-lp-multi-language.php';
223
224 // Filter query .
225 require_once 'inc/filters/class-lp-filter.php';
226 require_once 'inc/filters/class-lp-post-type-filter.php';
227 require_once 'inc/filters/class-lp-course-filter.php';
228 require_once 'inc/filters/class-lp-order-filter.php';
229 require_once 'inc/filters/class-lp-session-filter.php';
230 require_once 'inc/filters/class-lp-section-filter.php';
231 require_once 'inc/filters/class-lp-section-items-filter.php';
232 require_once 'inc/filters/class-lp-question-filter.php';
233 require_once 'inc/filters/class-lp-user-items-filter.php';
234 require_once 'inc/filters/class-lp-quiz-questions-filter.php';
235 require_once 'inc/filters/class-lp-question-answers-filter.php';
236 require_once 'inc/filters/class-lp-question-answermeta-filter.php';
237
238 // Query Database .
239 require_once 'inc/databases/class-lp-db.php';
240 require_once 'inc/databases/class-lp-order-db.php';
241 require_once 'inc/databases/class-lp-course-db.php';
242 require_once 'inc/databases/class-lp-lesson-db.php';
243 require_once 'inc/databases/class-lp-section-db.php';
244 require_once 'inc/databases/class-lp-section-items-db.php';
245 require_once 'inc/databases/class-lp-quiz-db.php';
246 require_once 'inc/databases/class-lp-quiz-questions-db.php';
247 require_once 'inc/databases/class-lp-question-answers-db.php';
248 require_once 'inc/databases/class-lp-sessions-db.php';
249 require_once 'inc/databases/class-lp-question-db.php';
250 require_once 'inc/databases/class-lp-user-items-db.php';
251 require_once 'inc/databases/class-lp-user-item-results-db.php';
252
253 // Read files config on folder config .
254 require_once 'inc/Helper/Config.php';
255
256 // File system .
257 require_once 'inc/class-lp-file-system.php';
258
259 // File helper
260 require_once 'inc/class-lp-helper.php';
261 require_once 'inc/Helper/Template.php';
262
263 // Models
264 require_once 'inc/models/class-lp-rest-response.php';
265 include_once 'inc/models/steps/class-lp-group-step.php';
266 include_once 'inc/models/steps/class-lp-step.php';
267 require_once 'inc/models/class-lp-course-extra-info-fast-query-model.php';
268
269 // Handle steps.
270 require_once 'inc/handle-steps/class-lp-handle-steps.php';
271 require_once 'inc/handle-steps/class-lp-handle-upgrade-db-steps.php';
272
273 // LP Cache
274 require_once 'inc/cache/class-lp-cache.php';
275 require_once 'inc/cache/class-lp-courses-cache.php';
276 require_once 'inc/cache/class-lp-course-cache.php';
277 require_once 'inc/cache/class-lp-quiz-cache.php';
278 require_once 'inc/cache/class-lp-question-cache.php';
279 require_once 'inc/cache/class-lp-session-cache.php';
280
281 // Background processes.
282 require_once 'inc/libraries/wp-background-process/wp-background-processing.php';
283 require_once 'inc/background-process/abstract-lp-async-request.php';
284 require_once 'inc/background-process/class-lp-background-single-course.php';
285 require_once 'inc/background-process/class-lp-background-single-email.php';
286
287 // Assets object
288 require_once 'inc/class-lp-asset-key.php';
289 require_once 'inc/abstracts/abstract-assets.php';
290
291 // Debug class
292 require_once 'inc/class-lp-debug.php';
293
294 require_once 'inc/class-lp-settings.php';
295 require_once 'inc/abstract-settings.php';
296 require_once 'inc/settings/abstract-settings-page.php';
297 require_once 'inc/settings/class-lp-settings-courses.php';
298 require_once 'inc/class-lp-global.php';
299 require_once 'inc/class-lp-datetime.php';
300
301 // Register custom-post-type and taxonomies .
302 require_once 'inc/custom-post-types/abstract.php';
303 require_once 'inc/custom-post-types/course.php';
304 require_once 'inc/custom-post-types/lesson.php';
305 require_once 'inc/custom-post-types/quiz.php';
306 require_once 'inc/custom-post-types/question.php';
307 require_once 'inc/custom-post-types/order.php';
308
309 require_once 'inc/interfaces/interface-curd.php';
310 require_once 'inc/abstracts/abstract-array-access.php';
311 require_once 'inc/abstracts/abstract-object-data.php';
312 require_once 'inc/abstracts/abstract-post-data.php';
313
314 require_once 'inc/curds/class-lp-course-curd.php';
315 require_once 'inc/curds/class-lp-section-curd.php';
316 require_once 'inc/curds/class-lp-lesson-curd.php';
317 require_once 'inc/curds/class-lp-quiz-curd.php';
318 require_once 'inc/curds/class-lp-question-curd.php';
319 require_once 'inc/curds/class-lp-order-curd.php';
320 require_once 'inc/curds/class-lp-user-curd.php';
321 require_once 'inc/curds/class-lp-user-item-curd.php';
322
323 require_once 'inc/course/class-lp-course-item.php';
324 require_once 'inc/question/class-lp-question.php';
325 require_once 'inc/course/class-lp-course-section.php';
326 require_once 'inc/course/class-lp-course-no-required-enroll.php';
327 require_once 'inc/user-item/class-lp-user-item.php';
328 require_once 'inc/user-item/class-lp-user-item-course.php';
329
330 require_once 'inc/lp-deprecated.php'; // Will remove if Eduma and guest update all 4.0.0
331 require_once 'inc/lp-core-functions.php';
332 require_once 'inc/class-lp-autoloader.php';
333
334 require_once 'inc/lp-webhooks.php';
335 require_once 'inc/class-lp-request-handler.php';
336
337 require_once 'inc/admin/helpers/class-lp-plugins-helper.php';
338
339 // Todo: tungnx check those files.
340 require_once 'inc/abstracts/abstract-object-query.php';
341 require_once 'inc/class-lp-course-query.php';
342 require_once 'inc/abstracts/abstract-addon.php';
343 require_once 'inc/class-lp-thumbnail-helper.php';
344 require_once 'inc/cache.php';
345
346 // Class handle check db of LP need to upgrade?
347 require_once 'inc/admin/class-lp-updater.php';
348
349 require_once 'inc/course/lp-course-functions.php';
350 require_once 'inc/course/abstract-course.php';
351 require_once 'inc/course/class-lp-course.php';
352 require_once 'inc/quiz/lp-quiz-functions.php';
353 require_once 'inc/quiz/class-lp-quiz.php';
354 require_once 'inc/lesson/lp-lesson-functions.php';
355 require_once 'inc/order/lp-order-functions.php';
356 require_once 'inc/order/class-lp-order.php';
357
358 require_once 'inc/user/lp-user-functions.php';
359 require_once 'inc/user/class-lp-user-factory.php';
360 require_once 'inc/user/abstract-lp-user.php';
361 require_once 'inc/user/class-lp-user.php';
362 require_once 'inc/user/class-lp-profile.php';
363 require_once 'inc/user-item/class-lp-user-item.php';
364 require_once 'inc/user-item/class-lp-user-item-course.php';
365 require_once 'inc/user-item/class-lp-user-item-quiz.php';
366 require_once 'inc/user-item/class-lp-quiz-results.php';
367 require_once 'inc/class-lp-session-handler.php';
368
369 require_once 'inc/class-lp-shortcodes.php';
370
371 // include template functions .
372 require_once 'inc/lp-template-functions.php';
373 require_once 'inc/templates/abstract-template.php';
374 //require_once 'inc/class-lp-template.php';
375
376 // Cart
377 require_once 'inc/cart/class-lp-cart.php';
378 require_once 'inc/cart/lp-cart-functions.php';
379
380 // Block Templates
381 require_once 'inc/block-template/class-block-until.php';
382 require_once 'inc/block-template/class-block-controller.php';
383
384 // API
385 require_once 'inc/abstracts/abstract-rest-api.php';
386 require_once 'inc/abstracts/abstract-rest-controller.php';
387 require_once 'inc/rest-api/class-lp-core-api.php';
388 require_once 'inc/rest-api/class-lp-admin-core-api.php';
389
390 /** Jwt */
391 include_once 'inc/jwt/class-jwt-auth.php';
392
393 require_once 'inc/class-lp-widget.php';
394 require_once 'inc/lp-widget-functions.php';
395
396 // For plugin Elementor
397 if ( defined( 'ELEMENTOR_VERSION' ) ) {
398 require_once 'inc/external-plugin/elementor/class-lp-elementor.php';
399 }
400
401 // TODO: update frontend editor before move to function include_files_admin.
402 require_once 'inc/admin/views/meta-boxes/class-lp-meta-box.php';
403
404 require_once 'inc/class-lp-page-controller.php';
405
406 require_once 'inc/gateways/class-lp-gateway-abstract.php';
407 require_once 'inc/gateways/class-lp-gateways.php';
408 }
409
410 /**
411 * Include file run on backend
412 */
413 private function include_files_admin() {
414 if ( ! is_admin() ) {
415 return;
416 }
417
418 require_once 'inc/admin/class-lp-admin-ajax.php';
419
420 require_once 'inc/admin/class-lp-admin-notice.php';
421
422 // File handle install LP
423 require_once 'inc/class-lp-install.php';
424
425 // Meta box helper
426 require_once 'inc/admin/meta-box/class-lp-meta-box-helper.php';
427
428 require_once 'inc/admin/class-lp-admin.php';
429 // require_once 'inc/admin/settings/abstract-settings-page.php';
430 }
431
432 /**
433 * Include file run on frontend
434 */
435 private function include_files_frontend() {
436 if ( is_admin() ) {
437 return;
438 }
439
440 require_once 'inc/class-lp-assets.php';
441
442 require_once 'inc/course/class-model-user-can-view-course-item.php';
443
444 require_once 'inc/class-lp-ajax.php';
445 }
446
447 /**
448 * Initial common hooks
449 */
450 public function init_hooks() {
451 // Add links setting|document|addon on plugins page.
452 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
453
454 register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
455 register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
456 // add_action( 'deactivate_' . LP_PLUGIN_BASENAME, array( $this, 'on_deactivate' ) );
457
458 if ( ! LP_Install::instance()->tables_install_done() ) {
459 return;
460 }
461
462 add_action( 'wp_loaded', array( $this, 'wp_loaded' ), 20 );
463 //add_action( 'after_setup_theme', array( $this, 'setup_theme' ) );
464 add_action( 'plugins_loaded', array( $this, 'plugin_loaded' ), - 10 );
465
466 // Check require version thim-core.
467 add_action( 'before_thim_core_init', array( $this, 'check_thim_core_version_require' ) );
468
469 // Save key purchase addon when install via file download from Thimpress.
470 add_action(
471 'upgrader_process_complete',
472 function ( $plugin_upgrader ) {
473 if ( ! empty( $plugin_upgrader->result ) ) {
474 $res = $plugin_upgrader->result;
475 $path_source = $res['destination'] ?? '';
476 if ( empty( $path_source ) ) {
477 return;
478 }
479
480 $key_purchase_path = realpath( $path_source . '/purchase-code.txt' );
481 if ( file_exists( $key_purchase_path ) ) {
482 $purchase_code_content = file_get_contents( $key_purchase_path );
483 if ( empty( $purchase_code_content ) ) {
484 return;
485 }
486
487 $addon_slug = $res['destination_name'] ?? '';
488 if ( empty( $addon_slug ) ) {
489 return;
490 }
491
492 // Call active purchase code for site.
493 LP_Manager_Addons::instance()->active_site( $addon_slug, $purchase_code_content );
494 }
495 }
496 }
497 );
498 }
499
500 /**
501 * Add links to Documentation and Extensions in plugin's list of action links
502 *
503 * @since 4.3.11
504 *
505 * @param array $links Array of action links
506 *
507 * @return array
508 */
509 public function plugin_links( array $links ): array {
510 $links[] = sprintf( '<a href="%s">%s</a>', admin_url( 'admin.php?page=learn-press-settings' ), __( 'Settings', 'learnpress' ) );
511 $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', 'https://docspress.thimpress.com/learnpress-4-0/', __( 'Documentation', 'learnpress' ) );
512 $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', get_admin_url() . '/admin.php?page=learn-press-addons', __( 'Add-ons', 'learnpress' ) );
513
514 return $links;
515 }
516
517 /**
518 * Trigger this function while activating Learnpress.
519 *
520 * @since 3.0.0
521 * @version 4.1.4.1
522 */
523 public function on_activate() {
524 LP_Install::instance()->on_activate();
525 }
526
527 /**
528 * Trigger this function while deactivating Learnpress.
529 *
530 * $since 3.0.0
531 *
532 * @hook learn_press_deactivate
533 */
534 public function on_deactivate() {
535 do_action( 'learn-press/deactivate', $this );
536 }
537
538 /**
539 * Trigger WP loaded actions.
540 *
541 * @since 3.0.0
542 */
543 public function wp_loaded() {
544 if ( $this->is_request( 'frontend' ) ) {
545 $this->gateways = LP_Gateways::instance()->get_available_payment_gateways();
546 }
547 }
548
549 /**
550 * Setup courses thumbnail.
551 *
552 * @since 3.0.0
553 */
554 public function setup_theme() {
555 if ( ! current_theme_supports( 'post-thumbnails' ) ) {
556 add_theme_support( 'post-thumbnails' );
557 }
558 add_post_type_support( LP_COURSE_CPT, 'thumbnail' );
559
560 $size = LP_Settings::get_option(
561 'course_thumbnail_dimensions',
562 array(
563 500,
564 300,
565 )
566 );
567
568 $size = array_values( (array) $size );
569
570 add_image_size( 'course_thumbnail', $size[0], $size[1], true );
571 }
572
573 /**
574 * Trigger Learnpress loaded actions.
575 *
576 * @since 3.0.0
577 * @version 1.0.2
578 * @editor tungnx
579 */
580 public function plugin_loaded() {
581 do_action( 'learnpress/hook/before-addons-call-hook-learnpress-ready' );
582
583 // For check wp_remote call normally of WP
584 if ( ! empty( LP_Request::get_param( 'lp_test_wp_remote' ) ) ) {
585 echo '[TEST_REMOTE]';
586 die;
587 }
588
589 // Polylang
590 if ( defined( 'POLYLANG_VERSION' ) ) {
591 require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
592 LP_Polylang::instance();
593 }
594
595 $this->init();
596
597 require_once 'inc/lp-template-hooks.php';
598
599 /**
600 * Check version addons valid version require.
601 * If not valid will be to deactivate.
602 * Reload page, so not affect to hook "learn-press/ready"
603 */
604 $addons_valid = true;
605 $plugins = get_option( 'active_plugins' );
606
607 $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
608
609 // Remove hook deactivate addon assignments v3.
610 add_action(
611 'deactivate_learnpress-assignments/learnpress-assignments.php',
612 array( $this, 'lp_assignment_install' ),
613 - 10
614 );
615
616 foreach ( $list_lp_addon_activated as $lp_addon ) {
617 $lp_addon_info = get_file_data(
618 WP_PLUGIN_DIR . '/' . $lp_addon,
619 array(
620 'Require_LP_Version' => 'Require_LP_Version',
621 'Version' => 'Version',
622 )
623 );
624
625 // $lp_addon_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $lp_addon );
626 $lp_addon_version = $lp_addon_info['Version'];
627
628 $addon = new Lp_Addon();
629 $addon->version = $lp_addon_version;
630 $addon->plugin_base = $lp_addon;
631 $addon->require_version = $lp_addon_info['Require_LP_Version'];
632 $addon_valid = $addon->check_require_version_addon();
633
634 if ( $addons_valid ) {
635 $addon_valid = $addon->check_require_version_lp();
636 }
637
638 if ( ! $addon_valid ) {
639 $addons_valid = false;
640 }
641 }
642 // End check addons valid.
643
644 if ( ! $addons_valid ) {
645 return;
646 }
647
648 // let third parties know that we're ready .
649 do_action( 'learn-press/ready' );
650 }
651
652 /**
653 * Remove hook deactivate addon assignments v3.
654 */
655 public function lp_assignment_install() {
656 remove_action( 'deactivate_learnpress-assignments/learnpress-assignments.php', 'lp_assignment_remove' );
657 }
658
659 /**
660 * Get instance of class LP_Template.
661 *
662 * @param string $type
663 *
664 * @return LP_Template_Course|LP_Template_Profile|LP_Template_General|LP_Abstract_Template|LP_Template
665 *
666 * @throws Exception
667 * @since 3.3.0
668 */
669 public function template( $type = '' ) {
670 $this->template = LP_Template::instance();
671 $templates = (array) $this->template->get_templates();
672
673 return $templates[ $type ] ?? $this->template;
674 }
675
676 /**
677 * Init LearnPress when WP initialises
678 */
679 public function init() {
680 $this->api = new LP_Core_API();
681 $this->admin_api = new LP_Admin_Core_API();
682
683 $this->get_session();
684
685 $this->settings = $this->settings();
686
687 if ( $this->is_request( 'frontend' ) ) {
688 $this->get_cart();
689 }
690
691 // Email hook notify
692 include_once 'inc/emails/class-lp-email-hooks.php';
693 // Init emails
694 LP_Emails::instance();
695 }
696
697 /**
698 * Get session object instance.
699 *
700 * @return mixed
701 */
702 public function get_session() {
703 if ( ! $this->session ) {
704 $this->session = LP_Session_Handler::instance();
705 }
706
707 return $this->session;
708 }
709
710 /**
711 * Get settings object instance.
712 *
713 * @return bool|LP_Settings
714 */
715 public function settings() {
716 return LP_Settings::instance();
717 }
718
719 /**
720 * Get cart object instance for online learning market.
721 *
722 * @return LP_Cart
723 */
724 public function get_cart() : LP_Cart {
725 if ( ! $this->cart ) {
726 $this->cart = LP_Cart::instance();
727 }
728
729 return $this->cart;
730 }
731
732 /**
733 * Check type of request.
734 *
735 * @param string $type ajax, frontend or admin.
736 *
737 * @return bool
738 */
739 public function is_request( $type ) {
740 switch ( $type ) {
741 case 'admin':
742 return is_admin();
743 case 'ajax':
744 return defined( 'LP_DOING_AJAX' );
745 case 'cron':
746 return defined( 'DOING_CRON' );
747 case 'frontend':
748 return ( ! is_admin() || defined( 'LP_DOING_AJAX' ) ) && ! defined( 'DOING_CRON' );
749 default:
750 return strtolower( $_SERVER['REQUEST_METHOD'] ) == $type;
751 }
752 }
753
754 /**
755 * Get the plugin url.
756 *
757 * @param string $sub_dir
758 *
759 * @return string
760 */
761 public function plugin_url( $sub_dir = '' ) {
762 return LP_PLUGIN_URL . ( $sub_dir ? "{$sub_dir}" : '' );
763 }
764
765 /**
766 * Get the plugin path.
767 *
768 * @param string $sub_dir
769 *
770 * @return string
771 */
772 public function plugin_path( $sub_dir = '' ) {
773 return LP_PLUGIN_PATH . ( $sub_dir ? "{$sub_dir}" : '' );
774 }
775
776 /**
777 * Get checkout object instance
778 *
779 * @return LP_Checkout
780 */
781 public function checkout() {
782 return LP_Checkout::instance();
783 }
784
785 /**
786 * Short way to return image file is located in LearnPress directory.
787 *
788 * @param string
789 *
790 * @return string
791 */
792 public function image( $file ) {
793 if ( ! preg_match( '/.(jpg|png)$/', $file ) ) {
794 $file .= '.jpg';
795 }
796
797 return $this->plugin_url( "assets/images/{$file}" );
798 }
799
800 /**
801 * Check require version thim-core
802 */
803 public function check_thim_core_version_require() {
804 // Get thim-core info for LP check .
805 include_once ABSPATH . 'wp-admin/includes/plugin.php';
806 $thim_core_info = get_file_data(
807 WP_PLUGIN_DIR . '/thim-core/thim-core.php',
808 array(
809 'Name' => 'Plugin Name',
810 'Require_LP_Version' => 'Require_LP_Version',
811 'Version' => 'Version',
812 )
813 );
814
815 if ( version_compare( $this->thim_core_version_require, $thim_core_info['Version'], '>' ) ) {
816 deactivate_plugins( 'thim-core/thim-core.php' );
817
818 if ( isset( $_GET['activate'] ) ) {
819 unset( $_GET['activate'] );
820 }
821
822 $message = sprintf(
823 '%s %s You can download %s. Read guide on %s',
824 'LP4 require version Thim-core:',
825 $this->thim_core_version_require,
826 '<a href="https://thimpresswp.github.io/thim-core/thim-core.zip">latest version</a>',
827 '<a href="https://docspress.thimpress.com/upgrade-database-how-to-fix-some-issue/">here</a>'
828 );
829 ?>
830 <div class="notice notice-error">
831 <p><?php echo wp_kses_post( $message ); ?></p>
832 </div>
833 <?php
834 die;
835 }
836 }
837
838 /**
839 * Main plugin instance.
840 *
841 * @return LearnPress
842 */
843 public static function instance() {
844 if ( is_null( self::$_instance ) ) {
845 self::$_instance = new self();
846 }
847
848 return self::$_instance;
849 }
850
851 /**
852 * Copy class-lp-mu-plugin.php to mu_plugins folder
853 *
854 * @return void
855 */
856 public function mu_plugin() {
857 try {
858 // Remove file mu plugin create on version 4.1.7.
859 $name = 'class-lp-mu-plugin.php';
860 $mu_plugins_path = WPMU_PLUGIN_DIR;
861 $mu_plugin_file_path = $mu_plugins_path . '/' . $name;
862 if ( file_exists( $mu_plugin_file_path ) ) {
863 LP_WP_Filesystem::instance()->lp_filesystem->delete( $mu_plugin_file_path );
864 }
865 } catch ( Throwable $e ) {
866 error_log( $e->getMessage() );
867 }
868 }
869 }
870 }
871
872 /**
873 * Short way to load main instance of plugin
874 *
875 * @return LearnPress
876 * @since 1.0
877 * @author thimpress
878 */
879 function LP() {
880 return LearnPress::instance();
881 }
882
883 /**
884 * Done! entry point of the plugin
885 * Create new instance of LearnPress and put it to global
886 */
887 $GLOBALS['LearnPress'] = LearnPress::instance();
888