PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.5
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.5
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.5, at learnpress.php

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