PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9
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 4.1.7.3.2 All 140 releases
← All changes | learnpress.php +674 -438 4.1.7 → 4.4.9 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.7
7 + * Version: 4.4.9
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,18 +13,100 @@
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 *
@@ -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,194 +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';
231 - require_once 'inc/filters/class-lp-question-answers-filter.php';
232 - require_once 'inc/filters/class-lp-question-answermeta-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';
233 345
234 346 // Query Database .
235 - require_once 'inc/databases/class-lp-db.php';
236 - require_once 'inc/databases/class-lp-order-db.php';
237 - require_once 'inc/databases/class-lp-course-db.php';
238 - require_once 'inc/databases/class-lp-lesson-db.php';
239 - require_once 'inc/databases/class-lp-section-db.php';
240 - require_once 'inc/databases/class-lp-section-items-db.php';
241 - require_once 'inc/databases/class-lp-quiz-db.php';
242 - require_once 'inc/databases/class-lp-quiz-questions-db.php';
243 - require_once 'inc/databases/class-lp-question-answers-db.php';
244 - require_once 'inc/databases/class-lp-sessions-db.php';
245 - require_once 'inc/databases/class-lp-question-db.php';
246 - require_once 'inc/databases/class-lp-user-items-db.php';
247 - 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';
248 368
249 - // Read files config on folder config .
250 - require_once 'inc/Helper/Config.php';
251 -
252 369 // File system .
253 - require_once 'inc/class-lp-file-system.php';
370 + include_once 'inc/class-lp-file-system.php';
254 371
255 372 // File helper
256 - require_once 'inc/class-lp-helper.php';
373 + include_once 'inc/class-lp-helper.php';
257 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 +
258 433 // Models
259 - require_once 'inc/models/class-lp-rest-response.php';
260 - include_once 'inc/models/steps/class-lp-group-step.php';
261 - include_once 'inc/models/steps/class-lp-step.php';
262 - 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';
263 438
264 439 // Handle steps.
265 - require_once 'inc/handle-steps/class-lp-handle-steps.php';
266 - 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';
267 442
268 443 // LP Cache
269 - require_once 'inc/cache/class-lp-cache.php';
270 - require_once 'inc/cache/class-lp-courses-cache.php';
271 - require_once 'inc/cache/class-lp-course-cache.php';
272 - 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';
273 452
274 453 // Background processes.
275 - require_once 'inc/libraries/wp-background-process/wp-background-processing.php';
276 - require_once 'inc/background-process/abstract-lp-async-request.php';
277 - require_once 'inc/background-process/class-lp-background-single-course.php';
278 - 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';
279 460
280 461 // Assets object
281 - require_once 'inc/class-lp-asset-key.php';
282 - require_once 'inc/abstracts/abstract-assets.php';
462 + include_once 'inc/class-lp-asset-key.php';
463 + include_once 'inc/abstracts/abstract-assets.php';
283 464
284 465 // Debug class
285 - require_once 'inc/class-lp-debug.php';
466 + include_once 'inc/class-lp-debug.php';
286 467
287 - require_once 'inc/class-lp-settings.php';
288 - require_once 'inc/abstract-settings.php';
289 - require_once 'inc/settings/abstract-settings-page.php';
290 - require_once 'inc/settings/class-lp-settings-courses.php';
291 - require_once 'inc/class-lp-global.php';
292 - 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';
293 474
294 475 // Register custom-post-type and taxonomies .
295 - require_once 'inc/custom-post-types/abstract.php';
296 - require_once 'inc/custom-post-types/course.php';
297 - require_once 'inc/custom-post-types/lesson.php';
298 - require_once 'inc/custom-post-types/quiz.php';
299 - require_once 'inc/custom-post-types/question.php';
300 - 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';*/
301 482
302 - require_once 'inc/interfaces/interface-curd.php';
303 - require_once 'inc/abstracts/abstract-array-access.php';
304 - require_once 'inc/abstracts/abstract-object-data.php';
305 - 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';
306 487
307 - require_once 'inc/curds/class-lp-course-curd.php';
308 - require_once 'inc/curds/class-lp-section-curd.php';
309 - require_once 'inc/curds/class-lp-lesson-curd.php';
310 - require_once 'inc/curds/class-lp-quiz-curd.php';
311 - require_once 'inc/curds/class-lp-question-curd.php';
312 - require_once 'inc/curds/class-lp-order-curd.php';
313 - require_once 'inc/curds/class-lp-user-curd.php';
314 - 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';
315 496
316 - require_once 'inc/course/class-lp-course-item.php';
317 - require_once 'inc/question/class-lp-question.php';
318 - require_once 'inc/course/class-lp-course-section.php';
319 - require_once 'inc/course/class-lp-course-no-required-enroll.php';
320 - require_once 'inc/user-item/class-lp-user-item.php';
321 - 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';
322 503
323 - require_once 'inc/lp-deprecated.php'; // Will remove if Eduma and guest update all 4.0.0
324 - require_once 'inc/lp-core-functions.php';
325 - 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';
326 507
327 - require_once 'inc/lp-webhooks.php';
328 - 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';
329 510
330 - require_once 'inc/admin/helpers/class-lp-plugins-helper.php';
331 -
332 511 // Todo: tungnx check those files.
333 - require_once 'inc/abstracts/abstract-object-query.php';
334 - require_once 'inc/class-lp-course-query.php';
335 - require_once 'inc/abstracts/abstract-addon.php';
336 - require_once 'inc/class-lp-thumbnail-helper.php';
337 - 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';
338 517
339 518 // Class handle check db of LP need to upgrade?
340 - require_once 'inc/admin/class-lp-updater.php';
519 + include_once 'inc/admin/class-lp-updater.php';
341 520
342 - require_once 'inc/course/lp-course-functions.php';
343 - require_once 'inc/course/abstract-course.php';
344 - require_once 'inc/course/class-lp-course.php';
345 - //require_once 'inc/course/class-lp-course-utils.php';
346 - require_once 'inc/quiz/lp-quiz-functions.php';
347 - require_once 'inc/quiz/class-lp-quiz.php';
348 - require_once 'inc/lesson/lp-lesson-functions.php';
349 - require_once 'inc/order/lp-order-functions.php';
350 - 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';
351 529
352 - require_once 'inc/user/lp-user-functions.php';
353 - require_once 'inc/user/class-lp-user-factory.php';
354 - require_once 'inc/user/abstract-lp-user.php';
355 - require_once 'inc/user/class-lp-user.php';
356 - require_once 'inc/user/class-lp-profile.php';
357 - require_once 'inc/user-item/class-lp-user-item.php';
358 - require_once 'inc/user-item/class-lp-user-item-course.php';
359 - require_once 'inc/user-item/class-lp-user-item-quiz.php';
360 - require_once 'inc/user-item/class-lp-quiz-results.php';
361 - 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';
362 540
363 - 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';
364 550
365 551 // include template functions .
366 - require_once 'inc/lp-template-functions.php';
367 - require_once 'inc/templates/abstract-template.php';
368 - //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';
369 555
370 556 // Cart
371 - require_once 'inc/cart/class-lp-cart.php';
372 - 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';
373 559
374 560 // Block Templates
375 - require_once 'inc/block-template/class-block-until.php';
376 - 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();
377 564
378 565 // API
379 - require_once 'inc/abstracts/abstract-rest-api.php';
380 - require_once 'inc/abstracts/abstract-rest-controller.php';
381 - require_once 'inc/rest-api/class-lp-core-api.php';
382 - 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';
383 570
384 - // include_once 'inc/theme-support/class-theme-support-base.php';
385 - // include_once 'inc/class-lp-theme-support.php';
386 -
387 571 /** Jwt */
388 572 include_once 'inc/jwt/class-jwt-auth.php';
389 573
390 - require_once 'inc/class-lp-widget.php';
391 - 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';
392 577
393 - // For plugin Elementor
394 - if ( defined( 'ELEMENTOR_VERSION' ) ) {
395 - require_once 'inc/external-plugin/elementor/class-lp-elementor.php';
396 - }
397 -
398 578 // TODO: update frontend editor before move to function include_files_admin.
399 - 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';
400 580
401 - require_once 'inc/class-lp-page-controller.php';
581 + include_once 'inc/class-lp-page-controller.php';
582 + LP_Page_Controller::instance();
402 583
403 - require_once 'inc/gateways/class-lp-gateway-abstract.php';
404 - 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';
405 587 }
406 588
407 589 /**
408 590 * Include file run on backend
@@ -411,20 +593,18 @@
411 593 if ( ! is_admin() ) {
412 594 return;
413 595 }
414 596
415 - require_once 'inc/admin/class-lp-admin-notice.php';
597 + include_once 'inc/admin/class-lp-admin-ajax.php';
416 598
417 599 // File handle install LP
418 - require_once 'inc/class-lp-install.php';
600 + include_once 'inc/class-lp-install.php';
419 601
420 602 // Meta box helper
421 - 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';
422 604
423 - require_once 'inc/admin/class-lp-admin.php';
424 - // require_once 'inc/admin/settings/abstract-settings-page.php';
425 -
426 - 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';
427 607 }
428 608
429 609 /**
430 610 * Include file run on frontend
@@ -433,121 +613,312 @@
433 613 if ( is_admin() ) {
434 614 return;
435 615 }
436 616
437 - require_once 'inc/class-lp-assets.php';
617 + include_once 'inc/class-lp-assets.php';
438 618
439 - 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';
440 620
441 - 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';
442 624 }
443 625
444 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 + /**
445 764 * Initial common hooks
446 765 */
447 - public function init_hooks() {
448 - if ( 0 !== strcmp( LP_PLUGIN_BASENAME, 'learnpress/learnpress.php' ) ) {
449 - add_action( 'admin_notices', array( $this, 'error' ) );
450 - }
766 + public function hooks() {
767 + add_action( 'init', array( $this, 'maybe_init_mcp_abilities' ), 20 );
451 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 +
452 800 // Add links setting|document|addon on plugins page.
453 801 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
454 802
455 - register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
456 - register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
457 - // 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 + );*/
458 813
459 - if ( ! LP_Install::instance()->tables_install_done() ) {
460 - 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' ) );
461 817 }
462 818
463 - add_action( 'wp_loaded', array( $this, 'wp_loaded' ), 20 );
464 - add_action( 'after_setup_theme', array( $this, 'setup_theme' ) );
465 - add_action( 'plugins_loaded', array( $this, 'plugin_loaded' ), - 10 );
466 - // add_action( 'init', array( $this, 'wp_init' ), 10 );
819 + // 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( $plugin_upgrader->result ) ) {
824 + $res = $plugin_upgrader->result;
825 + $path_source = $res['destination'] ?? '';
826 + if ( empty( $path_source ) ) {
827 + return;
828 + }
467 829
468 - // Check require version thim-core.
469 - add_action( 'before_thim_core_init', array( $this, 'check_thim_core_version_require' ) );
830 + $key_purchase_path = realpath( $path_source . '/purchase-code.txt' );
831 + if ( file_exists( $key_purchase_path ) ) {
832 + $purchase_code_content = file_get_contents( $key_purchase_path );
833 + if ( empty( $purchase_code_content ) ) {
834 + return;
835 + }
836 +
837 + $addon_slug = $res['destination_name'] ?? '';
838 + if ( empty( $addon_slug ) ) {
839 + return;
840 + }
841 +
842 + // Call active purchase code for site.
843 + AddonService::instance()->active_site( $addon_slug, $purchase_code_content );
844 + }
845 + }
846 + }
847 + );
848 +
849 + // Clear cache UserModel when save user.
850 + add_action(
851 + 'wp_update_user',
852 + function ( $user_id ) {
853 + $user = UserModel::find( $user_id, true );
854 + $user->clean_caches();
855 + }
856 + );
857 +
858 + // For temporary fix issue security of wp comments. Is it error of WP, not LP, LP only call to comments_template function.
859 + add_filter(
860 + 'comments_array',
861 + function ( $comments_flat, $post_id ) {
862 + // Check if post type is course or item's course (lesson, quiz...)
863 + $post_type = get_post_type( $post_id );
864 + $course_item_types = CourseModel::item_types_support();
865 + $course_item_types[] = LP_COURSE_CPT;
866 + if ( ! in_array( $post_type, $course_item_types ) ) {
867 + return $comments_flat;
868 + }
869 +
870 + foreach ( $comments_flat as $key => $comment ) {
871 + $comment->comment_content = wp_kses_post( $comment->comment_content );
872 + $comments_flat[ $key ] = $comment;
873 + }
874 +
875 + return $comments_flat;
876 + },
877 + 10,
878 + 2
879 + );
470 880 }
471 881
472 882 /**
473 883 * Add links to Documentation and Extensions in plugin's list of action links
474 884 *
475 - * @since 4.3.11
476 - *
477 885 * @param array $links Array of action links
478 886 *
479 887 * @return array
888 + * @since 4.3.11
889 + * @version 1.0.1
480 890 */
481 891 public function plugin_links( array $links ): array {
482 - $links[] = sprintf( '<a href="%s">%s</a>', admin_url( 'admin.php?page=learn-press-settings' ), __( 'Settings', 'learnpress' ) );
483 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', 'https://docspress.thimpress.com/learnpress-4-0/', __( 'Documentation', 'learnpress' ) );
484 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', get_admin_url() . '/admin.php?page=learn-press-addons', __( 'Add-ons', 'learnpress' ) );
892 + $links[] = sprintf(
893 + '<a href="%s">%s</a>',
894 + esc_url_raw( admin_url( 'admin.php?page=learn-press-settings' ) ),
895 + esc_html__( 'Settings', 'learnpress' )
896 + );
897 + $links[] = sprintf(
898 + '<a href="%s" target="_blank">%s</a>',
899 + esc_url_raw( LearnPress::$doc_link ),
900 + esc_html__( 'Documentation', 'learnpress' )
901 + );
902 + $links[] = sprintf(
903 + '<a href="%s" target="_blank">%s</a>',
904 + esc_url_raw( admin_url( 'admin.php?page=learn-press-addons' ) ),
905 + esc_html__( 'Add-ons', 'learnpress' )
906 + );
485 907
486 908 return $links;
487 909 }
488 910
489 - public function error() {
490 - ?>
491 - <div class="error">
492 - <p>
493 - <?php
494 - printf(
495 - __(
496 - '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>)',
497 - 'learnpress'
498 - ),
499 - LP_PLUGIN_BASENAME
500 - );
501 - ?>
502 - </p>
503 - </div>
504 - <?php
505 - }
506 -
507 911 /**
508 - * Maybe flush rewrite rules
509 - */
510 - public function wp_init() {
511 - /*if ( LP()->session->flush_rewrite_rules ) {
512 - flush_rewrite_rules();
513 - unset( LP()->session->flush_rewrite_rules );
514 - }*/
515 - }
516 -
517 - /**
518 - * Get base name of plugin from file.
912 + * Activation hook callback.
519 913 *
520 - * @return string
521 - */
522 - // private function plugin_basename() {
523 - // return learn_press_plugin_basename( __FILE__ );
524 - // }
525 -
526 - /**
527 - * Magic function to get Learnpress data.
914 + * Including creating database tables, default pages, registering CPTs and flushing rewrite rules.
528 915 *
529 - * @param $key
530 - *
531 - * @return bool|LP_Checkout|LP_Course|LP_Emails|LP_User|LP_User_Guest|mixed
532 - * @deprecated since 3.0.0
533 - * @editor tungnx
534 - * @modify 4.1.3.1 - comment
535 - */
536 - /*
537 - public function __get( $key ) {
538 - return false;
539 - }*/
540 -
541 - /**
542 - * Trigger this function while activating Learnpress.
543 - *
544 916 * @since 3.0.0
545 917 * @version 4.1.4.1
546 918 */
547 919 public function on_activate() {
548 920 LP_Install::instance()->on_activate();
549 - // do_action( 'learn-press/activate', $this );
550 921 }
551 922
552 923 /**
553 924 * Trigger this function while deactivating Learnpress.
@@ -560,127 +931,43 @@
560 931 do_action( 'learn-press/deactivate', $this );
561 932 }
562 933
563 934 /**
564 - * Trigger WP loaded actions.
935 + * Conditionally bootstrap MCP abilities.
565 936 *
566 - * @since 3.0.0
937 + * @return void
567 938 */
568 - public function wp_loaded() {
569 - if ( $this->is_request( 'frontend' ) ) {
570 - $this->gateways = LP_Gateways::instance()->get_available_payment_gateways();
939 + public function maybe_init_mcp_abilities() {
940 + if ( LP_Settings::get_option( 'enable_mcp_integration', 'no' ) !== 'yes' ) {
941 + return;
571 942 }
572 - }
573 943
574 - /**
575 - * Setup courses thumbnail.
576 - *
577 - * @since 3.0.0
578 - */
579 - public function setup_theme() {
580 - if ( ! current_theme_supports( 'post-thumbnails' ) ) {
581 - add_theme_support( 'post-thumbnails' );
582 - }
583 - add_post_type_support( LP_COURSE_CPT, 'thumbnail' );
584 -
585 - $size = LP_Settings::get_option(
586 - 'course_thumbnail_dimensions',
587 - array(
588 - 500,
589 - 300,
590 - )
591 - );
592 -
593 - $size = array_values( (array) $size );
594 -
595 - add_image_size( 'course_thumbnail', $size[0], $size[1], true );
944 + ApiKeyAuthenticator::init();
945 + Abilities::init();
596 946 }
597 947
598 948 /**
599 - * Trigger Learnpress loaded actions.
949 + * Handle load text domain for LearnPress.
600 950 *
601 - * @since 3.0.0
602 - * @version 1.0.2
603 - * @editor tungnx
951 + * @since 4.2.7.4
952 + * @version 1.0.1
604 953 */
605 - public function plugin_loaded() {
606 - do_action( 'learnpress/hook/before-addons-call-hook-learnpress-ready' );
954 + public function load_plugin_text_domain() {
955 + /*$locale = determine_locale();
956 + $locale = apply_filters( 'plugin_locale', $locale, 'learnpress' );
607 957
608 - // Polylang
609 - if ( defined( 'POLYLANG_VERSION' ) ) {
610 - require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
611 - LP_Polylang::instance();
612 - }
958 + $plugin_translation_path = WP_LANG_DIR . '/plugins/learnpress-' . $locale . '.mo';
959 + $custom_translation_path = WP_LANG_DIR . '/learnpress/learnpress-' . $locale . '.mo';
960 + if ( is_readable( $custom_translation_path ) ) {
961 + unload_textdomain( LP_TEXT_DOMAIN );
962 + load_textdomain( LP_TEXT_DOMAIN, $custom_translation_path );
963 + load_textdomain( LP_TEXT_DOMAIN, $plugin_translation_path );
964 + }*/
613 965
614 - $this->init();
615 -
616 - // Todo: tungnx - remove this code after handle ajax on page learn-press-addons
617 - // require_once 'inc/background-process/class-lp-background-query-items.php';
618 - // require_once 'inc/background-process/class-lp-background-installer.php';
619 -
620 - require_once 'inc/lp-template-hooks.php';
621 -
622 - /**
623 - * Check version addons valid version require.
624 - * If not valid will be to deactivate.
625 - * Reload page, so not affect to hook "learn-press/ready"
626 - */
627 - $addons_valid = true;
628 - $plugins = get_option( 'active_plugins' );
629 -
630 - $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
631 -
632 - // Remove hook deactivate addon assignments v3.
633 - add_action(
634 - 'deactivate_learnpress-assignments/learnpress-assignments.php',
635 - array( $this, 'lp_assignment_install' ),
636 - - 10
637 - );
638 -
639 - foreach ( $list_lp_addon_activated as $lp_addon ) {
640 - $lp_addon_info = get_file_data(
641 - WP_PLUGIN_DIR . '/' . $lp_addon,
642 - array(
643 - 'Require_LP_Version' => 'Require_LP_Version',
644 - 'Version' => 'Version',
645 - )
646 - );
647 -
648 - // $lp_addon_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $lp_addon );
649 - $lp_addon_version = $lp_addon_info['Version'];
650 -
651 - $addon = new Lp_Addon();
652 - $addon->version = $lp_addon_version;
653 - $addon->plugin_base = $lp_addon;
654 - $addon->require_version = $lp_addon_info['Require_LP_Version'];
655 - $addon_valid = $addon->check_require_version_addon();
656 -
657 - if ( $addons_valid ) {
658 - $addon_valid = $addon->check_require_version_lp();
659 - }
660 -
661 - if ( ! $addon_valid ) {
662 - $addons_valid = false;
663 - }
664 - }
665 - // End check addons valid.
666 -
667 - if ( ! $addons_valid ) {
668 - return;
669 - }
670 -
671 - // let third parties know that we're ready .
672 - do_action( 'learn-press/ready' );
966 + load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
673 967 }
674 968
675 969 /**
676 - * Remove hook deactivate addon assignments v3.
677 - */
678 - public function lp_assignment_install() {
679 - remove_action( 'deactivate_learnpress-assignments/learnpress-assignments.php', 'lp_assignment_remove' );
680 - }
681 -
682 - /**
683 970 * Get instance of class LP_Template.
684 971 *
685 972 * @param string $type
686 973 *
@@ -689,40 +976,15 @@
689 976 * @throws Exception
690 977 * @since 3.3.0
691 978 */
692 979 public function template( $type = '' ) {
693 - if ( ! $this->template ) {
694 - $this->template = LP_Template::instance();
695 - }
980 + $this->template = LP_Template::instance();
981 + $templates = (array) $this->template->get_templates();
696 982
697 - return isset( $this->template[ $type ] ) ? $this->template[ $type ] : $this->template;
983 + return $templates[ $type ] ?? $this->template;
698 984 }
699 985
700 986 /**
701 - * Init LearnPress when WP initialises
702 - */
703 - public function init() {
704 - $this->api = new LP_Core_API();
705 - $this->admin_api = new LP_Admin_Core_API();
706 - // $this->theme_support = LP_Theme_Support::instance();
707 -
708 - // $this->view_log();
709 -
710 - $this->get_session();
711 -
712 - $this->settings = $this->settings();
713 -
714 - if ( $this->is_request( 'frontend' ) ) {
715 - $this->get_cart();
716 - }
717 -
718 - // Email hook notify
719 - include_once 'inc/emails/class-lp-email-hooks.php';
720 - // Init emails
721 - LP_Emails::instance();
722 - }
723 -
724 - /**
725 987 * Get session object instance.
726 988 *
727 989 * @return mixed
728 990 */
@@ -747,9 +1009,9 @@
747 1009 * Get cart object instance for online learning market.
748 1010 *
749 1011 * @return LP_Cart
750 1012 */
751 - public function get_cart() : LP_Cart {
1013 + public function get_cart(): LP_Cart {
752 1014 if ( ! $this->cart ) {
753 1015 $this->cart = LP_Cart::instance();
754 1016 }
755 1017
@@ -756,30 +1018,8 @@
756 1018 return $this->cart;
757 1019 }
758 1020
759 1021 /**
760 - * Check type of request.
761 - *
762 - * @param string $type ajax, frontend or admin.
763 - *
764 - * @return bool
765 - */
766 - public function is_request( $type ) {
767 - switch ( $type ) {
768 - case 'admin':
769 - return is_admin();
770 - case 'ajax':
771 - return defined( 'LP_DOING_AJAX' );
772 - case 'cron':
773 - return defined( 'DOING_CRON' );
774 - case 'frontend':
775 - return ( ! is_admin() || defined( 'LP_DOING_AJAX' ) ) && ! defined( 'DOING_CRON' );
776 - default:
777 - return strtolower( $_SERVER['REQUEST_METHOD'] ) == $type;
778 - }
779 - }
780 -
781 - /**
782 1022 * Get the plugin url.
783 1023 *
784 1024 * @param string $sub_dir
785 1025 *
@@ -873,16 +1113,8 @@
873 1113 }
874 1114
875 1115 return self::$_instance;
876 1116 }
877 -
878 - public function admin_notice_require_addon_version() {
879 - ?>
880 - <div class="notice notice-error">
881 - <p><?php echo( '<strong>LearnPress version ' . LEARNPRESS_VERSION . ' require Addon</strong> version 4.0.0 or higher' ); ?></p>
882 - </div>
883 - <?php
884 - }
885 1117 }
886 1118 }
887 1119
888 1120 /**
@@ -899,5 +1131,9 @@
899 1131 /**
900 1132 * Done! entry point of the plugin
901 1133 * Create new instance of LearnPress and put it to global
902 1134 */
903 -$GLOBALS['LearnPress'] = LP();
1135 +$GLOBALS['LearnPress'] = LearnPress::instance();
1136 +
1137 +// Load template hooks here, before theme add hooks remove.
1138 +// Load here because this file call LearnPress::instance(), loop call.
1139 +require_once 'inc/lp-template-hooks.php';