PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.3
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.3
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 4.2.1.1 All 137 releases
learnpress / learnpress.php

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

1,108 lines 34.3 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: https://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.4.3
8 * Author URI: http://thimpress.com
9 * Requires at least: 6.0
10 * Requires PHP: 7.4
11 * Text Domain: learnpress
12 * Domain Path: /languages/
13 *
14 * @package LearnPress
15 */
16
17 use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderListCoursesTemplate;
18 use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderCourseTemplate;
19 use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderEditCourseTemplate;
20 use LearnPress\Ajax\AI\OpenAiAjax;
21 use LearnPress\Ajax\BuilderDashboardAjax;
22 use LearnPress\Ajax\CourseBuilder\CourseBuilderAjax;
23 use LearnPress\Ajax\EditCurriculumAjax;
24 use LearnPress\Ajax\EditQuestionAjax;
25 use LearnPress\Ajax\EditQuizAjax;
26 use LearnPress\Ajax\Order\ExportOrderCSVAjax;
27 use LearnPress\Ajax\LessonAjax;
28 use LearnPress\Ajax\LoadContentViaAjax;
29 use LearnPress\Ajax\AI\AIAssistantAjax;
30 use LearnPress\Ajax\MCP\McpApiKeysAjax;
31 use LearnPress\Ajax\Webhook\WebhooksAjax;
32 use LearnPress\Ajax\CourseBuilder\CBEditCourseAjax;
33 use LearnPress\Ajax\SendEmailAjax;
34 use LearnPress\Background\LPBackgroundTrigger;
35 use LearnPress\ExternalPlugin\Elementor\LPElementor;
36 use LearnPress\ExternalPlugin\RankMath\LPRankMath;
37 use LearnPress\ExternalPlugin\YoastSeo\LPYoastSeo;
38 use LearnPress\Gutenberg\GutenbergHandleMain;
39 use LearnPress\Ajax\Order\RefundOrderAjax;
40 use LearnPress\MCP\Abilities;
41 use LearnPress\MCP\Auth\ApiKeyAuthenticator;
42 use LearnPress\Models\CourseModel;
43 use LearnPress\Models\UserModel;
44 use LearnPress\Shortcodes\Course\FilterCourseShortcode;
45 use LearnPress\Shortcodes\CourseButtonShortcode;
46 use LearnPress\Shortcodes\CourseMaterialShortcode;
47 use LearnPress\Shortcodes\Courses\ListCoursesShortcode;
48 use LearnPress\Shortcodes\ListInstructorsShortcode;
49 use LearnPress\Shortcodes\SingleInstructorShortcode;
50 use LearnPress\TemplateHooks\Admin\AdminEditQizTemplate;
51 use LearnPress\TemplateHooks\Admin\AdminEditQuestionTemplate;
52 use LearnPress\TemplateHooks\Admin\AdminListStudentsEnrolled;
53 use LearnPress\TemplateHooks\Admin\AdminStatisticsReportTable;
54 use LearnPress\Statistics\FilterOptionsProvider;
55 use LearnPress\TemplateHooks\Admin\AI\AdminCreateCourseAITemplate;
56 use LearnPress\TemplateHooks\Admin\AI\AdminEditCourseCurriculumWithAITemplate;
57 use LearnPress\TemplateHooks\Admin\AI\AdminEditWithAITemplate;
58 use LearnPress\TemplateHooks\Course\AdminEditCurriculumTemplate;
59 use LearnPress\TemplateHooks\Course\AdminEditSettingTemplate;
60 use LearnPress\TemplateHooks\Course\CourseMaterialTemplate;
61 use LearnPress\TemplateHooks\Course\FilterCourseTemplate;
62 use LearnPress\TemplateHooks\Course\ListCoursesRelatedTemplate;
63 use LearnPress\TemplateHooks\Course\ListCoursesTemplate;
64 use LearnPress\TemplateHooks\Course\SingleCourseClassicTemplate;
65 use LearnPress\TemplateHooks\Course\SingleCourseModernLayout;
66 use LearnPress\TemplateHooks\Course\SingleCourseOfflineTemplate;
67 use LearnPress\TemplateHooks\Course\SingleCourseTemplate;
68 use LearnPress\TemplateHooks\CourseBuilder\BuilderPopupTemplate;
69 use LearnPress\TemplateHooks\CourseBuilder\CourseBuilderTemplate;
70 use LearnPress\TemplateHooks\CourseBuilder\Dashboard\BuilderDashboardTemplate;
71 use LearnPress\TemplateHooks\CourseBuilder\Lesson\BuilderEditLessonTemplate;
72 use LearnPress\TemplateHooks\CourseBuilder\Lesson\BuilderLessonTemplate;
73 use LearnPress\TemplateHooks\CourseBuilder\Lesson\BuilderListLessonsTemplate;
74 use LearnPress\TemplateHooks\CourseBuilder\Question\BuilderEditQuestionTemplate;
75 use LearnPress\TemplateHooks\CourseBuilder\Question\BuilderListQuestionsTemplate;
76 use LearnPress\TemplateHooks\CourseBuilder\Question\BuilderQuestionTemplate;
77 use LearnPress\TemplateHooks\CourseBuilder\Quiz\BuilderEditQuizTemplate;
78 use LearnPress\TemplateHooks\CourseBuilder\Quiz\BuilderListQuizzesTemplate;
79 use LearnPress\TemplateHooks\CourseBuilder\Quiz\BuilderQuizTemplate;
80 use LearnPress\TemplateHooks\CourseBuilder\Settings\BuilderSettingsTemplate;
81 use LearnPress\TemplateHooks\Instructor\ListInstructorsTemplate;
82 use LearnPress\TemplateHooks\Instructor\SingleInstructorTemplate;
83 use LearnPress\TemplateHooks\Order\AdminOrderItemsTemplate;
84 use LearnPress\TemplateHooks\Order\AdminOrderListTemplate;
85 use LearnPress\TemplateHooks\Profile\ProfileCoursesTemplate;
86 use LearnPress\TemplateHooks\Profile\ProfileGeneralInfoTemplate;
87 use LearnPress\TemplateHooks\Profile\ProfileInstructorStatisticsTemplate;
88 use LearnPress\TemplateHooks\Profile\ProfileOrdersTemplate;
89 use LearnPress\TemplateHooks\Profile\ProfileOrderTemplate;
90 use LearnPress\TemplateHooks\Profile\ProfileQuizzesTemplate;
91 use LearnPress\TemplateHooks\Profile\ProfileStudentEnrolledTemplate;
92 use LearnPress\TemplateHooks\Profile\ProfileStudentStatisticsTemplate;
93 use LearnPress\TemplateHooks\Course\CourseAIAssistantTemplate;
94 use LearnPress\Widgets\LPRegisterWidget;
95 use LearnPress\WPGDPR\ErasePersonalData;
96 use LearnPress\WPGDPR\ExportPersonalData;
97 use LearnPress\Webhook\WebhookDispatcher;
98
99 defined( 'ABSPATH' ) || exit();
100
101 if ( ! class_exists( 'LearnPress' ) ) {
102 /**
103 * Class LearnPress
104 *
105 * Version 3.0.1
106 */
107 class LearnPress {
108 /**
109 * Current version of the plugin
110 *
111 * @var string
112 */
113 public $version = '';
114 /**
115 * Version database require, use for this LP source
116 *
117 * @var int
118 */
119 public $db_version = 5;
120
121 /**
122 * The single instance of the class
123 *
124 * @var LearnPress object
125 */
126 private static $_instance = null;
127
128 /**
129 * Store the session class
130 *
131 * @var LP_Session_Handler
132 */
133 public $session = null;
134
135 /**
136 * @var LP_Cart object
137 */
138 public $cart = false;
139
140 /**
141 * @var LP_Settings
142 */
143 public $settings = null;
144
145 /**
146 * @var array
147 */
148 public $query_vars = array();
149
150 /**
151 * @var array
152 */
153 public $global = array();
154
155 /**
156 * @var LP_Template
157 */
158 public $template = null;
159
160 /**
161 * @var LP_Core_API
162 */
163 public $api = null;
164
165 /**
166 * @var LP_Admin_Core_API
167 */
168 public $admin_api = null;
169
170 /**
171 * @var string
172 */
173 public $thim_core_version_require = '2.0.0';
174
175 public static $time_limit_default_of_sever = 0;
176
177 public static $doc_link = 'https://learnpresslms.com/docs/';
178
179 /**
180 * LearnPress constructor.
181 */
182 private function __construct() {
183 /*if ( isset( $_POST['action'] ) && 'heartbeat' === $_POST['action'] ) {
184 return;
185 }*/
186
187 try {
188 $this->prepare_before_handle();
189
190 if ( ! LP_Install::instance()->tables_install_done() ) {
191 return;
192 }
193
194 // Must handle in hook init of WordPress, when loaded plugins, theme, user.
195 add_action( 'init', [ $this, 'lp_main_handle' ], - 1000 );
196
197 // hooks .
198 $this->hooks();
199 } catch ( Throwable $e ) {
200 error_log( __METHOD__ . ': ' . $e->getMessage() );
201 }
202 }
203
204 /**
205 * Prepare before handle.
206 * 1.Load constants and includes files.
207 * 2.Get default time limit of server.
208 * 3.Update version of LP undefined.
209 *
210 * @return void
211 * @since 4.2.7.6
212 * @version 1.0.0
213 */
214 public function prepare_before_handle() {
215 // Define constant .
216 $this->plugin_defines();
217
218 self::$time_limit_default_of_sever = ini_get( 'max_execution_time' );
219
220 // Update for case compare version of LP if LEARNPRESS_VERSION undefined
221 $this->version = LEARNPRESS_VERSION;
222 if ( is_admin() ) {
223 $learn_press_version = get_option( 'learnpress_version', '' );
224 if ( $learn_press_version !== $this->version ) {
225 if ( empty( $learn_press_version ) ) { // Case user install new
226 // Set using modern layout for new installation.
227 update_option( 'learn_press_layout_single_course', 'modern' );
228 }
229
230 update_option( 'learnpress_version', $this->version );
231 }
232 }
233
234 // define table prefixes .
235 $this->define_tables();
236
237 // Include files .
238 $this->includes();
239 }
240
241 /**
242 * Define constant.
243 */
244 protected function plugin_defines() {
245 if ( ! defined( 'LP_PLUGIN_FILE' ) ) {
246 define( 'LP_PLUGIN_FILE', __FILE__ );
247 include_once 'inc/lp-constants.php';
248 }
249 }
250
251 /**
252 * Defines database table names.
253 */
254 public function define_tables() {
255 global $wpdb;
256
257 $tables = array(
258 'sessions',
259 'sections',
260 'section_items',
261 'user_items',
262 'user_itemmeta',
263 'user_item_results',
264 'order_items',
265 'order_itemmeta',
266 'quiz_questions',
267 'question_answers',
268 'question_answermeta',
269 );
270
271 foreach ( $tables as $short_name ) {
272 $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
273 $backward_key = 'learnpress_' . $short_name;
274 $wpdb->{$backward_key} = $table_name;
275 }
276 }
277
278 /**
279 * Includes needed files.
280 */
281 public function includes() {
282 include_once LP_PLUGIN_PATH . 'vendor/autoload.php';
283
284 // Include required files load anywhere, both frontend and backend.
285 $this->include_files_global();
286
287 // include files when LP ready run - after setup success .
288 if ( ! LP_Install::instance()->tables_install_done() ) {
289 return;
290 }
291
292 // Include required files Backend.
293 $this->include_files_admin();
294
295 // Include required files Frontend.
296 $this->include_files_frontend();
297
298 new LP_Query();
299 }
300
301 /**
302 * load files anywhere, both frontend and backend
303 *
304 * @return void
305 */
306 private function include_files_global() {
307
308 // Filter query .
309 include_once 'inc/Filters/class-lp-filter.php';
310 include_once 'inc/Filters/class-lp-post-type-filter.php';
311 include_once 'inc/Filters/class-lp-post-meta-filter.php';
312 include_once 'inc/Filters/class-lp-user-filter.php';
313 include_once 'inc/Filters/class-lp-course-filter.php';
314 include_once 'inc/Filters/class-lp-course-json-filter.php';
315 include_once 'inc/Filters/class-lp-order-filter.php';
316 include_once 'inc/Filters/class-lp-session-filter.php';
317 include_once 'inc/Filters/class-lp-section-filter.php';
318 include_once 'inc/Filters/class-lp-section-items-filter.php';
319 include_once 'inc/Filters/class-lp-question-filter.php';
320 include_once 'inc/Filters/class-lp-quiz-filter.php';
321 include_once 'inc/Filters/class-lp-user-items-filter.php';
322 include_once 'inc/Filters/class-lp-user-item-meta-filter.php';
323 include_once 'inc/Filters/class-lp-quiz-filter.php';
324 include_once 'inc/Filters/class-lp-quiz-questions-filter.php';
325 include_once 'inc/Filters/class-lp-question-answers-filter.php';
326 include_once 'inc/Filters/class-lp-question-answermeta-filter.php';
327
328 // Query Database .
329 include_once 'inc/Databases/class-lp-db.php';
330 include_once 'inc/Databases/class-lp-course-json-db.php';
331 include_once 'inc/Databases/class-lp-order-db.php';
332 include_once 'inc/Databases/class-lp-post-db.php';
333 include_once 'inc/Databases/class-lp-post-meta-db.php';
334 include_once 'inc/Databases/class-lp-user-db.php';
335 include_once 'inc/Databases/class-lp-course-db.php';
336 include_once 'inc/Databases/class-lp-lesson-db.php';
337 include_once 'inc/Databases/class-lp-section-db.php';
338 include_once 'inc/Databases/class-lp-section-items-db.php';
339 include_once 'inc/Databases/class-lp-quiz-db.php';
340 include_once 'inc/Databases/class-lp-quiz-questions-db.php';
341 include_once 'inc/Databases/class-lp-question-answers-db.php';
342 include_once 'inc/Databases/class-lp-sessions-db.php';
343 include_once 'inc/Databases/class-lp-question-db.php';
344 include_once 'inc/Databases/class-lp-user-items-db.php';
345 include_once 'inc/Databases/class-lp-user-item-meta-db.php';
346 include_once 'inc/Databases/class-lp-user-item-results-db.php';
347 include_once 'inc/Databases/class-thim-cache-db.php';
348 include_once 'inc/Databases/class-lp-material-db.php';
349 include_once 'inc/Databases/class-lp-statistics-db.php';
350
351 // File system .
352 include_once 'inc/class-lp-file-system.php';
353
354 // File helper
355 include_once 'inc/class-lp-helper.php';
356
357 // Template Hooks.
358 ListCoursesTemplate::instance();
359 ListCoursesRelatedTemplate::instance();
360 ListInstructorsTemplate::instance();
361 SingleCourseTemplate::instance();
362 SingleCourseOfflineTemplate::instance();
363 SingleCourseModernLayout::instance();
364 SingleCourseClassicTemplate::instance();
365 SingleInstructorTemplate::instance();
366 ProfileInstructorStatisticsTemplate::instance();
367 ProfileStudentStatisticsTemplate::instance();
368 ProfileOrdersTemplate::instance();
369 ProfileOrderTemplate::instance();
370 ProfileGeneralInfoTemplate::instance();
371 FilterCourseTemplate::instance();
372 ProfileQuizzesTemplate::instance();
373 CourseBuilderTemplate::instance();
374 BuilderCourseTemplate::instance();
375 BuilderListCoursesTemplate::instance();
376 BuilderDashboardTemplate::instance();
377 BuilderSettingsTemplate::instance();
378 BuilderDashboardAjax::instance();
379 BuilderEditCourseTemplate::instance();
380 BuilderLessonTemplate::instance();
381 BuilderListLessonsTemplate::instance();
382 BuilderEditLessonTemplate::instance();
383 BuilderQuizTemplate::instance();
384 BuilderListQuizzesTemplate::instance();
385 BuilderEditQuizTemplate::instance();
386 BuilderQuestionTemplate::instance();
387 BuilderListQuestionsTemplate::instance();
388 BuilderEditQuestionTemplate::instance();
389 BuilderPopupTemplate::instance();
390 ProfileCoursesTemplate::instance();
391 ProfileStudentEnrolledTemplate::instance();
392
393 // Admin template hooks.
394 AdminEditCurriculumTemplate::instance();
395 AdminEditSettingTemplate::instance();
396 AdminEditQizTemplate::instance();
397 AdminEditQuestionTemplate::instance();
398 CourseMaterialTemplate::instance();
399 CourseAIAssistantTemplate::instance();
400 AdminOrderItemsTemplate::instance();
401 AdminOrderListTemplate::instance();
402 AdminCreateCourseAITemplate::instance();
403 AdminEditWithAITemplate::instance();
404 AdminEditCourseCurriculumWithAITemplate::instance();
405 AdminListStudentsEnrolled::instance();
406 AdminStatisticsReportTable::instance();
407 FilterOptionsProvider::register_flush_hooks();
408 // WP GDPR
409 ErasePersonalData::instance();
410 ExportPersonalData::instance();
411
412 // Models
413 include_once 'inc/Models/class-lp-rest-response.php';
414 include_once 'inc/Models/steps/class-lp-group-step.php';
415 include_once 'inc/Models/steps/class-lp-step.php';
416 include_once 'inc/Models/class-lp-course-extra-info-fast-query-model.php';
417
418 // Handle steps.
419 include_once 'inc/handle-steps/class-lp-handle-steps.php';
420 include_once 'inc/handle-steps/class-lp-handle-upgrade-db-steps.php';
421
422 // LP Cache
423 include_once 'inc/cache/class-lp-cache.php';
424 include_once 'inc/cache/class-lp-courses-cache.php';
425 include_once 'inc/cache/class-lp-course-cache.php';
426 include_once 'inc/cache/class-lp-quiz-cache.php';
427 include_once 'inc/cache/class-lp-question-cache.php';
428 include_once 'inc/cache/class-lp-session-cache.php';
429 include_once 'inc/cache/class-lp-settings-cache.php';
430 include_once 'inc/cache/class-lp-user-items-cache.php';
431
432 // Background processes.
433 LPBackgroundTrigger::instance();
434 include_once 'inc/libraries/wp-background-process/wp-background-processing.php';
435 include_once 'inc/background-process/abstract-lp-async-request.php';
436 //include_once 'inc/background-process/abstract-lp-async-task.php';
437 include_once 'inc/background-process/class-lp-background-single-course.php';
438 include_once 'inc/background-process/class-lp-background-single-email.php';
439
440 // Assets object
441 include_once 'inc/class-lp-asset-key.php';
442 include_once 'inc/abstracts/abstract-assets.php';
443
444 // Debug class
445 include_once 'inc/class-lp-debug.php';
446
447 include_once 'inc/class-lp-settings.php';
448 include_once 'inc/abstract-settings.php';
449 include_once 'inc/settings/abstract-settings-page.php';
450 include_once 'inc/settings/class-lp-settings-courses.php';
451 include_once 'inc/class-lp-global.php';
452 include_once 'inc/class-lp-datetime.php';
453
454 // Register custom-post-type and taxonomies .
455 /*include_once 'inc/custom-post-types/abstract.php';
456 include_once 'inc/custom-post-types/course.php';
457 include_once 'inc/custom-post-types/lesson.php';
458 include_once 'inc/custom-post-types/quiz.php';
459 include_once 'inc/custom-post-types/question.php';
460 include_once 'inc/custom-post-types/order.php';*/
461
462 include_once 'inc/interfaces/interface-curd.php';
463 include_once 'inc/abstracts/abstract-array-access.php';
464 include_once 'inc/abstracts/abstract-object-data.php';
465 include_once 'inc/abstracts/abstract-post-data.php';
466
467 include_once 'inc/curds/class-lp-course-curd.php';
468 include_once 'inc/curds/class-lp-section-curd.php';
469 include_once 'inc/curds/class-lp-lesson-curd.php';
470 include_once 'inc/curds/class-lp-quiz-curd.php';
471 include_once 'inc/curds/class-lp-question-curd.php';
472 include_once 'inc/curds/class-lp-order-curd.php';
473 include_once 'inc/curds/class-lp-user-curd.php';
474 include_once 'inc/curds/class-lp-user-item-curd.php';
475
476 include_once 'inc/course/class-lp-course-item.php';
477 include_once 'inc/question/class-lp-question.php';
478 include_once 'inc/course/class-lp-course-section.php';
479 include_once 'inc/course/class-lp-course-no-required-enroll.php';
480 include_once 'inc/user-item/class-lp-user-item.php';
481 include_once 'inc/user-item/class-lp-user-item-course.php';
482
483 include_once 'inc/lp-deprecated.php'; // Will remove if Eduma and guest update all 4.0.0
484 include_once 'inc/lp-core-functions.php';
485 include_once 'inc/class-lp-autoloader.php';
486
487 include_once 'inc/lp-webhooks.php'; // Addon learnpress-2checkout-payment v4.0.1 is using, when update v4.0.2 don't need load it.
488 include_once 'inc/class-lp-request-handler.php';
489
490 include_once 'inc/admin/helpers/class-lp-plugins-helper.php';
491
492 // Todo: tungnx check those files.
493 include_once 'inc/abstracts/abstract-object-query.php';
494 include_once 'inc/class-lp-course-query.php';
495 include_once 'inc/abstracts/abstract-addon.php';
496 include_once 'inc/class-lp-thumbnail-helper.php';
497 include_once 'inc/cache.php';
498
499 // Class handle check db of LP need to upgrade?
500 include_once 'inc/admin/class-lp-updater.php';
501
502 include_once 'inc/course/lp-course-functions.php';
503 include_once 'inc/course/abstract-course.php';
504 include_once 'inc/course/class-lp-course.php';
505 include_once 'inc/quiz/lp-quiz-functions.php';
506 include_once 'inc/quiz/class-lp-quiz.php';
507 //include_once 'inc/lesson/lp-lesson-functions.php';
508 include_once 'inc/order/lp-order-functions.php';
509 include_once 'inc/order/class-lp-order.php';
510
511 include_once 'inc/user/lp-user-functions.php';
512 include_once 'inc/user/class-lp-user-factory.php';
513 WebhookDispatcher::instance();
514 include_once 'inc/user/abstract-lp-user.php';
515 include_once 'inc/user/class-lp-user.php';
516 include_once 'inc/user/class-lp-profile.php';
517 include_once 'inc/user-item/class-lp-user-item.php';
518 include_once 'inc/user-item/class-lp-user-item-course.php';
519 include_once 'inc/user-item/class-lp-user-item-quiz.php';
520 include_once 'inc/user-item/class-lp-quiz-results.php';
521
522 // Shortcodes.
523 SingleInstructorShortcode::instance();
524 ListInstructorsShortcode::instance();
525 CourseMaterialShortcode::instance();
526 CourseButtonShortcode::instance();
527 FilterCourseShortcode::instance();
528 ListCoursesShortcode::instance();
529 //ListCourseRecentShortcode::instance();
530 include_once 'inc/class-lp-shortcodes.php';
531
532 // include template functions .
533 include_once 'inc/lp-template-functions.php';
534 include_once 'inc/templates/abstract-template.php';
535 //include_once 'inc/class-lp-template.php';
536
537 // Cart
538 include_once 'inc/cart/class-lp-cart.php';
539 include_once 'inc/cart/lp-cart-functions.php';
540
541 // Block Templates
542 //include_once 'inc/block-template/class-abstract-block-template.php';
543 //include_once 'inc/block-template/class-block-template-handle.php';
544 GutenbergHandleMain::instance();
545
546 // API
547 include_once 'inc/abstracts/abstract-rest-api.php';
548 include_once 'inc/abstracts/abstract-rest-controller.php';
549 include_once 'inc/rest-api/class-lp-core-api.php';
550 include_once 'inc/rest-api/class-lp-admin-core-api.php';
551
552 /** Jwt */
553 include_once 'inc/jwt/class-jwt-auth.php';
554
555 LPRegisterWidget::instance();
556 include_once 'inc/class-lp-widget.php';
557 include_once 'inc/lp-widget-functions.php';
558
559 // TODO: update frontend editor before move to function include_files_admin.
560 include_once 'inc/admin/views/meta-boxes/class-lp-meta-box.php';
561
562 include_once 'inc/class-lp-page-controller.php';
563 LP_Page_Controller::instance();
564
565 include_once 'inc/gateways/class-lp-gateway-abstract.php';
566 include_once 'inc/gateways/subscriptions/class-lp-subscription-manager.php';
567 include_once 'inc/gateways/class-lp-gateways.php';
568 }
569
570 /**
571 * Include file run on backend
572 */
573 private function include_files_admin() {
574 if ( ! is_admin() ) {
575 return;
576 }
577
578 include_once 'inc/admin/class-lp-admin-ajax.php';
579
580 include_once 'inc/admin/class-lp-admin-notice.php';
581
582 // File handle install LP
583 include_once 'inc/class-lp-install.php';
584
585 // Meta box helper
586 include_once 'inc/admin/meta-box/class-lp-meta-box-helper.php';
587
588 // include_once 'inc/admin/class-lp-admin.php';
589 // include_once 'inc/admin/settings/abstract-settings-page.php';
590 }
591
592 /**
593 * Include file run on frontend
594 */
595 private function include_files_frontend() {
596 if ( is_admin() ) {
597 return;
598 }
599
600 include_once 'inc/class-lp-assets.php';
601
602 include_once 'inc/course/class-model-user-can-view-course-item.php';
603
604 include_once 'inc/class-lp-ajax.php';
605
606 include_once 'inc/class-lp-session-handler.php';
607 }
608
609 /**
610 * Main instance of LearnPress.
611 * Must load on "init" hook of WordPress.
612 * 1. Load text domain.
613 * 2. Handle lp ajax.
614 *
615 * @return void
616 * @version 4.2.7.6
617 * @version 1.0.2
618 */
619 public function lp_main_handle() {
620 try {
621 // Load text domain.
622 $this->load_plugin_text_domain();
623
624 // Register custom post type and taxonomies .
625 include_once 'inc/custom-post-types/abstract.php';
626 include_once 'inc/custom-post-types/course.php';
627 include_once 'inc/custom-post-types/lesson.php';
628 include_once 'inc/custom-post-types/quiz.php';
629 include_once 'inc/custom-post-types/question.php';
630 include_once 'inc/custom-post-types/order.php';
631
632 // Polylang
633 if ( defined( 'POLYLANG_VERSION' ) ) {
634 include_once 'inc/ExternalPlugin/Polylang/class-lp-polylang.php';
635 LP_Polylang::instance();
636 }
637
638 // For plugin Elementor
639 if ( defined( 'ELEMENTOR_VERSION' ) ) {
640 LPElementor::instance();
641 }
642
643 // For plugin WPSEO
644 if ( defined( 'WPSEO_FILE' ) ) {
645 LPYoastSeo::instance();
646 }
647
648 // For plugin RankMath
649 if ( defined( 'RANK_MATH_VERSION' ) ) {
650 LPRankMath::instance();
651 }
652
653 $this->api = new LP_Core_API();
654 $this->admin_api = new LP_Admin_Core_API();
655 $this->get_session();
656 $this->settings = $this->settings();
657 $this->get_cart();
658
659 // Init emails
660 LP_Emails::instance();
661 // Email hook notify
662 include_once 'inc/emails/class-lp-email-hooks.php';
663
664 if ( is_admin() ) {
665 $this->check_addons_version_valid();
666
667 include_once 'inc/admin/class-lp-admin.php';
668 }
669
670 // let third parties know that we're ready .
671 do_action( 'learn-press/ready' );
672
673 // For addon sorting choice old <= v4.0.1
674 /*if ( class_exists( 'LP_Addon_Sorting_Choice_Preload' ) ) {
675 if ( version_compare( LP_ADDON_SORTING_CHOICE_VER, '4.0.1', '<=' ) ) {
676 $lp_addon_sorting_choice = new LP_Addon_Sorting_Choice();
677 $lp_addon_sorting_choice->init();
678 }
679 }*/
680
681 /**
682 * Init gateways, to load all payment gateways, catch callback.
683 * Must be call after learn-press/ready to register hook of addon.
684 */
685 LP_Gateways::instance();
686
687 /**
688 * Fixed temporary for emails of Announcement v4.0.6, Assignment v4.1.1 addons.
689 * @since 4.2.7.4
690 * When 2 addons update to new version, will remove this code.
691 */
692 /*if ( class_exists( 'LP_Addon_Announcements_Preload' ) ) {
693 if ( version_compare( LP_ADDON_ANNOUNCEMENTS_VER, '4.0.6', '<=' ) ) {
694 $addon_announcement = LP_Addon_Announcements_Preload::$addon;
695 $addon_announcement->emails_setting();
696 }
697 }*/
698 /*if ( class_exists( 'LP_Addon_Assignment_Preload' ) ) {
699 if ( version_compare( LP_ADDON_ASSIGNMENT_VER, '4.1.1', '<=' ) ) {
700 $addon_assignment = LP_Addon_Assignment_Preload::$addon;
701 $addon_assignment->emails_setting();
702 }
703 }*/
704 } catch ( Throwable $e ) {
705 LP_Debug::error_log( $e );
706 }
707 }
708
709 /**
710 * Check version addons valid version require.
711 * If not valid will be to deactivate.
712 * Reload page, so not affect to hook "learn-press/ready"
713 */
714 public function check_addons_version_valid() {
715 $addons_valid = true;
716 $plugins = get_option( 'active_plugins' );
717
718 $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
719 foreach ( $list_lp_addon_activated as $lp_addon ) {
720 $lp_addon_info = get_file_data(
721 WP_PLUGIN_DIR . '/' . $lp_addon,
722 array(
723 'Require_LP_Version' => 'Require_LP_Version',
724 'Version' => 'Version',
725 )
726 );
727
728 $lp_addon_version = $lp_addon_info['Version'];
729
730 $addon = new LP_Addon();
731 $addon->version = $lp_addon_version;
732 $addon->plugin_base = $lp_addon;
733 $addon->require_version = $lp_addon_info['Require_LP_Version'];
734 $addon_valid = $addon->check_require_version_addon();
735
736 if ( $addons_valid ) {
737 //$addon_valid = $addon->check_require_version_lp();
738 }
739
740 if ( ! $addon_valid ) {
741 $addons_valid = false;
742 }
743 }
744 }
745
746 /**
747 * Initial common hooks
748 */
749 public function hooks() {
750 add_action( 'init', array( $this, 'maybe_init_mcp_abilities' ), 20 );
751
752 /**
753 * Handle lp ajax.
754 * Set priority after register_post_type to register capabilities for post type of LP.
755 */
756 add_action(
757 'init',
758 function () {
759 LoadContentViaAjax::catch_lp_ajax();
760 LessonAjax::catch_lp_ajax();
761 EditCurriculumAjax::catch_lp_ajax();
762 EditQuizAjax::catch_lp_ajax();
763 EditQuestionAjax::catch_lp_ajax();
764 SendEmailAjax::catch_lp_ajax();
765 RefundOrderAjax::catch_lp_ajax();
766 CourseBuilderAjax::catch_lp_ajax();
767 OpenAiAjax::catch_lp_ajax();
768 AIAssistantAjax::catch_lp_ajax();
769 ExportOrderCSVAjax::catch_lp_ajax();
770 McpApiKeysAjax::catch_lp_ajax();
771 WebhooksAjax::catch_lp_ajax();
772 CBEditCourseAjax::catch_lp_ajax();
773
774 do_action( 'learn-press/register-ajax-handlers' );
775 },
776 11
777 );
778
779 // Add links setting|document|addon on plugins page.
780 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
781
782 register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
783 register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
784
785 add_action(
786 'plugin_loaded',
787 function ( $plugin ) {
788 // For check wp_remote call normally of WP
789 if ( ! empty( LP_Request::get_param( 'lp_test_wp_remote' ) ) ) {
790 echo '[TEST_REMOTE]';
791 die;
792 }
793 }
794 );
795
796 // Check require version thim-core on Backend.
797 if ( is_admin() ) {
798 add_action( 'before_thim_core_init', array( $this, 'check_thim_core_version_require' ) );
799 }
800
801 // Save key purchase addon when install via file download from Thimpress.
802 add_action(
803 'upgrader_process_complete',
804 function ( $plugin_upgrader ) {
805 if ( ! empty( $plugin_upgrader->result ) ) {
806 $res = $plugin_upgrader->result;
807 $path_source = $res['destination'] ?? '';
808 if ( empty( $path_source ) ) {
809 return;
810 }
811
812 $key_purchase_path = realpath( $path_source . '/purchase-code.txt' );
813 if ( file_exists( $key_purchase_path ) ) {
814 $purchase_code_content = file_get_contents( $key_purchase_path );
815 if ( empty( $purchase_code_content ) ) {
816 return;
817 }
818
819 $addon_slug = $res['destination_name'] ?? '';
820 if ( empty( $addon_slug ) ) {
821 return;
822 }
823
824 // Call active purchase code for site.
825 LP_Manager_Addons::instance()->active_site( $addon_slug, $purchase_code_content );
826 }
827 }
828 }
829 );
830
831 // Clear cache UserModel when save user.
832 add_action(
833 'wp_update_user',
834 function ( $user_id ) {
835 $user = UserModel::find( $user_id, true );
836 $user->clean_caches();
837 }
838 );
839
840 // For temporary fix issue security of wp comments. Is it error of WP, not LP, LP only call to comments_template function.
841 add_filter(
842 'comments_array',
843 function ( $comments_flat, $post_id ) {
844 // Check if post type is course or item's course (lesson, quiz...)
845 $post_type = get_post_type( $post_id );
846 $course_item_types = CourseModel::item_types_support();
847 $course_item_types[] = LP_COURSE_CPT;
848 if ( ! in_array( $post_type, $course_item_types ) ) {
849 return $comments_flat;
850 }
851
852 foreach ( $comments_flat as $key => $comment ) {
853 $comment->comment_content = wp_kses_post( $comment->comment_content );
854 $comments_flat[ $key ] = $comment;
855 }
856
857 return $comments_flat;
858 },
859 10,
860 2
861 );
862 }
863
864 /**
865 * Add links to Documentation and Extensions in plugin's list of action links
866 *
867 * @param array $links Array of action links
868 *
869 * @return array
870 * @since 4.3.11
871 *
872 */
873 public function plugin_links( array $links ): array {
874 $links[] = sprintf( '<a href="%s">%s</a>', admin_url( 'admin.php?page=learn-press-settings' ), __( 'Settings', 'learnpress' ) );
875 $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', LearnPress::$doc_link, __( 'Documentation', 'learnpress' ) );
876 $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', get_admin_url() . '/admin.php?page=learn-press-addons', __( 'Add-ons', 'learnpress' ) );
877
878 return $links;
879 }
880
881 /**
882 * Trigger this function while activating Learnpress.
883 *
884 * @since 3.0.0
885 * @version 4.1.4.1
886 */
887 public function on_activate() {
888 LP_Install::instance()->on_activate();
889 }
890
891 /**
892 * Trigger this function while deactivating Learnpress.
893 *
894 * $since 3.0.0
895 *
896 * @hook learn_press_deactivate
897 */
898 public function on_deactivate() {
899 do_action( 'learn-press/deactivate', $this );
900 }
901
902 /**
903 * Conditionally bootstrap MCP abilities.
904 *
905 * @return void
906 */
907 public function maybe_init_mcp_abilities() {
908 if ( LP_Settings::get_option( 'enable_mcp_integration', 'no' ) !== 'yes' ) {
909 return;
910 }
911
912 ApiKeyAuthenticator::init();
913 Abilities::init();
914 }
915
916 /**
917 * Handle load text domain for LearnPress.
918 *
919 * @since 4.2.7.4
920 * @version 1.0.1
921 */
922 public function load_plugin_text_domain() {
923 /*$locale = determine_locale();
924 $locale = apply_filters( 'plugin_locale', $locale, 'learnpress' );
925
926 $plugin_translation_path = WP_LANG_DIR . '/plugins/learnpress-' . $locale . '.mo';
927 $custom_translation_path = WP_LANG_DIR . '/learnpress/learnpress-' . $locale . '.mo';
928 if ( is_readable( $custom_translation_path ) ) {
929 unload_textdomain( LP_TEXT_DOMAIN );
930 load_textdomain( LP_TEXT_DOMAIN, $custom_translation_path );
931 load_textdomain( LP_TEXT_DOMAIN, $plugin_translation_path );
932 }*/
933
934 load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
935 }
936
937 /**
938 * Get instance of class LP_Template.
939 *
940 * @param string $type
941 *
942 * @return LP_Template_Course|LP_Template_Profile|LP_Template_General|LP_Abstract_Template|LP_Template
943 *
944 * @throws Exception
945 * @since 3.3.0
946 */
947 public function template( $type = '' ) {
948 $this->template = LP_Template::instance();
949 $templates = (array) $this->template->get_templates();
950
951 return $templates[ $type ] ?? $this->template;
952 }
953
954 /**
955 * Get session object instance.
956 *
957 * @return mixed
958 */
959 public function get_session() {
960 if ( ! $this->session ) {
961 $this->session = LP_Session_Handler::instance();
962 }
963
964 return $this->session;
965 }
966
967 /**
968 * Get settings object instance.
969 *
970 * @return bool|LP_Settings
971 */
972 public function settings() {
973 return LP_Settings::instance();
974 }
975
976 /**
977 * Get cart object instance for online learning market.
978 *
979 * @return LP_Cart
980 */
981 public function get_cart(): LP_Cart {
982 if ( ! $this->cart ) {
983 $this->cart = LP_Cart::instance();
984 }
985
986 return $this->cart;
987 }
988
989 /**
990 * Get the plugin url.
991 *
992 * @param string $sub_dir
993 *
994 * @return string
995 */
996 public function plugin_url( $sub_dir = '' ) {
997 return LP_PLUGIN_URL . ( $sub_dir ? "{$sub_dir}" : '' );
998 }
999
1000 /**
1001 * Get the plugin path.
1002 *
1003 * @param string $sub_dir
1004 *
1005 * @return string
1006 */
1007 public function plugin_path( $sub_dir = '' ) {
1008 return LP_PLUGIN_PATH . ( $sub_dir ? "{$sub_dir}" : '' );
1009 }
1010
1011 /**
1012 * Get checkout object instance
1013 *
1014 * @return LP_Checkout
1015 */
1016 public function checkout() {
1017 return LP_Checkout::instance();
1018 }
1019
1020 /**
1021 * Short way to return image file is located in LearnPress directory.
1022 *
1023 * @param string
1024 *
1025 * @return string
1026 */
1027 public function image( $file ) {
1028 if ( ! preg_match( '/.(jpg|png)$/', $file ) ) {
1029 $file .= '.jpg';
1030 }
1031
1032 return $this->plugin_url( "assets/images/{$file}" );
1033 }
1034
1035 /**
1036 * Check require version thim-core
1037 */
1038 public function check_thim_core_version_require() {
1039 // Get thim-core info for LP check .
1040 include_once ABSPATH . 'wp-admin/includes/plugin.php';
1041 $thim_core_info = get_file_data(
1042 WP_PLUGIN_DIR . '/thim-core/thim-core.php',
1043 array(
1044 'Name' => 'Plugin Name',
1045 'Require_LP_Version' => 'Require_LP_Version',
1046 'Version' => 'Version',
1047 )
1048 );
1049
1050 if ( version_compare( $this->thim_core_version_require, $thim_core_info['Version'], '>' ) ) {
1051 deactivate_plugins( 'thim-core/thim-core.php' );
1052
1053 if ( isset( $_GET['activate'] ) ) {
1054 unset( $_GET['activate'] );
1055 }
1056
1057 $message = sprintf(
1058 '%s %s You can download %s. Read guide on %s',
1059 'LP4 require version Thim-core:',
1060 $this->thim_core_version_require,
1061 '<a href="https://thimpresswp.github.io/thim-core/thim-core.zip">latest version</a>',
1062 '<a href="https://docspress.thimpress.com/upgrade-database-how-to-fix-some-issue/">here</a>'
1063 );
1064 ?>
1065 <div class="notice notice-error">
1066 <p><?php echo wp_kses_post( $message ); ?></p>
1067 </div>
1068 <?php
1069 die;
1070 }
1071 }
1072
1073 /**
1074 * Main plugin instance.
1075 *
1076 * @return LearnPress
1077 */
1078 public static function instance() {
1079 if ( is_null( self::$_instance ) ) {
1080 self::$_instance = new self();
1081 }
1082
1083 return self::$_instance;
1084 }
1085 }
1086 }
1087
1088 /**
1089 * Short way to load main instance of plugin
1090 *
1091 * @return LearnPress
1092 * @since 1.0
1093 * @author thimpress
1094 */
1095 function LP() {
1096 return LearnPress::instance();
1097 }
1098
1099 /**
1100 * Done! entry point of the plugin
1101 * Create new instance of LearnPress and put it to global
1102 */
1103 $GLOBALS['LearnPress'] = LearnPress::instance();
1104
1105 // Load template hooks here, before theme add hooks remove.
1106 // Load here because this file call LearnPress::instance(), loop call.
1107 require_once 'inc/lp-template-hooks.php';
1108