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

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