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 +659 -434 4.1.6.9.44.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.6.9.4-beta-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,23 +13,101 @@
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 *
32 - * Version 3.0.0
109 + * Version 3.0.1
33 110 */
34 111 class LearnPress {
35 112 /**
36 113 * Current version of the plugin
@@ -36,15 +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;
123 + public $db_version = 5;
47 124
48 125 /**
49 126 * The single instance of the class
50 127 *
@@ -59,13 +136,8 @@
59 136 */
60 137 public $session = null;
61 138
62 139 /**
63 - * @var LP_Profile
64 - */
65 - public $profile = null;
66 -
67 - /**
68 140 * @var LP_Cart object
69 141 */
70 142 public $cart = false;
71 143
@@ -74,32 +146,15 @@
74 146 */
75 147 public $settings = null;
76 148
77 149 /**
78 - * @var null
79 - */
80 - public $schedule = null;
81 -
82 - /**
83 150 * @var array
84 151 */
85 152 public $query_vars = array();
86 153
87 154 /**
88 - * Table prefixes
89 - *
90 155 * @var array
91 156 */
92 - protected $_table_prefixes = array();
93 -
94 - /**
95 - * @var null
96 - */
97 - public $query = null;
98 -
99 - /**
100 - * @var array
101 - */
102 157 public $global = array();
103 158
104 159 /**
105 160 * @var LP_Template
@@ -120,37 +175,72 @@
120 175 * @var string
121 176 */
122 177 public $thim_core_version_require = '2.0.0';
123 178
124 - /**
125 - *
126 - */
127 - public $theme_support = null;
179 + public static $time_limit_default_of_sever = 0;
128 180
129 - public $gateways = null;
181 + public static $doc_link = 'https://learnpresslms.com/docs/';
130 182
131 183 /**
132 184 * LearnPress constructor.
133 185 */
134 - protected function __construct() {
135 - if ( self::$_instance ) {
186 + private function __construct() {
187 + /*if ( isset( $_POST['action'] ) && 'heartbeat' === $_POST['action'] ) {
136 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() );
137 205 }
138 - self::$_instance = $this;
206 + }
139 207
140 - update_option( 'learnpress_version', $this->version );
141 -
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() {
142 219 // Define constant .
143 220 $this->plugin_defines();
144 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 +
145 238 // define table prefixes .
146 239 $this->define_tables();
147 240
148 241 // Include files .
149 242 $this->includes();
150 -
151 - // hooks .
152 - $this->init_hooks();
153 243 }
154 244
155 245 /**
156 246 * Define constant.
@@ -155,9 +245,12 @@
155 245 /**
156 246 * Define constant.
157 247 */
158 248 protected function plugin_defines() {
159 -
249 + if ( ! defined( 'LP_PLUGIN_FILE' ) ) {
250 + define( 'LP_PLUGIN_FILE', __FILE__ );
251 + include_once 'inc/lp-constants.php';
252 + }
160 253 }
161 254
162 255 /**
163 256 * Defines database table names.
@@ -176,15 +269,12 @@
176 269 'order_itemmeta',
177 270 'quiz_questions',
178 271 'question_answers',
179 272 'question_answermeta',
180 - 'review_logs',
181 273 );
182 274
183 275 foreach ( $tables as $short_name ) {
184 - $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
185 - $this->_table_prefixes[ 'tbl_' . $short_name ] = $table_name;
186 -
276 + $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
187 277 $backward_key = 'learnpress_' . $short_name;
188 278 $wpdb->{$backward_key} = $table_name;
189 279 }
190 280 }
@@ -192,8 +282,10 @@
192 282 /**
193 283 * Includes needed files.
194 284 */
195 285 public function includes() {
286 + include_once LP_PLUGIN_PATH . 'vendor/autoload.php';
287 +
196 288 // Include required files load anywhere, both frontend and backend.
197 289 $this->include_files_global();
198 290
199 291 // include files when LP ready run - after setup success .
@@ -215,191 +307,268 @@
215 307 *
216 308 * @return void
217 309 */
218 310 private function include_files_global() {
219 - require_once 'inc/class-lp-multi-language.php';
220 311
221 312 // Filter query .
222 - require_once 'inc/filters/class-lp-filter.php';
223 - require_once 'inc/filters/class-lp-post-type-filter.php';
224 - require_once 'inc/filters/class-lp-course-filter.php';
225 - require_once 'inc/filters/class-lp-order-filter.php';
226 - require_once 'inc/filters/class-lp-section-filter.php';
227 - require_once 'inc/filters/class-lp-section-items-filter.php';
228 - require_once 'inc/filters/class-lp-question-filter.php';
229 - require_once 'inc/filters/class-lp-user-items-filter.php';
230 - require_once 'inc/filters/class-lp-quiz-questions-filter.php';
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';
231 331
232 332 // Query Database .
233 - require_once 'inc/databases/class-lp-db.php';
234 - require_once 'inc/databases/class-lp-order-db.php';
235 - require_once 'inc/databases/class-lp-course-db.php';
236 - require_once 'inc/databases/class-lp-lesson-db.php';
237 - require_once 'inc/databases/class-lp-section-db.php';
238 - require_once 'inc/databases/class-lp-section-items-db.php';
239 - require_once 'inc/databases/class-lp-quiz-db.php';
240 - require_once 'inc/databases/class-lp-quiz-questions.php';
241 - require_once 'inc/databases/class-lp-sessions-db.php';
242 - require_once 'inc/databases/class-lp-question-db.php';
243 - require_once 'inc/databases/class-lp-user-items-db.php';
244 - require_once 'inc/databases/class-lp-user-item-results-db.php';
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';
245 354
246 - // Read files config on folder config .
247 - require_once 'inc/Helper/Config.php';
248 -
249 355 // File system .
250 - require_once 'inc/class-lp-file-system.php';
356 + include_once 'inc/class-lp-file-system.php';
251 357
252 358 // File helper
253 - require_once 'inc/class-lp-helper.php';
359 + include_once 'inc/class-lp-helper.php';
254 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 +
255 417 // Models
256 - require_once 'inc/models/class-lp-rest-response.php';
257 - include_once 'inc/models/steps/class-lp-group-step.php';
258 - include_once 'inc/models/steps/class-lp-step.php';
259 - require_once 'inc/models/class-lp-course-extra-info-fast-query-model.php';
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';
260 422
261 423 // Handle steps.
262 - require_once 'inc/handle-steps/class-lp-handle-steps.php';
263 - require_once 'inc/handle-steps/class-lp-handle-upgrade-db-steps.php';
424 + include_once 'inc/handle-steps/class-lp-handle-steps.php';
425 + include_once 'inc/handle-steps/class-lp-handle-upgrade-db-steps.php';
264 426
265 427 // LP Cache
266 - require_once 'inc/cache/class-lp-cache.php';
267 - require_once 'inc/cache/class-lp-courses-cache.php';
268 - require_once 'inc/cache/class-lp-course-cache.php';
269 - require_once 'inc/cache/class-lp-quiz-cache.php';
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';
270 436
271 437 // Background processes.
272 - require_once 'inc/libraries/wp-background-process/wp-background-processing.php';
273 - require_once 'inc/background-process/abstract-background-process.php';
274 - require_once 'inc/background-process/class-lp-background-single-course.php';
275 - require_once 'inc/background-process/class-lp-background-single-email.php';
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';
276 444
277 445 // Assets object
278 - require_once 'inc/class-lp-asset-key.php';
279 - require_once 'inc/abstracts/abstract-assets.php';
446 + include_once 'inc/class-lp-asset-key.php';
447 + include_once 'inc/abstracts/abstract-assets.php';
280 448
281 449 // Debug class
282 - require_once 'inc/class-lp-debug.php';
450 + include_once 'inc/class-lp-debug.php';
283 451
284 - require_once 'inc/class-lp-settings.php';
285 - require_once 'inc/abstract-settings.php';
286 - require_once 'inc/settings/abstract-settings-page.php';
287 - require_once 'inc/settings/class-lp-settings-courses.php';
288 - require_once 'inc/class-lp-global.php';
289 - require_once 'inc/class-lp-datetime.php';
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';
290 458
291 459 // Register custom-post-type and taxonomies .
292 - require_once 'inc/custom-post-types/abstract.php';
293 - require_once 'inc/custom-post-types/course.php';
294 - require_once 'inc/custom-post-types/lesson.php';
295 - require_once 'inc/custom-post-types/quiz.php';
296 - require_once 'inc/custom-post-types/question.php';
297 - require_once 'inc/custom-post-types/order.php';
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';*/
298 466
299 - require_once 'inc/interfaces/interface-curd.php';
300 - require_once 'inc/abstracts/abstract-array-access.php';
301 - require_once 'inc/abstracts/abstract-object-data.php';
302 - require_once 'inc/abstracts/abstract-post-data.php';
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';
303 471
304 - require_once 'inc/curds/class-lp-course-curd.php';
305 - require_once 'inc/curds/class-lp-section-curd.php';
306 - require_once 'inc/curds/class-lp-lesson-curd.php';
307 - require_once 'inc/curds/class-lp-quiz-curd.php';
308 - require_once 'inc/curds/class-lp-question-curd.php';
309 - require_once 'inc/curds/class-lp-order-curd.php';
310 - require_once 'inc/curds/class-lp-user-curd.php';
311 - require_once 'inc/curds/class-lp-user-item-curd.php';
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';
312 480
313 - require_once 'inc/course/class-lp-course-item.php';
314 - require_once 'inc/question/class-lp-question.php';
315 - require_once 'inc/course/class-lp-course-section.php';
316 - require_once 'inc/course/class-lp-course-no-required-enroll.php';
317 - require_once 'inc/user-item/class-lp-user-item.php';
318 - require_once 'inc/user-item/class-lp-user-item-course.php';
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';
319 487
320 - require_once 'inc/lp-deprecated.php'; // Will remove if Eduma and guest update all 4.0.0
321 - require_once 'inc/lp-core-functions.php';
322 - require_once 'inc/class-lp-autoloader.php';
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';
323 491
324 - require_once 'inc/lp-webhooks.php';
325 - 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';
326 494
327 - require_once 'inc/admin/helpers/class-lp-plugins-helper.php';
328 -
329 495 // Todo: tungnx check those files.
330 - require_once 'inc/abstracts/abstract-object-query.php';
331 - require_once 'inc/class-lp-course-query.php';
332 - require_once 'inc/abstracts/abstract-addon.php';
333 - require_once 'inc/class-lp-thumbnail-helper.php';
334 - require_once 'inc/cache.php';
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';
335 501
336 502 // Class handle check db of LP need to upgrade?
337 - require_once 'inc/admin/class-lp-updater.php';
503 + include_once 'inc/admin/class-lp-updater.php';
338 504
339 - require_once 'inc/course/lp-course-functions.php';
340 - require_once 'inc/course/abstract-course.php';
341 - require_once 'inc/course/class-lp-course.php';
342 - //require_once 'inc/course/class-lp-course-utils.php';
343 - require_once 'inc/quiz/lp-quiz-functions.php';
344 - require_once 'inc/quiz/class-lp-quiz.php';
345 - require_once 'inc/lesson/lp-lesson-functions.php';
346 - require_once 'inc/order/lp-order-functions.php';
347 - require_once 'inc/order/class-lp-order.php';
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';
348 513
349 - require_once 'inc/user/lp-user-functions.php';
350 - require_once 'inc/user/class-lp-user-factory.php';
351 - require_once 'inc/user/abstract-lp-user.php';
352 - require_once 'inc/user/class-lp-user.php';
353 - require_once 'inc/user/class-lp-profile.php';
354 - require_once 'inc/user-item/class-lp-user-item.php';
355 - require_once 'inc/user-item/class-lp-user-item-course.php';
356 - require_once 'inc/user-item/class-lp-user-item-quiz.php';
357 - require_once 'inc/user-item/class-lp-quiz-results.php';
358 - require_once 'inc/class-lp-session-handler.php';
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';
359 524
360 - 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';
361 534
362 535 // include template functions .
363 - require_once 'inc/lp-template-functions.php';
364 - require_once 'inc/templates/abstract-template.php';
365 - //require_once 'inc/class-lp-template.php';
536 + include_once 'inc/lp-template-functions.php';
537 + include_once 'inc/templates/abstract-template.php';
538 + //include_once 'inc/class-lp-template.php';
366 539
367 540 // Cart
368 - require_once 'inc/cart/class-lp-cart.php';
369 - 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';
370 543
371 544 // Block Templates
372 - require_once 'inc/block-template/class-block-until.php';
373 - 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();
374 548
375 549 // API
376 - require_once 'inc/abstracts/abstract-rest-api.php';
377 - require_once 'inc/abstracts/abstract-rest-controller.php';
378 - require_once 'inc/rest-api/class-lp-core-api.php';
379 - require_once 'inc/rest-api/class-lp-admin-core-api.php';
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';
380 554
381 - // include_once 'inc/theme-support/class-theme-support-base.php';
382 - // include_once 'inc/class-lp-theme-support.php';
383 -
384 555 /** Jwt */
385 556 include_once 'inc/jwt/class-jwt-auth.php';
386 557
387 - require_once 'inc/class-lp-widget.php';
388 - 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';
389 561
390 - // For plugin Elementor
391 - if ( defined( 'ELEMENTOR_VERSION' ) ) {
392 - require_once 'inc/external-plugin/elementor/class-lp-elementor.php';
393 - }
394 -
395 562 // TODO: update frontend editor before move to function include_files_admin.
396 - 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';
397 564
398 - require_once 'inc/class-lp-page-controller.php';
565 + include_once 'inc/class-lp-page-controller.php';
566 + LP_Page_Controller::instance();
399 567
400 - require_once 'inc/gateways/class-lp-gateway-abstract.php';
401 - 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';
402 571 }
403 572
404 573 /**
405 574 * Include file run on backend
@@ -408,20 +577,20 @@
408 577 if ( ! is_admin() ) {
409 578 return;
410 579 }
411 580
412 - require_once 'inc/admin/class-lp-admin-notice.php';
581 + include_once 'inc/admin/class-lp-admin-ajax.php';
413 582
583 + include_once 'inc/admin/class-lp-admin-notice.php';
584 +
414 585 // File handle install LP
415 - require_once 'inc/class-lp-install.php';
586 + include_once 'inc/class-lp-install.php';
416 587
417 588 // Meta box helper
418 - 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';
419 590
420 - require_once 'inc/admin/class-lp-admin.php';
421 - // require_once 'inc/admin/settings/abstract-settings-page.php';
422 -
423 - require_once 'inc/admin/class-lp-admin-ajax.php';
591 + // include_once 'inc/admin/class-lp-admin.php';
592 + // include_once 'inc/admin/settings/abstract-settings-page.php';
424 593 }
425 594
426 595 /**
427 596 * Include file run on frontend
@@ -430,113 +599,305 @@
430 599 if ( is_admin() ) {
431 600 return;
432 601 }
433 602
434 - require_once 'inc/class-lp-assets.php';
603 + include_once 'inc/class-lp-assets.php';
435 604
436 - 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';
437 606
438 - 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';
439 610 }
440 611
441 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 + /**
442 750 * Initial common hooks
443 751 */
444 - public function init_hooks() {
445 - if ( 0 !== strcmp( LP_PLUGIN_BASENAME, 'learnpress/learnpress.php' ) ) {
446 - add_action( 'admin_notices', array( $this, 'error' ) );
447 - }
752 + public function hooks() {
753 + add_action( 'init', array( $this, 'maybe_init_mcp_abilities' ), 20 );
448 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 +
449 785 // Add links setting|document|addon on plugins page.
450 786 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
451 787
452 788 register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
453 789 register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
454 - // add_action( 'deactivate_' . LP_PLUGIN_BASENAME, array( $this, 'on_deactivate' ) );
455 790
456 - if ( ! LP_Install::instance()->tables_install_done() ) {
457 - 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' ) );
458 805 }
459 806
460 - add_action( 'wp_loaded', array( $this, 'wp_loaded' ), 20 );
461 - add_action( 'after_setup_theme', array( $this, 'setup_theme' ) );
462 - add_action( 'plugins_loaded', array( $this, 'plugin_loaded' ), - 10 );
463 - // add_action( 'init', array( $this, 'wp_init' ), 10 );
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 + }
464 817
465 - // Check require version thim-core.
466 - 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 + );
467 868 }
468 869
469 870 /**
470 871 * Add links to Documentation and Extensions in plugin's list of action links
471 872 *
472 - * @since 4.3.11
473 - *
474 873 * @param array $links Array of action links
475 874 *
476 875 * @return array
876 + * @since 4.3.11
877 + * @version 1.0.1
477 878 */
478 879 public function plugin_links( array $links ): array {
479 - $links[] = sprintf( '<a href="%s">%s</a>', admin_url( 'admin.php?page=learn-press-settings' ), __( 'Settings', 'learnpress' ) );
480 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', 'https://docspress.thimpress.com/learnpress-4-0/', __( 'Documentation', 'learnpress' ) );
481 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', get_admin_url() . '/admin.php?page=learn-press-addons', __( 'Add-ons', 'learnpress' ) );
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 + );
482 895
483 896 return $links;
484 897 }
485 898
486 - public function error() {
487 - ?>
488 - <div class="error">
489 - <p>
490 - <?php
491 - printf(
492 - __(
493 - 'LearnPress plugin base directory must be <strong>learnpress/learnpres.php</strong> (case sensitive) to ensure all functions work properly and fully operational (currently <strong>%s</strong>)',
494 - 'learnpress'
495 - ),
496 - LP_PLUGIN_BASENAME
497 - );
498 - ?>
499 - </p>
500 - </div>
501 - <?php
502 - }
503 -
504 899 /**
505 - * Maybe flush rewrite rules
506 - */
507 - public function wp_init() {
508 - /*if ( LP()->session->flush_rewrite_rules ) {
509 - flush_rewrite_rules();
510 - unset( LP()->session->flush_rewrite_rules );
511 - }*/
512 - }
513 -
514 - /**
515 - * Get base name of plugin from file.
516 - *
517 - * @return string
518 - */
519 - // private function plugin_basename() {
520 - // return learn_press_plugin_basename( __FILE__ );
521 - // }
522 -
523 - /**
524 - * Magic function to get Learnpress data.
525 - *
526 - * @param $key
527 - *
528 - * @return bool|LP_Checkout|LP_Course|LP_Emails|LP_User|LP_User_Guest|mixed
529 - * @deprecated since 3.0.0
530 - * @editor tungnx
531 - * @modify 4.1.3.1 - comment
532 - */
533 - /*
534 - public function __get( $key ) {
535 - return false;
536 - }*/
537 -
538 - /**
539 900 * Trigger this function while activating Learnpress.
540 901 *
541 902 * @since 3.0.0
542 903 * @version 4.1.4.1
@@ -542,9 +903,8 @@
542 903 * @version 4.1.4.1
543 904 */
544 905 public function on_activate() {
545 906 LP_Install::instance()->on_activate();
546 - // do_action( 'learn-press/activate', $this );
547 907 }
548 908
549 909 /**
550 910 * Trigger this function while deactivating Learnpress.
@@ -557,127 +917,43 @@
557 917 do_action( 'learn-press/deactivate', $this );
558 918 }
559 919
560 920 /**
561 - * Trigger WP loaded actions.
921 + * Conditionally bootstrap MCP abilities.
562 922 *
563 - * @since 3.0.0
923 + * @return void
564 924 */
565 - public function wp_loaded() {
566 - if ( $this->is_request( 'frontend' ) ) {
567 - $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;
568 928 }
569 - }
570 929
571 - /**
572 - * Setup courses thumbnail.
573 - *
574 - * @since 3.0.0
575 - */
576 - public function setup_theme() {
577 - if ( ! current_theme_supports( 'post-thumbnails' ) ) {
578 - add_theme_support( 'post-thumbnails' );
579 - }
580 - add_post_type_support( LP_COURSE_CPT, 'thumbnail' );
581 -
582 - $size = LP_Settings::get_option(
583 - 'course_thumbnail_dimensions',
584 - array(
585 - 500,
586 - 300,
587 - )
588 - );
589 -
590 - $size = array_values( (array) $size );
591 -
592 - add_image_size( 'course_thumbnail', $size[0], $size[1], true );
930 + ApiKeyAuthenticator::init();
931 + Abilities::init();
593 932 }
594 933
595 934 /**
596 - * Trigger Learnpress loaded actions.
935 + * Handle load text domain for LearnPress.
597 936 *
598 - * @since 3.0.0
599 - * @version 1.0.2
600 - * @editor tungnx
937 + * @since 4.2.7.4
938 + * @version 1.0.1
601 939 */
602 - public function plugin_loaded() {
603 - 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' );
604 943
605 - // Polylang
606 - if ( defined( 'POLYLANG_VERSION' ) ) {
607 - require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
608 - LP_Polylang::instance();
609 - }
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 + }*/
610 951
611 - $this->init();
612 -
613 - // Todo: tungnx - remove this code after handle ajax on page learn-press-addons
614 - // require_once 'inc/background-process/class-lp-background-query-items.php';
615 - // require_once 'inc/background-process/class-lp-background-installer.php';
616 -
617 - require_once 'inc/lp-template-hooks.php';
618 -
619 - /**
620 - * Check version addons valid version require.
621 - * If not valid will be to deactivate.
622 - * Reload page, so not affect to hook "learn-press/ready"
623 - */
624 - $addons_valid = true;
625 - $plugins = get_option( 'active_plugins' );
626 -
627 - $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
628 -
629 - // Remove hook deactivate addon assignments v3.
630 - add_action(
631 - 'deactivate_learnpress-assignments/learnpress-assignments.php',
632 - array( $this, 'lp_assignment_install' ),
633 - - 10
634 - );
635 -
636 - foreach ( $list_lp_addon_activated as $lp_addon ) {
637 - $lp_addon_info = get_file_data(
638 - WP_PLUGIN_DIR . '/' . $lp_addon,
639 - array(
640 - 'Require_LP_Version' => 'Require_LP_Version',
641 - 'Version' => 'Version',
642 - )
643 - );
644 -
645 - // $lp_addon_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $lp_addon );
646 - $lp_addon_version = $lp_addon_info['Version'];
647 -
648 - $addon = new Lp_Addon();
649 - $addon->version = $lp_addon_version;
650 - $addon->plugin_base = $lp_addon;
651 - $addon->require_version = $lp_addon_info['Require_LP_Version'];
652 - $addon_valid = $addon->check_require_version_addon();
653 -
654 - if ( $addons_valid ) {
655 - $addon_valid = $addon->check_require_version_lp();
656 - }
657 -
658 - if ( ! $addon_valid ) {
659 - $addons_valid = false;
660 - }
661 - }
662 - // End check addons valid.
663 -
664 - if ( ! $addons_valid ) {
665 - return;
666 - }
667 -
668 - // let third parties know that we're ready .
669 - do_action( 'learn-press/ready' );
952 + load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
670 953 }
671 954
672 955 /**
673 - * Remove hook deactivate addon assignments v3.
674 - */
675 - public function lp_assignment_install() {
676 - remove_action( 'deactivate_learnpress-assignments/learnpress-assignments.php', 'lp_assignment_remove' );
677 - }
678 -
679 - /**
680 956 * Get instance of class LP_Template.
681 957 *
682 958 * @param string $type
683 959 *
@@ -686,40 +962,15 @@
686 962 * @throws Exception
687 963 * @since 3.3.0
688 964 */
689 965 public function template( $type = '' ) {
690 - if ( ! $this->template ) {
691 - $this->template = LP_Template::instance();
692 - }
966 + $this->template = LP_Template::instance();
967 + $templates = (array) $this->template->get_templates();
693 968
694 - return isset( $this->template[ $type ] ) ? $this->template[ $type ] : $this->template;
969 + return $templates[ $type ] ?? $this->template;
695 970 }
696 971
697 972 /**
698 - * Init LearnPress when WP initialises
699 - */
700 - public function init() {
701 - $this->api = new LP_Core_API();
702 - $this->admin_api = new LP_Admin_Core_API();
703 - // $this->theme_support = LP_Theme_Support::instance();
704 -
705 - // $this->view_log();
706 -
707 - $this->get_session();
708 -
709 - $this->settings = $this->settings();
710 -
711 - if ( $this->is_request( 'frontend' ) ) {
712 - $this->get_cart();
713 - }
714 -
715 - // Email hook notify
716 - include_once 'inc/emails/class-lp-email-hooks.php';
717 - // Init emails
718 - LP_Emails::instance();
719 - }
720 -
721 - /**
722 973 * Get session object instance.
723 974 *
724 975 * @return mixed
725 976 */
@@ -744,9 +995,9 @@
744 995 * Get cart object instance for online learning market.
745 996 *
746 997 * @return LP_Cart
747 998 */
748 - public function get_cart() : LP_Cart {
999 + public function get_cart(): LP_Cart {
749 1000 if ( ! $this->cart ) {
750 1001 $this->cart = LP_Cart::instance();
751 1002 }
752 1003
@@ -753,30 +1004,8 @@
753 1004 return $this->cart;
754 1005 }
755 1006
756 1007 /**
757 - * Check type of request.
758 - *
759 - * @param string $type ajax, frontend or admin.
760 - *
761 - * @return bool
762 - */
763 - public function is_request( $type ) {
764 - switch ( $type ) {
765 - case 'admin':
766 - return is_admin();
767 - case 'ajax':
768 - return defined( 'LP_DOING_AJAX' );
769 - case 'cron':
770 - return defined( 'DOING_CRON' );
771 - case 'frontend':
772 - return ( ! is_admin() || defined( 'LP_DOING_AJAX' ) ) && ! defined( 'DOING_CRON' );
773 - default:
774 - return strtolower( $_SERVER['REQUEST_METHOD'] ) == $type;
775 - }
776 - }
777 -
778 - /**
779 1008 * Get the plugin url.
780 1009 *
781 1010 * @param string $sub_dir
782 1011 *
@@ -870,16 +1099,8 @@
870 1099 }
871 1100
872 1101 return self::$_instance;
873 1102 }
874 -
875 - public function admin_notice_require_addon_version() {
876 - ?>
877 - <div class="notice notice-error">
878 - <p><?php echo( '<strong>LearnPress version ' . LEARNPRESS_VERSION . ' require Addon</strong> version 4.0.0 or higher' ); ?></p>
879 - </div>
880 - <?php
881 - }
882 1103 }
883 1104 }
884 1105
885 1106 /**
@@ -896,5 +1117,9 @@
896 1117 /**
897 1118 * Done! entry point of the plugin
898 1119 * Create new instance of LearnPress and put it to global
899 1120 */
900 -$GLOBALS['LearnPress'] = LP();
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';