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