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 +654 -379 4.1.7.3.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.3.2
7 + * Version: 4.4.8
8 8 * Author URI: http://thimpress.com
9 - * Requires at least: 5.8
10 - * Tested up to: 6.1.1
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,190 +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/quiz/lp-quiz-functions.php';
352 - require_once 'inc/quiz/class-lp-quiz.php';
353 - require_once 'inc/lesson/lp-lesson-functions.php';
354 - require_once 'inc/order/lp-order-functions.php';
355 - 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';
356 513
357 - require_once 'inc/user/lp-user-functions.php';
358 - require_once 'inc/user/class-lp-user-factory.php';
359 - require_once 'inc/user/abstract-lp-user.php';
360 - require_once 'inc/user/class-lp-user.php';
361 - require_once 'inc/user/class-lp-profile.php';
362 - require_once 'inc/user-item/class-lp-user-item.php';
363 - require_once 'inc/user-item/class-lp-user-item-course.php';
364 - require_once 'inc/user-item/class-lp-user-item-quiz.php';
365 - require_once 'inc/user-item/class-lp-quiz-results.php';
366 - 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';
367 524
368 - 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';
369 534
370 535 // include template functions .
371 - require_once 'inc/lp-template-functions.php';
372 - require_once 'inc/templates/abstract-template.php';
373 - //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';
374 539
375 540 // Cart
376 - require_once 'inc/cart/class-lp-cart.php';
377 - 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';
378 543
379 544 // Block Templates
380 - require_once 'inc/block-template/class-block-until.php';
381 - 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();
382 548
383 549 // API
384 - require_once 'inc/abstracts/abstract-rest-api.php';
385 - require_once 'inc/abstracts/abstract-rest-controller.php';
386 - require_once 'inc/rest-api/class-lp-core-api.php';
387 - 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';
388 554
389 555 /** Jwt */
390 556 include_once 'inc/jwt/class-jwt-auth.php';
391 557
392 - require_once 'inc/class-lp-widget.php';
393 - 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';
394 561
395 - // For plugin Elementor
396 - if ( defined( 'ELEMENTOR_VERSION' ) ) {
397 - require_once 'inc/external-plugin/elementor/class-lp-elementor.php';
398 - }
399 -
400 562 // TODO: update frontend editor before move to function include_files_admin.
401 - 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';
402 564
403 - require_once 'inc/class-lp-page-controller.php';
565 + include_once 'inc/class-lp-page-controller.php';
566 + LP_Page_Controller::instance();
404 567
405 - require_once 'inc/gateways/class-lp-gateway-abstract.php';
406 - 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';
407 571 }
408 572
409 573 /**
410 574 * Include file run on backend
@@ -413,20 +577,20 @@
413 577 if ( ! is_admin() ) {
414 578 return;
415 579 }
416 580
417 - require_once 'inc/admin/class-lp-admin-ajax.php';
581 + include_once 'inc/admin/class-lp-admin-ajax.php';
418 582
419 - require_once 'inc/admin/class-lp-admin-notice.php';
583 + include_once 'inc/admin/class-lp-admin-notice.php';
420 584
421 585 // File handle install LP
422 - require_once 'inc/class-lp-install.php';
586 + include_once 'inc/class-lp-install.php';
423 587
424 588 // Meta box helper
425 - 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';
426 590
427 - require_once 'inc/admin/class-lp-admin.php';
428 - // require_once 'inc/admin/settings/abstract-settings-page.php';
591 + // include_once 'inc/admin/class-lp-admin.php';
592 + // include_once 'inc/admin/settings/abstract-settings-page.php';
429 593 }
430 594
431 595 /**
432 596 * Include file run on frontend
@@ -435,51 +599,300 @@
435 599 if ( is_admin() ) {
436 600 return;
437 601 }
438 602
439 - require_once 'inc/class-lp-assets.php';
603 + include_once 'inc/class-lp-assets.php';
440 604
441 - 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';
442 606
443 - 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';
444 610 }
445 611
446 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 + /**
447 750 * Initial common hooks
448 751 */
449 - public function init_hooks() {
752 + public function hooks() {
753 + add_action( 'init', array( $this, 'maybe_init_mcp_abilities' ), 20 );
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 +
450 785 // Add links setting|document|addon on plugins page.
451 786 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
452 787
453 788 register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
454 789 register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
455 - // add_action( 'deactivate_' . LP_PLUGIN_BASENAME, array( $this, 'on_deactivate' ) );
456 790
457 - if ( ! LP_Install::instance()->tables_install_done() ) {
458 - 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' ) );
459 805 }
460 806
461 - add_action( 'wp_loaded', array( $this, 'wp_loaded' ), 20 );
462 - //add_action( 'after_setup_theme', array( $this, 'setup_theme' ) );
463 - 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 + }
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
@@ -504,123 +917,43 @@
504 917 do_action( 'learn-press/deactivate', $this );
505 918 }
506 919
507 920 /**
508 - * Trigger WP loaded actions.
921 + * Conditionally bootstrap MCP abilities.
509 922 *
510 - * @since 3.0.0
923 + * @return void
511 924 */
512 - public function wp_loaded() {
513 - if ( $this->is_request( 'frontend' ) ) {
514 - $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;
515 928 }
516 - }
517 929
518 - /**
519 - * Setup courses thumbnail.
520 - *
521 - * @since 3.0.0
522 - */
523 - public function setup_theme() {
524 - if ( ! current_theme_supports( 'post-thumbnails' ) ) {
525 - add_theme_support( 'post-thumbnails' );
526 - }
527 - add_post_type_support( LP_COURSE_CPT, 'thumbnail' );
528 -
529 - $size = LP_Settings::get_option(
530 - 'course_thumbnail_dimensions',
531 - array(
532 - 500,
533 - 300,
534 - )
535 - );
536 -
537 - $size = array_values( (array) $size );
538 -
539 - add_image_size( 'course_thumbnail', $size[0], $size[1], true );
930 + ApiKeyAuthenticator::init();
931 + Abilities::init();
540 932 }
541 933
542 934 /**
543 - * Trigger Learnpress loaded actions.
935 + * Handle load text domain for LearnPress.
544 936 *
545 - * @since 3.0.0
546 - * @version 1.0.2
547 - * @editor tungnx
937 + * @since 4.2.7.4
938 + * @version 1.0.1
548 939 */
549 - public function plugin_loaded() {
550 - 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' );
551 943
552 - // Polylang
553 - if ( defined( 'POLYLANG_VERSION' ) ) {
554 - require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
555 - LP_Polylang::instance();
556 - }
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 + }*/
557 951
558 - $this->init();
559 -
560 - require_once 'inc/lp-template-hooks.php';
561 -
562 - /**
563 - * Check version addons valid version require.
564 - * If not valid will be to deactivate.
565 - * Reload page, so not affect to hook "learn-press/ready"
566 - */
567 - $addons_valid = true;
568 - $plugins = get_option( 'active_plugins' );
569 -
570 - $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
571 -
572 - // Remove hook deactivate addon assignments v3.
573 - add_action(
574 - 'deactivate_learnpress-assignments/learnpress-assignments.php',
575 - array( $this, 'lp_assignment_install' ),
576 - - 10
577 - );
578 -
579 - foreach ( $list_lp_addon_activated as $lp_addon ) {
580 - $lp_addon_info = get_file_data(
581 - WP_PLUGIN_DIR . '/' . $lp_addon,
582 - array(
583 - 'Require_LP_Version' => 'Require_LP_Version',
584 - 'Version' => 'Version',
585 - )
586 - );
587 -
588 - // $lp_addon_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $lp_addon );
589 - $lp_addon_version = $lp_addon_info['Version'];
590 -
591 - $addon = new Lp_Addon();
592 - $addon->version = $lp_addon_version;
593 - $addon->plugin_base = $lp_addon;
594 - $addon->require_version = $lp_addon_info['Require_LP_Version'];
595 - $addon_valid = $addon->check_require_version_addon();
596 -
597 - if ( $addons_valid ) {
598 - $addon_valid = $addon->check_require_version_lp();
599 - }
600 -
601 - if ( ! $addon_valid ) {
602 - $addons_valid = false;
603 - }
604 - }
605 - // End check addons valid.
606 -
607 - if ( ! $addons_valid ) {
608 - return;
609 - }
610 -
611 - // let third parties know that we're ready .
612 - do_action( 'learn-press/ready' );
952 + load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
613 953 }
614 954
615 955 /**
616 - * Remove hook deactivate addon assignments v3.
617 - */
618 - public function lp_assignment_install() {
619 - remove_action( 'deactivate_learnpress-assignments/learnpress-assignments.php', 'lp_assignment_remove' );
620 - }
621 -
622 - /**
623 956 * Get instance of class LP_Template.
624 957 *
625 958 * @param string $type
626 959 *
@@ -636,29 +969,8 @@
636 969 return $templates[ $type ] ?? $this->template;
637 970 }
638 971
639 972 /**
640 - * Init LearnPress when WP initialises
641 - */
642 - public function init() {
643 - $this->api = new LP_Core_API();
644 - $this->admin_api = new LP_Admin_Core_API();
645 -
646 - $this->get_session();
647 -
648 - $this->settings = $this->settings();
649 -
650 - if ( $this->is_request( 'frontend' ) ) {
651 - $this->get_cart();
652 - }
653 -
654 - // Email hook notify
655 - include_once 'inc/emails/class-lp-email-hooks.php';
656 - // Init emails
657 - LP_Emails::instance();
658 - }
659 -
660 - /**
661 973 * Get session object instance.
662 974 *
663 975 * @return mixed
664 976 */
@@ -683,9 +995,9 @@
683 995 * Get cart object instance for online learning market.
684 996 *
685 997 * @return LP_Cart
686 998 */
687 - public function get_cart() : LP_Cart {
999 + public function get_cart(): LP_Cart {
688 1000 if ( ! $this->cart ) {
689 1001 $this->cart = LP_Cart::instance();
690 1002 }
691 1003
@@ -692,30 +1004,8 @@
692 1004 return $this->cart;
693 1005 }
694 1006
695 1007 /**
696 - * Check type of request.
697 - *
698 - * @param string $type ajax, frontend or admin.
699 - *
700 - * @return bool
701 - */
702 - public function is_request( $type ) {
703 - switch ( $type ) {
704 - case 'admin':
705 - return is_admin();
706 - case 'ajax':
707 - return defined( 'LP_DOING_AJAX' );
708 - case 'cron':
709 - return defined( 'DOING_CRON' );
710 - case 'frontend':
711 - return ( ! is_admin() || defined( 'LP_DOING_AJAX' ) ) && ! defined( 'DOING_CRON' );
712 - default:
713 - return strtolower( $_SERVER['REQUEST_METHOD'] ) == $type;
714 - }
715 - }
716 -
717 - /**
718 1008 * Get the plugin url.
719 1009 *
720 1010 * @param string $sub_dir
721 1011 *
@@ -809,27 +1099,8 @@
809 1099 }
810 1100
811 1101 return self::$_instance;
812 1102 }
813 -
814 - /**
815 - * Copy class-lp-mu-plugin.php to mu_plugins folder
816 - *
817 - * @return void
818 - */
819 - public function mu_plugin() {
820 - try {
821 - // Remove file mu plugin create on version 4.1.7.
822 - $name = 'class-lp-mu-plugin.php';
823 - $mu_plugins_path = WPMU_PLUGIN_DIR;
824 - $mu_plugin_file_path = $mu_plugins_path . '/' . $name;
825 - if ( file_exists( $mu_plugin_file_path ) ) {
826 - LP_WP_Filesystem::instance()->lp_filesystem->delete( $mu_plugin_file_path );
827 - }
828 - } catch ( Throwable $e ) {
829 - error_log( $e->getMessage() );
830 - }
831 - }
832 1103 }
833 1104 }
834 1105
835 1106 /**
@@ -847,4 +1118,8 @@
847 1118 * Done! entry point of the plugin
848 1119 * Create new instance of LearnPress and put it to global
849 1120 */
850 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';