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