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