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 +681 -438 4.1.7 → 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.7
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,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,319 @@
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 + // 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 + }
467 833
468 - // Check require version thim-core.
469 - 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 + );
470 887 }
471 888
472 889 /**
473 890 * Add links to Documentation and Extensions in plugin's list of action links
474 891 *
475 - * @since 4.3.11
476 - *
477 892 * @param array $links Array of action links
478 893 *
479 894 * @return array
895 + * @since 4.3.11
896 + * @version 1.0.1
480 897 */
481 898 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' ) );
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 + );
485 914
486 915 return $links;
487 916 }
488 917
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 918 /**
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.
919 + * Activation hook callback.
519 920 *
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.
921 + * Including creating database tables, default pages, registering CPTs and flushing rewrite rules.
528 922 *
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 923 * @since 3.0.0
545 924 * @version 4.1.4.1
546 925 */
547 926 public function on_activate() {
548 927 LP_Install::instance()->on_activate();
549 - // do_action( 'learn-press/activate', $this );
550 928 }
551 929
552 930 /**
553 931 * Trigger this function while deactivating Learnpress.
@@ -560,127 +938,43 @@
560 938 do_action( 'learn-press/deactivate', $this );
561 939 }
562 940
563 941 /**
564 - * Trigger WP loaded actions.
942 + * Conditionally bootstrap MCP abilities.
565 943 *
566 - * @since 3.0.0
944 + * @return void
567 945 */
568 - public function wp_loaded() {
569 - if ( $this->is_request( 'frontend' ) ) {
570 - $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;
571 949 }
572 - }
573 950
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 );
951 + ApiKeyAuthenticator::init();
952 + Abilities::init();
596 953 }
597 954
598 955 /**
599 - * Trigger Learnpress loaded actions.
956 + * Handle load text domain for LearnPress.
600 957 *
601 - * @since 3.0.0
602 - * @version 1.0.2
603 - * @editor tungnx
958 + * @since 4.2.7.4
959 + * @version 1.0.1
604 960 */
605 - public function plugin_loaded() {
606 - 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' );
607 964
608 - // Polylang
609 - if ( defined( 'POLYLANG_VERSION' ) ) {
610 - require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
611 - LP_Polylang::instance();
612 - }
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 + }*/
613 972
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' );
973 + load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
673 974 }
674 975
675 976 /**
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 977 * Get instance of class LP_Template.
684 978 *
685 979 * @param string $type
686 980 *
@@ -689,40 +983,15 @@
689 983 * @throws Exception
690 984 * @since 3.3.0
691 985 */
692 986 public function template( $type = '' ) {
693 - if ( ! $this->template ) {
694 - $this->template = LP_Template::instance();
695 - }
987 + $this->template = LP_Template::instance();
988 + $templates = (array) $this->template->get_templates();
696 989
697 - return isset( $this->template[ $type ] ) ? $this->template[ $type ] : $this->template;
990 + return $templates[ $type ] ?? $this->template;
698 991 }
699 992
700 993 /**
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 994 * Get session object instance.
726 995 *
727 996 * @return mixed
728 997 */
@@ -747,9 +1016,9 @@
747 1016 * Get cart object instance for online learning market.
748 1017 *
749 1018 * @return LP_Cart
750 1019 */
751 - public function get_cart() : LP_Cart {
1020 + public function get_cart(): LP_Cart {
752 1021 if ( ! $this->cart ) {
753 1022 $this->cart = LP_Cart::instance();
754 1023 }
755 1024
@@ -756,30 +1025,8 @@
756 1025 return $this->cart;
757 1026 }
758 1027
759 1028 /**
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 1029 * Get the plugin url.
783 1030 *
784 1031 * @param string $sub_dir
785 1032 *
@@ -873,16 +1120,8 @@
873 1120 }
874 1121
875 1122 return self::$_instance;
876 1123 }
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 1124 }
886 1125 }
887 1126
888 1127 /**
@@ -899,5 +1138,9 @@
899 1138 /**
900 1139 * Done! entry point of the plugin
901 1140 * Create new instance of LearnPress and put it to global
902 1141 */
903 -$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';