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

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

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