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