PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9
4.4.9 4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 All 140 releases
← All changes | learnpress.php +674 -417 4.1.7.2 → 4.4.9 View file →
@@ -1,15 +1,14 @@
1 1 <?php
2 2 /**
3 3 * Plugin Name: LearnPress
4 - * Plugin URI: http://thimpress.com/learnpress
4 + * Plugin URI: https://thimpress.com/learnpress
5 5 * Description: LearnPress is a WordPress complete solution for creating a Learning Management System (LMS). It can help you to create courses, lessons and quizzes.
6 6 * Author: ThimPress
7 - * Version: 4.1.7.2
7 + * Version: 4.4.9
8 8 * Author URI: http://thimpress.com
9 - * Requires at least: 5.6
10 - * Tested up to: 6.0
11 - * Requires PHP: 7.0
9 + * Requires at least: 6.0
10 + * Requires PHP: 7.4
12 11 * Text Domain: learnpress
13 12 * Domain Path: /languages/
14 13 *
15 14 * @package LearnPress
@@ -14,18 +13,100 @@
14 13 *
15 14 * @package LearnPress
16 15 */
17 16
18 -/**
19 - * Prevent loading this file directly
20 - */
17 +use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderListCoursesTemplate;
18 +use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderCourseTemplate;
19 +use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderEditCourseTemplate;
20 +use LearnPress\Ajax\AI\OpenAiAjax;
21 +use LearnPress\Ajax\BuilderDashboardAjax;
22 +use LearnPress\Ajax\CourseToolsAjax;
23 +use LearnPress\Ajax\CourseBuilder\CourseBuilderAjax;
24 +use LearnPress\Ajax\EditCurriculumAjax;
25 +use LearnPress\Ajax\AddonsAjax;
26 +use LearnPress\Services\AddonService;
27 +use LearnPress\Ajax\EditQuestionAjax;
28 +use LearnPress\Ajax\EditQuizAjax;
29 +use LearnPress\Ajax\Order\ExportOrderCSVAjax;
30 +use LearnPress\Ajax\LessonAjax;
31 +use LearnPress\Ajax\LoadContentViaAjax;
32 +use LearnPress\Ajax\SampleDataAJAX;
33 +use LearnPress\Ajax\SetupWizardAjax;
34 +use LearnPress\Ajax\AI\AIAssistantAjax;
35 +use LearnPress\Ajax\MCP\McpApiKeysAjax;
36 +use LearnPress\Ajax\Webhook\WebhooksAjax;
37 +use LearnPress\Ajax\CourseBuilder\CBEditCourseAjax;
38 +use LearnPress\Ajax\SendEmailAjax;
39 +use LearnPress\Background\LPBackgroundTrigger;
40 +use LearnPress\ExternalPlugin\Elementor\LPElementor;
41 +use LearnPress\ExternalPlugin\RankMath\LPRankMath;
42 +use LearnPress\ExternalPlugin\YoastSeo\LPYoastSeo;
43 +use LearnPress\Gutenberg\GutenbergHandleMain;
44 +use LearnPress\Ajax\Order\RefundOrderAjax;
45 +use LearnPress\MCP\Abilities;
46 +use LearnPress\MCP\Auth\ApiKeyAuthenticator;
47 +use LearnPress\Models\CourseModel;
48 +use LearnPress\Models\UserModel;
49 +use LearnPress\Shortcodes\Course\FilterCourseShortcode;
50 +use LearnPress\Shortcodes\CourseButtonShortcode;
51 +use LearnPress\Shortcodes\CourseMaterialShortcode;
52 +use LearnPress\Shortcodes\Courses\ListCoursesShortcode;
53 +use LearnPress\Shortcodes\ListInstructorsShortcode;
54 +use LearnPress\Shortcodes\SingleInstructorShortcode;
55 +use LearnPress\TemplateHooks\Admin\AdminAddonsPage;
56 +use LearnPress\TemplateHooks\Admin\AdminEditQizTemplate;
57 +use LearnPress\TemplateHooks\Admin\AdminEditQuestionTemplate;
58 +use LearnPress\TemplateHooks\Admin\AdminListStudentsEnrolled;
59 +use LearnPress\TemplateHooks\Admin\AdminStatisticsReportTable;
60 +use LearnPress\TemplateHooks\Admin\Notices\AdminNotesTemplate;
61 +use LearnPress\TemplateHooks\Admin\Tools\AdminCourseTools;
62 +use LearnPress\Statistics\FilterOptionsProvider;
63 +use LearnPress\TemplateHooks\Admin\AI\AdminCreateCourseAITemplate;
64 +use LearnPress\TemplateHooks\Admin\AI\AdminEditCourseCurriculumWithAITemplate;
65 +use LearnPress\TemplateHooks\Admin\AI\AdminEditWithAITemplate;
66 +use LearnPress\TemplateHooks\Course\AdminEditCurriculumTemplate;
67 +use LearnPress\TemplateHooks\Course\AdminEditSettingTemplate;
68 +use LearnPress\TemplateHooks\Course\CourseMaterialTemplate;
69 +use LearnPress\TemplateHooks\Course\FilterCourseTemplate;
70 +use LearnPress\TemplateHooks\Course\ListCoursesRelatedTemplate;
71 +use LearnPress\TemplateHooks\Course\ListCoursesTemplate;
72 +use LearnPress\TemplateHooks\Course\SingleCourseClassicTemplate;
73 +use LearnPress\TemplateHooks\Course\SingleCourseModernLayout;
74 +use LearnPress\TemplateHooks\Course\SingleCourseOfflineTemplate;
75 +use LearnPress\TemplateHooks\Course\SingleCourseTemplate;
76 +use LearnPress\TemplateHooks\CourseBuilder\BuilderPopupTemplate;
77 +use LearnPress\TemplateHooks\CourseBuilder\CourseBuilderTemplate;
78 +use LearnPress\TemplateHooks\CourseBuilder\Dashboard\BuilderDashboardTemplate;
79 +use LearnPress\TemplateHooks\CourseBuilder\Lesson\BuilderEditLessonTemplate;
80 +use LearnPress\TemplateHooks\CourseBuilder\Lesson\BuilderLessonTemplate;
81 +use LearnPress\TemplateHooks\CourseBuilder\Lesson\BuilderListLessonsTemplate;
82 +use LearnPress\TemplateHooks\CourseBuilder\Question\BuilderEditQuestionTemplate;
83 +use LearnPress\TemplateHooks\CourseBuilder\Question\BuilderListQuestionsTemplate;
84 +use LearnPress\TemplateHooks\CourseBuilder\Question\BuilderQuestionTemplate;
85 +use LearnPress\TemplateHooks\CourseBuilder\Quiz\BuilderEditQuizTemplate;
86 +use LearnPress\TemplateHooks\CourseBuilder\Quiz\BuilderListQuizzesTemplate;
87 +use LearnPress\TemplateHooks\CourseBuilder\Quiz\BuilderQuizTemplate;
88 +use LearnPress\TemplateHooks\CourseBuilder\Settings\BuilderSettingsTemplate;
89 +use LearnPress\TemplateHooks\Instructor\ListInstructorsTemplate;
90 +use LearnPress\TemplateHooks\Instructor\SingleInstructorTemplate;
91 +use LearnPress\TemplateHooks\Order\AdminOrderItemsTemplate;
92 +use LearnPress\TemplateHooks\Order\AdminOrderListTemplate;
93 +use LearnPress\TemplateHooks\Profile\ProfileCoursesTemplate;
94 +use LearnPress\TemplateHooks\Profile\ProfileGeneralInfoTemplate;
95 +use LearnPress\TemplateHooks\Profile\ProfileInstructorStatisticsTemplate;
96 +use LearnPress\TemplateHooks\Profile\ProfileOrdersTemplate;
97 +use LearnPress\TemplateHooks\Profile\ProfileOrderTemplate;
98 +use LearnPress\TemplateHooks\Profile\ProfileQuizzesTemplate;
99 +use LearnPress\TemplateHooks\Profile\ProfileStudentEnrolledTemplate;
100 +use LearnPress\TemplateHooks\Profile\ProfileStudentStatisticsTemplate;
101 +use LearnPress\TemplateHooks\Course\CourseAIAssistantTemplate;
102 +use LearnPress\Widgets\LPRegisterWidget;
103 +use LearnPress\WPGDPR\ErasePersonalData;
104 +use LearnPress\WPGDPR\ExportPersonalData;
105 +use LearnPress\Webhook\WebhookDispatcher;
106 +
21 107 defined( 'ABSPATH' ) || exit();
22 108
23 -if ( ! defined( 'LP_PLUGIN_FILE' ) ) {
24 - define( 'LP_PLUGIN_FILE', __FILE__ );
25 - require_once 'inc/lp-constants.php';
26 -}
27 -
28 109 if ( ! class_exists( 'LearnPress' ) ) {
29 110 /**
30 111 * Class LearnPress
31 112 *
@@ -36,19 +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;
47 - /**
48 - * @var int Version of mu file on folder mu-plugins
49 - */
50 - public $mu_file_version = 2;
127 + public $db_version = 5;
51 128
52 129 /**
53 130 * The single instance of the class
54 131 *
@@ -63,13 +140,8 @@
63 140 */
64 141 public $session = null;
65 142
66 143 /**
67 - * @var LP_Profile
68 - */
69 - public $profile = null;
70 -
71 - /**
72 144 * @var LP_Cart object
73 145 */
74 146 public $cart = false;
75 147
@@ -78,32 +150,15 @@
78 150 */
79 151 public $settings = null;
80 152
81 153 /**
82 - * @var null
83 - */
84 - public $schedule = null;
85 -
86 - /**
87 154 * @var array
88 155 */
89 156 public $query_vars = array();
90 157
91 158 /**
92 - * Table prefixes
93 - *
94 159 * @var array
95 160 */
96 - protected $_table_prefixes = array();
97 -
98 - /**
99 - * @var null
100 - */
101 - public $query = null;
102 -
103 - /**
104 - * @var array
105 - */
106 161 public $global = array();
107 162
108 163 /**
109 164 * @var LP_Template
@@ -124,40 +179,82 @@
124 179 * @var string
125 180 */
126 181 public $thim_core_version_require = '2.0.0';
127 182
128 - /**
129 - *
130 - */
131 - public $theme_support = null;
183 + public static $time_limit_default_of_sever = 0;
132 184
133 - public $gateways = null;
185 + public static $doc_link = 'https://learnpresslms.com/docs/';
134 186
135 187 /**
136 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.
137 196 */
138 - protected function __construct() {
139 - if ( self::$_instance ) {
197 + private function __construct() {
198 + /*if ( isset( $_POST['action'] ) && 'heartbeat' === $_POST['action'] ) {
140 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 );
141 219 }
142 - self::$_instance = $this;
220 + }
143 221
144 - update_option( 'learnpress_version', $this->version );
145 -
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() {
146 233 // Define constant .
147 234 $this->plugin_defines();
148 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 +
149 252 // define table prefixes .
150 253 $this->define_tables();
151 254
152 255 // Include files .
153 256 $this->includes();
154 -
155 - // Copy mu plugin.
156 - $this->mu_plugin();
157 -
158 - // hooks .
159 - $this->init_hooks();
160 257 }
161 258
162 259 /**
163 260 * Define constant.
@@ -162,9 +259,12 @@
162 259 /**
163 260 * Define constant.
164 261 */
165 262 protected function plugin_defines() {
166 -
263 + if ( ! defined( 'LP_PLUGIN_FILE' ) ) {
264 + define( 'LP_PLUGIN_FILE', __FILE__ );
265 + include_once 'inc/lp-constants.php';
266 + }
167 267 }
168 268
169 269 /**
170 270 * Defines database table names.
@@ -186,11 +286,9 @@
186 286 'question_answermeta',
187 287 );
188 288
189 289 foreach ( $tables as $short_name ) {
190 - $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
191 - $this->_table_prefixes[ 'tbl_' . $short_name ] = $table_name;
192 -
290 + $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
193 291 $backward_key = 'learnpress_' . $short_name;
194 292 $wpdb->{$backward_key} = $table_name;
195 293 }
196 294 }
@@ -198,8 +296,10 @@
198 296 /**
199 297 * Includes needed files.
200 298 */
201 299 public function includes() {
300 + include_once LP_PLUGIN_PATH . 'vendor/autoload.php';
301 +
202 302 // Include required files load anywhere, both frontend and backend.
203 303 $this->include_files_global();
204 304
205 305 // include files when LP ready run - after setup success .
@@ -221,191 +321,270 @@
221 321 *
222 322 * @return void
223 323 */
224 324 private function include_files_global() {
225 - require_once 'inc/class-lp-multi-language.php';
226 325
227 326 // Filter query .
228 - require_once 'inc/filters/class-lp-filter.php';
229 - require_once 'inc/filters/class-lp-post-type-filter.php';
230 - require_once 'inc/filters/class-lp-course-filter.php';
231 - require_once 'inc/filters/class-lp-order-filter.php';
232 - require_once 'inc/filters/class-lp-section-filter.php';
233 - require_once 'inc/filters/class-lp-section-items-filter.php';
234 - require_once 'inc/filters/class-lp-question-filter.php';
235 - require_once 'inc/filters/class-lp-user-items-filter.php';
236 - require_once 'inc/filters/class-lp-quiz-questions-filter.php';
237 - require_once 'inc/filters/class-lp-question-answers-filter.php';
238 - 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';
239 345
240 346 // Query Database .
241 - require_once 'inc/databases/class-lp-db.php';
242 - require_once 'inc/databases/class-lp-order-db.php';
243 - require_once 'inc/databases/class-lp-course-db.php';
244 - require_once 'inc/databases/class-lp-lesson-db.php';
245 - require_once 'inc/databases/class-lp-section-db.php';
246 - require_once 'inc/databases/class-lp-section-items-db.php';
247 - require_once 'inc/databases/class-lp-quiz-db.php';
248 - require_once 'inc/databases/class-lp-quiz-questions-db.php';
249 - require_once 'inc/databases/class-lp-question-answers-db.php';
250 - require_once 'inc/databases/class-lp-sessions-db.php';
251 - require_once 'inc/databases/class-lp-question-db.php';
252 - require_once 'inc/databases/class-lp-user-items-db.php';
253 - 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';
254 368
255 - // Read files config on folder config .
256 - require_once 'inc/Helper/Config.php';
257 -
258 369 // File system .
259 - require_once 'inc/class-lp-file-system.php';
370 + include_once 'inc/class-lp-file-system.php';
260 371
261 372 // File helper
262 - require_once 'inc/class-lp-helper.php';
373 + include_once 'inc/class-lp-helper.php';
263 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 +
264 433 // Models
265 - require_once 'inc/models/class-lp-rest-response.php';
266 - include_once 'inc/models/steps/class-lp-group-step.php';
267 - include_once 'inc/models/steps/class-lp-step.php';
268 - 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';
269 438
270 439 // Handle steps.
271 - require_once 'inc/handle-steps/class-lp-handle-steps.php';
272 - 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';
273 442
274 443 // LP Cache
275 - require_once 'inc/cache/class-lp-cache.php';
276 - require_once 'inc/cache/class-lp-courses-cache.php';
277 - require_once 'inc/cache/class-lp-course-cache.php';
278 - 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';
279 452
280 453 // Background processes.
281 - require_once 'inc/libraries/wp-background-process/wp-background-processing.php';
282 - require_once 'inc/background-process/abstract-lp-async-request.php';
283 - require_once 'inc/background-process/class-lp-background-single-course.php';
284 - 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';
285 460
286 461 // Assets object
287 - require_once 'inc/class-lp-asset-key.php';
288 - require_once 'inc/abstracts/abstract-assets.php';
462 + include_once 'inc/class-lp-asset-key.php';
463 + include_once 'inc/abstracts/abstract-assets.php';
289 464
290 465 // Debug class
291 - require_once 'inc/class-lp-debug.php';
466 + include_once 'inc/class-lp-debug.php';
292 467
293 - require_once 'inc/class-lp-settings.php';
294 - require_once 'inc/abstract-settings.php';
295 - require_once 'inc/settings/abstract-settings-page.php';
296 - require_once 'inc/settings/class-lp-settings-courses.php';
297 - require_once 'inc/class-lp-global.php';
298 - 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';
299 474
300 475 // Register custom-post-type and taxonomies .
301 - require_once 'inc/custom-post-types/abstract.php';
302 - require_once 'inc/custom-post-types/course.php';
303 - require_once 'inc/custom-post-types/lesson.php';
304 - require_once 'inc/custom-post-types/quiz.php';
305 - require_once 'inc/custom-post-types/question.php';
306 - 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';*/
307 482
308 - require_once 'inc/interfaces/interface-curd.php';
309 - require_once 'inc/abstracts/abstract-array-access.php';
310 - require_once 'inc/abstracts/abstract-object-data.php';
311 - 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';
312 487
313 - require_once 'inc/curds/class-lp-course-curd.php';
314 - require_once 'inc/curds/class-lp-section-curd.php';
315 - require_once 'inc/curds/class-lp-lesson-curd.php';
316 - require_once 'inc/curds/class-lp-quiz-curd.php';
317 - require_once 'inc/curds/class-lp-question-curd.php';
318 - require_once 'inc/curds/class-lp-order-curd.php';
319 - require_once 'inc/curds/class-lp-user-curd.php';
320 - 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';
321 496
322 - require_once 'inc/course/class-lp-course-item.php';
323 - require_once 'inc/question/class-lp-question.php';
324 - require_once 'inc/course/class-lp-course-section.php';
325 - require_once 'inc/course/class-lp-course-no-required-enroll.php';
326 - require_once 'inc/user-item/class-lp-user-item.php';
327 - 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';
328 503
329 - require_once 'inc/lp-deprecated.php'; // Will remove if Eduma and guest update all 4.0.0
330 - require_once 'inc/lp-core-functions.php';
331 - 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';
332 507
333 - require_once 'inc/lp-webhooks.php';
334 - 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';
335 510
336 - require_once 'inc/admin/helpers/class-lp-plugins-helper.php';
337 -
338 511 // Todo: tungnx check those files.
339 - require_once 'inc/abstracts/abstract-object-query.php';
340 - require_once 'inc/class-lp-course-query.php';
341 - require_once 'inc/abstracts/abstract-addon.php';
342 - require_once 'inc/class-lp-thumbnail-helper.php';
343 - 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';
344 517
345 518 // Class handle check db of LP need to upgrade?
346 - require_once 'inc/admin/class-lp-updater.php';
519 + include_once 'inc/admin/class-lp-updater.php';
347 520
348 - require_once 'inc/course/lp-course-functions.php';
349 - require_once 'inc/course/abstract-course.php';
350 - require_once 'inc/course/class-lp-course.php';
351 - //require_once 'inc/course/class-lp-course-utils.php';
352 - require_once 'inc/quiz/lp-quiz-functions.php';
353 - require_once 'inc/quiz/class-lp-quiz.php';
354 - require_once 'inc/lesson/lp-lesson-functions.php';
355 - require_once 'inc/order/lp-order-functions.php';
356 - 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';
357 529
358 - require_once 'inc/user/lp-user-functions.php';
359 - require_once 'inc/user/class-lp-user-factory.php';
360 - require_once 'inc/user/abstract-lp-user.php';
361 - require_once 'inc/user/class-lp-user.php';
362 - require_once 'inc/user/class-lp-profile.php';
363 - require_once 'inc/user-item/class-lp-user-item.php';
364 - require_once 'inc/user-item/class-lp-user-item-course.php';
365 - require_once 'inc/user-item/class-lp-user-item-quiz.php';
366 - require_once 'inc/user-item/class-lp-quiz-results.php';
367 - 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';
368 540
369 - 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';
370 550
371 551 // include template functions .
372 - require_once 'inc/lp-template-functions.php';
373 - require_once 'inc/templates/abstract-template.php';
374 - //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';
375 555
376 556 // Cart
377 - require_once 'inc/cart/class-lp-cart.php';
378 - 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';
379 559
380 560 // Block Templates
381 - require_once 'inc/block-template/class-block-until.php';
382 - 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();
383 564
384 565 // API
385 - require_once 'inc/abstracts/abstract-rest-api.php';
386 - require_once 'inc/abstracts/abstract-rest-controller.php';
387 - require_once 'inc/rest-api/class-lp-core-api.php';
388 - 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';
389 570
390 571 /** Jwt */
391 572 include_once 'inc/jwt/class-jwt-auth.php';
392 573
393 - require_once 'inc/class-lp-widget.php';
394 - 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';
395 577
396 - // For plugin Elementor
397 - if ( defined( 'ELEMENTOR_VERSION' ) ) {
398 - require_once 'inc/external-plugin/elementor/class-lp-elementor.php';
399 - }
400 -
401 578 // TODO: update frontend editor before move to function include_files_admin.
402 - 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';
403 580
404 - require_once 'inc/class-lp-page-controller.php';
581 + include_once 'inc/class-lp-page-controller.php';
582 + LP_Page_Controller::instance();
405 583
406 - require_once 'inc/gateways/class-lp-gateway-abstract.php';
407 - 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';
408 587 }
409 588
410 589 /**
411 590 * Include file run on backend
@@ -414,20 +593,18 @@
414 593 if ( ! is_admin() ) {
415 594 return;
416 595 }
417 596
418 - require_once 'inc/admin/class-lp-admin-notice.php';
597 + include_once 'inc/admin/class-lp-admin-ajax.php';
419 598
420 599 // File handle install LP
421 - require_once 'inc/class-lp-install.php';
600 + include_once 'inc/class-lp-install.php';
422 601
423 602 // Meta box helper
424 - 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';
425 604
426 - require_once 'inc/admin/class-lp-admin.php';
427 - // require_once 'inc/admin/settings/abstract-settings-page.php';
428 -
429 - 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';
430 607 }
431 608
432 609 /**
433 610 * Include file run on frontend
@@ -436,80 +613,307 @@
436 613 if ( is_admin() ) {
437 614 return;
438 615 }
439 616
440 - require_once 'inc/class-lp-assets.php';
617 + include_once 'inc/class-lp-assets.php';
441 618
442 - 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';
443 620
444 - 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';
445 624 }
446 625
447 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 + /**
448 764 * Initial common hooks
449 765 */
450 - public function init_hooks() {
451 - if ( 0 !== strcmp( LP_PLUGIN_BASENAME, 'learnpress/learnpress.php' ) ) {
452 - add_action( 'admin_notices', array( $this, 'error' ) );
453 - }
766 + public function hooks() {
767 + add_action( 'init', array( $this, 'maybe_init_mcp_abilities' ), 20 );
454 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 +
455 800 // Add links setting|document|addon on plugins page.
456 801 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
457 802
458 - register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
459 - register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
460 - // 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 + );*/
461 813
462 - if ( ! LP_Install::instance()->tables_install_done() ) {
463 - 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' ) );
464 817 }
465 818
466 - add_action( 'wp_loaded', array( $this, 'wp_loaded' ), 20 );
467 - //add_action( 'after_setup_theme', array( $this, 'setup_theme' ) );
468 - add_action( 'plugins_loaded', array( $this, 'plugin_loaded' ), - 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 + }
469 829
470 - // Check require version thim-core.
471 - 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 + );
472 880 }
473 881
474 882 /**
475 883 * Add links to Documentation and Extensions in plugin's list of action links
476 884 *
477 - * @since 4.3.11
478 - *
479 885 * @param array $links Array of action links
480 886 *
481 887 * @return array
888 + * @since 4.3.11
889 + * @version 1.0.1
482 890 */
483 891 public function plugin_links( array $links ): array {
484 - $links[] = sprintf( '<a href="%s">%s</a>', admin_url( 'admin.php?page=learn-press-settings' ), __( 'Settings', 'learnpress' ) );
485 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', 'https://docspress.thimpress.com/learnpress-4-0/', __( 'Documentation', 'learnpress' ) );
486 - $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 + );
487 907
488 908 return $links;
489 909 }
490 910
491 - public function error() {
492 - ?>
493 - <div class="error">
494 - <p>
495 - <?php
496 - printf(
497 - __(
498 - '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>)',
499 - 'learnpress'
500 - ),
501 - LP_PLUGIN_BASENAME
502 - );
503 - ?>
504 - </p>
505 - </div>
506 - <?php
507 - }
508 -
509 911 /**
510 - * Trigger this function while activating Learnpress.
912 + * Activation hook callback.
511 913 *
914 + * Including creating database tables, default pages, registering CPTs and flushing rewrite rules.
915 + *
512 916 * @since 3.0.0
513 917 * @version 4.1.4.1
514 918 */
515 919 public function on_activate() {
@@ -527,123 +931,43 @@
527 931 do_action( 'learn-press/deactivate', $this );
528 932 }
529 933
530 934 /**
531 - * Trigger WP loaded actions.
935 + * Conditionally bootstrap MCP abilities.
532 936 *
533 - * @since 3.0.0
937 + * @return void
534 938 */
535 - public function wp_loaded() {
536 - if ( $this->is_request( 'frontend' ) ) {
537 - $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;
538 942 }
539 - }
540 943
541 - /**
542 - * Setup courses thumbnail.
543 - *
544 - * @since 3.0.0
545 - */
546 - public function setup_theme() {
547 - if ( ! current_theme_supports( 'post-thumbnails' ) ) {
548 - add_theme_support( 'post-thumbnails' );
549 - }
550 - add_post_type_support( LP_COURSE_CPT, 'thumbnail' );
551 -
552 - $size = LP_Settings::get_option(
553 - 'course_thumbnail_dimensions',
554 - array(
555 - 500,
556 - 300,
557 - )
558 - );
559 -
560 - $size = array_values( (array) $size );
561 -
562 - add_image_size( 'course_thumbnail', $size[0], $size[1], true );
944 + ApiKeyAuthenticator::init();
945 + Abilities::init();
563 946 }
564 947
565 948 /**
566 - * Trigger Learnpress loaded actions.
949 + * Handle load text domain for LearnPress.
567 950 *
568 - * @since 3.0.0
569 - * @version 1.0.2
570 - * @editor tungnx
951 + * @since 4.2.7.4
952 + * @version 1.0.1
571 953 */
572 - public function plugin_loaded() {
573 - 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' );
574 957
575 - // Polylang
576 - if ( defined( 'POLYLANG_VERSION' ) ) {
577 - require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
578 - LP_Polylang::instance();
579 - }
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 + }*/
580 965
581 - $this->init();
582 -
583 - require_once 'inc/lp-template-hooks.php';
584 -
585 - /**
586 - * Check version addons valid version require.
587 - * If not valid will be to deactivate.
588 - * Reload page, so not affect to hook "learn-press/ready"
589 - */
590 - $addons_valid = true;
591 - $plugins = get_option( 'active_plugins' );
592 -
593 - $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
594 -
595 - // Remove hook deactivate addon assignments v3.
596 - add_action(
597 - 'deactivate_learnpress-assignments/learnpress-assignments.php',
598 - array( $this, 'lp_assignment_install' ),
599 - - 10
600 - );
601 -
602 - foreach ( $list_lp_addon_activated as $lp_addon ) {
603 - $lp_addon_info = get_file_data(
604 - WP_PLUGIN_DIR . '/' . $lp_addon,
605 - array(
606 - 'Require_LP_Version' => 'Require_LP_Version',
607 - 'Version' => 'Version',
608 - )
609 - );
610 -
611 - // $lp_addon_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $lp_addon );
612 - $lp_addon_version = $lp_addon_info['Version'];
613 -
614 - $addon = new Lp_Addon();
615 - $addon->version = $lp_addon_version;
616 - $addon->plugin_base = $lp_addon;
617 - $addon->require_version = $lp_addon_info['Require_LP_Version'];
618 - $addon_valid = $addon->check_require_version_addon();
619 -
620 - if ( $addons_valid ) {
621 - $addon_valid = $addon->check_require_version_lp();
622 - }
623 -
624 - if ( ! $addon_valid ) {
625 - $addons_valid = false;
626 - }
627 - }
628 - // End check addons valid.
629 -
630 - if ( ! $addons_valid ) {
631 - return;
632 - }
633 -
634 - // let third parties know that we're ready .
635 - do_action( 'learn-press/ready' );
966 + load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
636 967 }
637 968
638 969 /**
639 - * Remove hook deactivate addon assignments v3.
640 - */
641 - public function lp_assignment_install() {
642 - remove_action( 'deactivate_learnpress-assignments/learnpress-assignments.php', 'lp_assignment_remove' );
643 - }
644 -
645 - /**
646 970 * Get instance of class LP_Template.
647 971 *
648 972 * @param string $type
649 973 *
@@ -652,37 +976,15 @@
652 976 * @throws Exception
653 977 * @since 3.3.0
654 978 */
655 979 public function template( $type = '' ) {
656 - if ( ! $this->template ) {
657 - $this->template = LP_Template::instance();
658 - }
980 + $this->template = LP_Template::instance();
981 + $templates = (array) $this->template->get_templates();
659 982
660 - return isset( $this->template[ $type ] ) ? $this->template[ $type ] : $this->template;
983 + return $templates[ $type ] ?? $this->template;
661 984 }
662 985
663 986 /**
664 - * Init LearnPress when WP initialises
665 - */
666 - public function init() {
667 - $this->api = new LP_Core_API();
668 - $this->admin_api = new LP_Admin_Core_API();
669 -
670 - $this->get_session();
671 -
672 - $this->settings = $this->settings();
673 -
674 - if ( $this->is_request( 'frontend' ) ) {
675 - $this->get_cart();
676 - }
677 -
678 - // Email hook notify
679 - include_once 'inc/emails/class-lp-email-hooks.php';
680 - // Init emails
681 - LP_Emails::instance();
682 - }
683 -
684 - /**
685 987 * Get session object instance.
686 988 *
687 989 * @return mixed
688 990 */
@@ -707,9 +1009,9 @@
707 1009 * Get cart object instance for online learning market.
708 1010 *
709 1011 * @return LP_Cart
710 1012 */
711 - public function get_cart() : LP_Cart {
1013 + public function get_cart(): LP_Cart {
712 1014 if ( ! $this->cart ) {
713 1015 $this->cart = LP_Cart::instance();
714 1016 }
715 1017
@@ -716,30 +1018,8 @@
716 1018 return $this->cart;
717 1019 }
718 1020
719 1021 /**
720 - * Check type of request.
721 - *
722 - * @param string $type ajax, frontend or admin.
723 - *
724 - * @return bool
725 - */
726 - public function is_request( $type ) {
727 - switch ( $type ) {
728 - case 'admin':
729 - return is_admin();
730 - case 'ajax':
731 - return defined( 'LP_DOING_AJAX' );
732 - case 'cron':
733 - return defined( 'DOING_CRON' );
734 - case 'frontend':
735 - return ( ! is_admin() || defined( 'LP_DOING_AJAX' ) ) && ! defined( 'DOING_CRON' );
736 - default:
737 - return strtolower( $_SERVER['REQUEST_METHOD'] ) == $type;
738 - }
739 - }
740 -
741 - /**
742 1022 * Get the plugin url.
743 1023 *
744 1024 * @param string $sub_dir
745 1025 *
@@ -833,35 +1113,8 @@
833 1113 }
834 1114
835 1115 return self::$_instance;
836 1116 }
837 -
838 - public function admin_notice_require_addon_version() {
839 - ?>
840 - <div class="notice notice-error">
841 - <p><?php echo( '<strong>LearnPress version ' . LEARNPRESS_VERSION . ' require Addon</strong> version 4.0.0 or higher' ); ?></p>
842 - </div>
843 - <?php
844 - }
845 -
846 - /**
847 - * Copy class-lp-mu-plugin.php to mu_plugins folder
848 - *
849 - * @return void
850 - */
851 - public function mu_plugin() {
852 - try {
853 - // Remove file mu plugin create on version 4.1.7.
854 - $name = 'class-lp-mu-plugin.php';
855 - $mu_plugins_path = WPMU_PLUGIN_DIR;
856 - $mu_plugin_file_path = $mu_plugins_path . '/' . $name;
857 - if ( file_exists( $mu_plugin_file_path ) ) {
858 - LP_WP_Filesystem::instance()->lp_filesystem->delete( $mu_plugin_file_path );
859 - }
860 - } catch ( Throwable $e ) {
861 - error_log( $e->getMessage() );
862 - }
863 - }
864 1117 }
865 1118 }
866 1119
867 1120 /**
@@ -879,4 +1132,8 @@
879 1132 * Done! entry point of the plugin
880 1133 * Create new instance of LearnPress and put it to global
881 1134 */
882 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';