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 -386 4.2.04.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.2.0
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,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,40 +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 - // Copy mu plugin.
152 - $this->mu_plugin();
153 -
154 - // hooks .
155 - $this->init_hooks();
156 243 }
157 244
158 245 /**
159 246 * Define constant.
@@ -158,9 +245,12 @@
158 245 /**
159 246 * Define constant.
160 247 */
161 248 protected function plugin_defines() {
162 -
249 + if ( ! defined( 'LP_PLUGIN_FILE' ) ) {
250 + define( 'LP_PLUGIN_FILE', __FILE__ );
251 + include_once 'inc/lp-constants.php';
252 + }
163 253 }
164 254
165 255 /**
166 256 * Defines database table names.
@@ -182,11 +272,9 @@
182 272 'question_answermeta',
183 273 );
184 274
185 275 foreach ( $tables as $short_name ) {
186 - $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
187 - $this->_table_prefixes[ 'tbl_' . $short_name ] = $table_name;
188 -
276 + $table_name = $wpdb->prefix . LP_TABLE_PREFIX . $short_name;
189 277 $backward_key = 'learnpress_' . $short_name;
190 278 $wpdb->{$backward_key} = $table_name;
191 279 }
192 280 }
@@ -194,8 +282,10 @@
194 282 /**
195 283 * Includes needed files.
196 284 */
197 285 public function includes() {
286 + include_once LP_PLUGIN_PATH . 'vendor/autoload.php';
287 +
198 288 // Include required files load anywhere, both frontend and backend.
199 289 $this->include_files_global();
200 290
201 291 // include files when LP ready run - after setup success .
@@ -217,195 +307,268 @@
217 307 *
218 308 * @return void
219 309 */
220 310 private function include_files_global() {
221 - require_once 'inc/Helper/Singleton.php';
222 - require_once 'inc/class-lp-multi-language.php';
223 311
224 312 // Filter query .
225 - require_once 'inc/filters/class-lp-filter.php';
226 - require_once 'inc/filters/class-lp-post-type-filter.php';
227 - require_once 'inc/filters/class-lp-course-filter.php';
228 - require_once 'inc/filters/class-lp-order-filter.php';
229 - require_once 'inc/filters/class-lp-session-filter.php';
230 - require_once 'inc/filters/class-lp-section-filter.php';
231 - require_once 'inc/filters/class-lp-section-items-filter.php';
232 - require_once 'inc/filters/class-lp-question-filter.php';
233 - require_once 'inc/filters/class-lp-user-items-filter.php';
234 - require_once 'inc/filters/class-lp-quiz-questions-filter.php';
235 - require_once 'inc/filters/class-lp-question-answers-filter.php';
236 - 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';
237 331
238 332 // Query Database .
239 - require_once 'inc/databases/class-lp-db.php';
240 - require_once 'inc/databases/class-lp-order-db.php';
241 - require_once 'inc/databases/class-lp-course-db.php';
242 - require_once 'inc/databases/class-lp-lesson-db.php';
243 - require_once 'inc/databases/class-lp-section-db.php';
244 - require_once 'inc/databases/class-lp-section-items-db.php';
245 - require_once 'inc/databases/class-lp-quiz-db.php';
246 - require_once 'inc/databases/class-lp-quiz-questions-db.php';
247 - require_once 'inc/databases/class-lp-question-answers-db.php';
248 - require_once 'inc/databases/class-lp-sessions-db.php';
249 - require_once 'inc/databases/class-lp-question-db.php';
250 - require_once 'inc/databases/class-lp-user-items-db.php';
251 - 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';
252 354
253 - // Read files config on folder config .
254 - require_once 'inc/Helper/Config.php';
255 -
256 355 // File system .
257 - require_once 'inc/class-lp-file-system.php';
356 + include_once 'inc/class-lp-file-system.php';
258 357
259 358 // File helper
260 - require_once 'inc/class-lp-helper.php';
261 - require_once 'inc/Helper/Template.php';
359 + include_once 'inc/class-lp-helper.php';
262 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 +
263 417 // Models
264 - require_once 'inc/models/class-lp-rest-response.php';
265 - include_once 'inc/models/steps/class-lp-group-step.php';
266 - include_once 'inc/models/steps/class-lp-step.php';
267 - 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';
268 422
269 423 // Handle steps.
270 - require_once 'inc/handle-steps/class-lp-handle-steps.php';
271 - 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';
272 426
273 427 // LP Cache
274 - require_once 'inc/cache/class-lp-cache.php';
275 - require_once 'inc/cache/class-lp-courses-cache.php';
276 - require_once 'inc/cache/class-lp-course-cache.php';
277 - require_once 'inc/cache/class-lp-quiz-cache.php';
278 - require_once 'inc/cache/class-lp-question-cache.php';
279 - require_once 'inc/cache/class-lp-session-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';
280 436
281 437 // Background processes.
282 - require_once 'inc/libraries/wp-background-process/wp-background-processing.php';
283 - require_once 'inc/background-process/abstract-lp-async-request.php';
284 - require_once 'inc/background-process/class-lp-background-single-course.php';
285 - 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';
286 444
287 445 // Assets object
288 - require_once 'inc/class-lp-asset-key.php';
289 - require_once 'inc/abstracts/abstract-assets.php';
446 + include_once 'inc/class-lp-asset-key.php';
447 + include_once 'inc/abstracts/abstract-assets.php';
290 448
291 449 // Debug class
292 - require_once 'inc/class-lp-debug.php';
450 + include_once 'inc/class-lp-debug.php';
293 451
294 - require_once 'inc/class-lp-settings.php';
295 - require_once 'inc/abstract-settings.php';
296 - require_once 'inc/settings/abstract-settings-page.php';
297 - require_once 'inc/settings/class-lp-settings-courses.php';
298 - require_once 'inc/class-lp-global.php';
299 - 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';
300 458
301 459 // Register custom-post-type and taxonomies .
302 - require_once 'inc/custom-post-types/abstract.php';
303 - require_once 'inc/custom-post-types/course.php';
304 - require_once 'inc/custom-post-types/lesson.php';
305 - require_once 'inc/custom-post-types/quiz.php';
306 - require_once 'inc/custom-post-types/question.php';
307 - 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';*/
308 466
309 - require_once 'inc/interfaces/interface-curd.php';
310 - require_once 'inc/abstracts/abstract-array-access.php';
311 - require_once 'inc/abstracts/abstract-object-data.php';
312 - 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';
313 471
314 - require_once 'inc/curds/class-lp-course-curd.php';
315 - require_once 'inc/curds/class-lp-section-curd.php';
316 - require_once 'inc/curds/class-lp-lesson-curd.php';
317 - require_once 'inc/curds/class-lp-quiz-curd.php';
318 - require_once 'inc/curds/class-lp-question-curd.php';
319 - require_once 'inc/curds/class-lp-order-curd.php';
320 - require_once 'inc/curds/class-lp-user-curd.php';
321 - 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';
322 480
323 - require_once 'inc/course/class-lp-course-item.php';
324 - require_once 'inc/question/class-lp-question.php';
325 - require_once 'inc/course/class-lp-course-section.php';
326 - require_once 'inc/course/class-lp-course-no-required-enroll.php';
327 - require_once 'inc/user-item/class-lp-user-item.php';
328 - 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';
329 487
330 - require_once 'inc/lp-deprecated.php'; // Will remove if Eduma and guest update all 4.0.0
331 - require_once 'inc/lp-core-functions.php';
332 - 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';
333 491
334 - require_once 'inc/lp-webhooks.php';
335 - 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';
336 494
337 - require_once 'inc/admin/helpers/class-lp-plugins-helper.php';
338 -
339 495 // Todo: tungnx check those files.
340 - require_once 'inc/abstracts/abstract-object-query.php';
341 - require_once 'inc/class-lp-course-query.php';
342 - require_once 'inc/abstracts/abstract-addon.php';
343 - require_once 'inc/class-lp-thumbnail-helper.php';
344 - 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';
345 501
346 502 // Class handle check db of LP need to upgrade?
347 - require_once 'inc/admin/class-lp-updater.php';
503 + include_once 'inc/admin/class-lp-updater.php';
348 504
349 - require_once 'inc/course/lp-course-functions.php';
350 - require_once 'inc/course/abstract-course.php';
351 - require_once 'inc/course/class-lp-course.php';
352 - require_once 'inc/quiz/lp-quiz-functions.php';
353 - require_once 'inc/quiz/class-lp-quiz.php';
354 - require_once 'inc/lesson/lp-lesson-functions.php';
355 - require_once 'inc/order/lp-order-functions.php';
356 - require_once 'inc/order/class-lp-order.php';
505 + include_once 'inc/course/lp-course-functions.php';
506 + include_once 'inc/course/abstract-course.php';
507 + include_once 'inc/course/class-lp-course.php';
508 + include_once 'inc/quiz/lp-quiz-functions.php';
509 + include_once 'inc/quiz/class-lp-quiz.php';
510 + //include_once 'inc/lesson/lp-lesson-functions.php';
511 + include_once 'inc/order/lp-order-functions.php';
512 + include_once 'inc/order/class-lp-order.php';
357 513
358 - require_once 'inc/user/lp-user-functions.php';
359 - require_once 'inc/user/class-lp-user-factory.php';
360 - require_once 'inc/user/abstract-lp-user.php';
361 - require_once 'inc/user/class-lp-user.php';
362 - require_once 'inc/user/class-lp-profile.php';
363 - require_once 'inc/user-item/class-lp-user-item.php';
364 - require_once 'inc/user-item/class-lp-user-item-course.php';
365 - require_once 'inc/user-item/class-lp-user-item-quiz.php';
366 - require_once 'inc/user-item/class-lp-quiz-results.php';
367 - require_once 'inc/class-lp-session-handler.php';
514 + include_once 'inc/user/lp-user-functions.php';
515 + include_once 'inc/user/class-lp-user-factory.php';
516 + WebhookDispatcher::instance();
517 + include_once 'inc/user/abstract-lp-user.php';
518 + include_once 'inc/user/class-lp-user.php';
519 + include_once 'inc/user/class-lp-profile.php';
520 + include_once 'inc/user-item/class-lp-user-item.php';
521 + include_once 'inc/user-item/class-lp-user-item-course.php';
522 + include_once 'inc/user-item/class-lp-user-item-quiz.php';
523 + include_once 'inc/user-item/class-lp-quiz-results.php';
368 524
369 - require_once 'inc/class-lp-shortcodes.php';
525 + // Shortcodes.
526 + SingleInstructorShortcode::instance();
527 + ListInstructorsShortcode::instance();
528 + CourseMaterialShortcode::instance();
529 + CourseButtonShortcode::instance();
530 + FilterCourseShortcode::instance();
531 + ListCoursesShortcode::instance();
532 + //ListCourseRecentShortcode::instance();
533 + include_once 'inc/class-lp-shortcodes.php';
370 534
371 535 // include template functions .
372 - require_once 'inc/lp-template-functions.php';
373 - require_once 'inc/templates/abstract-template.php';
374 - //require_once 'inc/class-lp-template.php';
536 + include_once 'inc/lp-template-functions.php';
537 + include_once 'inc/templates/abstract-template.php';
538 + //include_once 'inc/class-lp-template.php';
375 539
376 540 // Cart
377 - require_once 'inc/cart/class-lp-cart.php';
378 - require_once 'inc/cart/lp-cart-functions.php';
541 + include_once 'inc/cart/class-lp-cart.php';
542 + include_once 'inc/cart/lp-cart-functions.php';
379 543
380 544 // Block Templates
381 - require_once 'inc/block-template/class-block-until.php';
382 - require_once 'inc/block-template/class-block-controller.php';
545 + //include_once 'inc/block-template/class-abstract-block-template.php';
546 + //include_once 'inc/block-template/class-block-template-handle.php';
547 + GutenbergHandleMain::instance();
383 548
384 549 // API
385 - require_once 'inc/abstracts/abstract-rest-api.php';
386 - require_once 'inc/abstracts/abstract-rest-controller.php';
387 - require_once 'inc/rest-api/class-lp-core-api.php';
388 - require_once 'inc/rest-api/class-lp-admin-core-api.php';
550 + include_once 'inc/abstracts/abstract-rest-api.php';
551 + include_once 'inc/abstracts/abstract-rest-controller.php';
552 + include_once 'inc/rest-api/class-lp-core-api.php';
553 + include_once 'inc/rest-api/class-lp-admin-core-api.php';
389 554
390 555 /** Jwt */
391 556 include_once 'inc/jwt/class-jwt-auth.php';
392 557
393 - require_once 'inc/class-lp-widget.php';
394 - require_once 'inc/lp-widget-functions.php';
558 + LPRegisterWidget::instance();
559 + include_once 'inc/class-lp-widget.php';
560 + include_once 'inc/lp-widget-functions.php';
395 561
396 - // For plugin Elementor
397 - if ( defined( 'ELEMENTOR_VERSION' ) ) {
398 - require_once 'inc/external-plugin/elementor/class-lp-elementor.php';
399 - }
400 -
401 562 // TODO: update frontend editor before move to function include_files_admin.
402 - require_once 'inc/admin/views/meta-boxes/class-lp-meta-box.php';
563 + include_once 'inc/admin/views/meta-boxes/class-lp-meta-box.php';
403 564
404 - require_once 'inc/class-lp-page-controller.php';
565 + include_once 'inc/class-lp-page-controller.php';
566 + LP_Page_Controller::instance();
405 567
406 - require_once 'inc/gateways/class-lp-gateway-abstract.php';
407 - require_once 'inc/gateways/class-lp-gateways.php';
568 + include_once 'inc/gateways/class-lp-gateway-abstract.php';
569 + include_once 'inc/gateways/subscriptions/class-lp-subscription-manager.php';
570 + include_once 'inc/gateways/class-lp-gateways.php';
408 571 }
409 572
410 573 /**
411 574 * Include file run on backend
@@ -414,20 +577,20 @@
414 577 if ( ! is_admin() ) {
415 578 return;
416 579 }
417 580
418 - require_once 'inc/admin/class-lp-admin-ajax.php';
581 + include_once 'inc/admin/class-lp-admin-ajax.php';
419 582
420 - require_once 'inc/admin/class-lp-admin-notice.php';
583 + include_once 'inc/admin/class-lp-admin-notice.php';
421 584
422 585 // File handle install LP
423 - require_once 'inc/class-lp-install.php';
586 + include_once 'inc/class-lp-install.php';
424 587
425 588 // Meta box helper
426 - 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';
427 590
428 - require_once 'inc/admin/class-lp-admin.php';
429 - // 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';
430 593 }
431 594
432 595 /**
433 596 * Include file run on frontend
@@ -436,51 +599,300 @@
436 599 if ( is_admin() ) {
437 600 return;
438 601 }
439 602
440 - require_once 'inc/class-lp-assets.php';
603 + include_once 'inc/class-lp-assets.php';
441 604
442 - require_once 'inc/course/class-model-user-can-view-course-item.php';
605 + include_once 'inc/course/class-model-user-can-view-course-item.php';
443 606
444 - require_once 'inc/class-lp-ajax.php';
607 + include_once 'inc/class-lp-ajax.php';
608 +
609 + include_once 'inc/class-lp-session-handler.php';
445 610 }
446 611
447 612 /**
613 + * Main instance of LearnPress.
614 + * Must load on "init" hook of WordPress.
615 + * 1. Load text domain.
616 + * 2. Handle lp ajax.
617 + *
618 + * @return void
619 + * @version 4.2.7.6
620 + * @version 1.0.2
621 + */
622 + public function lp_main_handle() {
623 + try {
624 + // Load text domain.
625 + $this->load_plugin_text_domain();
626 +
627 + // Register custom post type and taxonomies .
628 + include_once 'inc/custom-post-types/abstract.php';
629 + include_once 'inc/custom-post-types/course.php';
630 + include_once 'inc/custom-post-types/lesson.php';
631 + include_once 'inc/custom-post-types/quiz.php';
632 + include_once 'inc/custom-post-types/question.php';
633 + include_once 'inc/custom-post-types/order.php';
634 +
635 + // Polylang
636 + if ( defined( 'POLYLANG_VERSION' ) ) {
637 + include_once 'inc/ExternalPlugin/Polylang/class-lp-polylang.php';
638 + LP_Polylang::instance();
639 + }
640 +
641 + // For plugin Elementor
642 + if ( defined( 'ELEMENTOR_VERSION' ) ) {
643 + LPElementor::instance();
644 + }
645 +
646 + // For plugin WPSEO
647 + if ( defined( 'WPSEO_FILE' ) ) {
648 + LPYoastSeo::instance();
649 + }
650 +
651 + // For plugin RankMath
652 + if ( defined( 'RANK_MATH_VERSION' ) ) {
653 + LPRankMath::instance();
654 + }
655 +
656 + $this->api = new LP_Core_API();
657 + $this->admin_api = new LP_Admin_Core_API();
658 + $this->get_session();
659 + $this->settings = $this->settings();
660 + $this->get_cart();
661 +
662 + // Init emails
663 + LP_Emails::instance();
664 + // Email hook notify
665 + include_once 'inc/emails/class-lp-email-hooks.php';
666 +
667 + if ( is_admin() ) {
668 + $this->check_addons_version_valid();
669 +
670 + include_once 'inc/admin/class-lp-admin.php';
671 + }
672 +
673 + // let third parties know that we're ready .
674 + do_action( 'learn-press/ready' );
675 +
676 + // For addon sorting choice old <= v4.0.1
677 + /*if ( class_exists( 'LP_Addon_Sorting_Choice_Preload' ) ) {
678 + if ( version_compare( LP_ADDON_SORTING_CHOICE_VER, '4.0.1', '<=' ) ) {
679 + $lp_addon_sorting_choice = new LP_Addon_Sorting_Choice();
680 + $lp_addon_sorting_choice->init();
681 + }
682 + }*/
683 +
684 + /**
685 + * Init gateways, to load all payment gateways, catch callback.
686 + * Must be call after learn-press/ready to register hook of addon.
687 + */
688 + LP_Gateways::instance();
689 +
690 + /**
691 + * Fixed temporary for emails of Announcement v4.0.6, Assignment v4.1.1 addons.
692 + * @since 4.2.7.4
693 + * When 2 addons update to new version, will remove this code.
694 + */
695 + /*if ( class_exists( 'LP_Addon_Announcements_Preload' ) ) {
696 + if ( version_compare( LP_ADDON_ANNOUNCEMENTS_VER, '4.0.6', '<=' ) ) {
697 + $addon_announcement = LP_Addon_Announcements_Preload::$addon;
698 + $addon_announcement->emails_setting();
699 + }
700 + }*/
701 + /*if ( class_exists( 'LP_Addon_Assignment_Preload' ) ) {
702 + if ( version_compare( LP_ADDON_ASSIGNMENT_VER, '4.1.1', '<=' ) ) {
703 + $addon_assignment = LP_Addon_Assignment_Preload::$addon;
704 + $addon_assignment->emails_setting();
705 + }
706 + }*/
707 + } catch ( Throwable $e ) {
708 + LP_Debug::error_log( $e );
709 + }
710 + }
711 +
712 + /**
713 + * Check version addons valid version require.
714 + * If not valid will be to deactivate.
715 + * Reload page, so not affect to hook "learn-press/ready"
716 + */
717 + public function check_addons_version_valid() {
718 + $addons_valid = true;
719 + $plugins = get_option( 'active_plugins' );
720 +
721 + $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
722 + foreach ( $list_lp_addon_activated as $lp_addon ) {
723 + $lp_addon_info = get_file_data(
724 + WP_PLUGIN_DIR . '/' . $lp_addon,
725 + array(
726 + 'Require_LP_Version' => 'Require_LP_Version',
727 + 'Version' => 'Version',
728 + )
729 + );
730 +
731 + $lp_addon_version = $lp_addon_info['Version'];
732 +
733 + $addon = new LP_Addon();
734 + $addon->version = $lp_addon_version;
735 + $addon->plugin_base = $lp_addon;
736 + $addon->require_version = $lp_addon_info['Require_LP_Version'];
737 + $addon_valid = $addon->check_require_version_addon();
738 +
739 + if ( $addons_valid ) {
740 + //$addon_valid = $addon->check_require_version_lp();
741 + }
742 +
743 + if ( ! $addon_valid ) {
744 + $addons_valid = false;
745 + }
746 + }
747 + }
748 +
749 + /**
448 750 * Initial common hooks
449 751 */
450 - public function init_hooks() {
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 +
451 785 // Add links setting|document|addon on plugins page.
452 786 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
453 787
454 788 register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
455 789 register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
456 - // add_action( 'deactivate_' . LP_PLUGIN_BASENAME, array( $this, 'on_deactivate' ) );
457 790
458 - if ( ! LP_Install::instance()->tables_install_done() ) {
459 - 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' ) );
460 805 }
461 806
462 - add_action( 'wp_loaded', array( $this, 'wp_loaded' ), 20 );
463 - //add_action( 'after_setup_theme', array( $this, 'setup_theme' ) );
464 - 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 + }
465 817
466 - // Check require version thim-core.
467 - 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 + );
468 868 }
469 869
470 870 /**
471 871 * Add links to Documentation and Extensions in plugin's list of action links
472 872 *
473 - * @since 4.3.11
474 - *
475 873 * @param array $links Array of action links
476 874 *
477 875 * @return array
876 + * @since 4.3.11
877 + * @version 1.0.1
478 878 */
479 879 public function plugin_links( array $links ): array {
480 - $links[] = sprintf( '<a href="%s">%s</a>', admin_url( 'admin.php?page=learn-press-settings' ), __( 'Settings', 'learnpress' ) );
481 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', 'https://docspress.thimpress.com/learnpress-4-0/', __( 'Documentation', 'learnpress' ) );
482 - $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 + );
483 895
484 896 return $links;
485 897 }
486 898
@@ -505,129 +917,43 @@
505 917 do_action( 'learn-press/deactivate', $this );
506 918 }
507 919
508 920 /**
509 - * Trigger WP loaded actions.
921 + * Conditionally bootstrap MCP abilities.
510 922 *
511 - * @since 3.0.0
923 + * @return void
512 924 */
513 - public function wp_loaded() {
514 - if ( $this->is_request( 'frontend' ) ) {
515 - $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;
516 928 }
517 - }
518 929
519 - /**
520 - * Setup courses thumbnail.
521 - *
522 - * @since 3.0.0
523 - */
524 - public function setup_theme() {
525 - if ( ! current_theme_supports( 'post-thumbnails' ) ) {
526 - add_theme_support( 'post-thumbnails' );
527 - }
528 - add_post_type_support( LP_COURSE_CPT, 'thumbnail' );
529 -
530 - $size = LP_Settings::get_option(
531 - 'course_thumbnail_dimensions',
532 - array(
533 - 500,
534 - 300,
535 - )
536 - );
537 -
538 - $size = array_values( (array) $size );
539 -
540 - add_image_size( 'course_thumbnail', $size[0], $size[1], true );
930 + ApiKeyAuthenticator::init();
931 + Abilities::init();
541 932 }
542 933
543 934 /**
544 - * Trigger Learnpress loaded actions.
935 + * Handle load text domain for LearnPress.
545 936 *
546 - * @since 3.0.0
547 - * @version 1.0.2
548 - * @editor tungnx
937 + * @since 4.2.7.4
938 + * @version 1.0.1
549 939 */
550 - public function plugin_loaded() {
551 - 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' );
552 943
553 - // For check wp_remote call normally of WP
554 - if ( ! empty( LP_Request::get_param( 'lp_test_wp_remote' ) ) ) {
555 - echo '[TEST_REMOTE]';
556 - die;
557 - }
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 + }*/
558 951
559 - // Polylang
560 - if ( defined( 'POLYLANG_VERSION' ) ) {
561 - require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
562 - LP_Polylang::instance();
563 - }
564 -
565 - $this->init();
566 -
567 - require_once 'inc/lp-template-hooks.php';
568 -
569 - /**
570 - * Check version addons valid version require.
571 - * If not valid will be to deactivate.
572 - * Reload page, so not affect to hook "learn-press/ready"
573 - */
574 - $addons_valid = true;
575 - $plugins = get_option( 'active_plugins' );
576 -
577 - $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
578 -
579 - // Remove hook deactivate addon assignments v3.
580 - add_action(
581 - 'deactivate_learnpress-assignments/learnpress-assignments.php',
582 - array( $this, 'lp_assignment_install' ),
583 - - 10
584 - );
585 -
586 - foreach ( $list_lp_addon_activated as $lp_addon ) {
587 - $lp_addon_info = get_file_data(
588 - WP_PLUGIN_DIR . '/' . $lp_addon,
589 - array(
590 - 'Require_LP_Version' => 'Require_LP_Version',
591 - 'Version' => 'Version',
592 - )
593 - );
594 -
595 - // $lp_addon_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $lp_addon );
596 - $lp_addon_version = $lp_addon_info['Version'];
597 -
598 - $addon = new Lp_Addon();
599 - $addon->version = $lp_addon_version;
600 - $addon->plugin_base = $lp_addon;
601 - $addon->require_version = $lp_addon_info['Require_LP_Version'];
602 - $addon_valid = $addon->check_require_version_addon();
603 -
604 - if ( $addons_valid ) {
605 - $addon_valid = $addon->check_require_version_lp();
606 - }
607 -
608 - if ( ! $addon_valid ) {
609 - $addons_valid = false;
610 - }
611 - }
612 - // End check addons valid.
613 -
614 - if ( ! $addons_valid ) {
615 - return;
616 - }
617 -
618 - // let third parties know that we're ready .
619 - do_action( 'learn-press/ready' );
952 + load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
620 953 }
621 954
622 955 /**
623 - * Remove hook deactivate addon assignments v3.
624 - */
625 - public function lp_assignment_install() {
626 - remove_action( 'deactivate_learnpress-assignments/learnpress-assignments.php', 'lp_assignment_remove' );
627 - }
628 -
629 - /**
630 956 * Get instance of class LP_Template.
631 957 *
632 958 * @param string $type
633 959 *
@@ -643,29 +969,8 @@
643 969 return $templates[ $type ] ?? $this->template;
644 970 }
645 971
646 972 /**
647 - * Init LearnPress when WP initialises
648 - */
649 - public function init() {
650 - $this->api = new LP_Core_API();
651 - $this->admin_api = new LP_Admin_Core_API();
652 -
653 - $this->get_session();
654 -
655 - $this->settings = $this->settings();
656 -
657 - if ( $this->is_request( 'frontend' ) ) {
658 - $this->get_cart();
659 - }
660 -
661 - // Email hook notify
662 - include_once 'inc/emails/class-lp-email-hooks.php';
663 - // Init emails
664 - LP_Emails::instance();
665 - }
666 -
667 - /**
668 973 * Get session object instance.
669 974 *
670 975 * @return mixed
671 976 */
@@ -690,9 +995,9 @@
690 995 * Get cart object instance for online learning market.
691 996 *
692 997 * @return LP_Cart
693 998 */
694 - public function get_cart() : LP_Cart {
999 + public function get_cart(): LP_Cart {
695 1000 if ( ! $this->cart ) {
696 1001 $this->cart = LP_Cart::instance();
697 1002 }
698 1003
@@ -699,30 +1004,8 @@
699 1004 return $this->cart;
700 1005 }
701 1006
702 1007 /**
703 - * Check type of request.
704 - *
705 - * @param string $type ajax, frontend or admin.
706 - *
707 - * @return bool
708 - */
709 - public function is_request( $type ) {
710 - switch ( $type ) {
711 - case 'admin':
712 - return is_admin();
713 - case 'ajax':
714 - return defined( 'LP_DOING_AJAX' );
715 - case 'cron':
716 - return defined( 'DOING_CRON' );
717 - case 'frontend':
718 - return ( ! is_admin() || defined( 'LP_DOING_AJAX' ) ) && ! defined( 'DOING_CRON' );
719 - default:
720 - return strtolower( $_SERVER['REQUEST_METHOD'] ) == $type;
721 - }
722 - }
723 -
724 - /**
725 1008 * Get the plugin url.
726 1009 *
727 1010 * @param string $sub_dir
728 1011 *
@@ -816,27 +1099,8 @@
816 1099 }
817 1100
818 1101 return self::$_instance;
819 1102 }
820 -
821 - /**
822 - * Copy class-lp-mu-plugin.php to mu_plugins folder
823 - *
824 - * @return void
825 - */
826 - public function mu_plugin() {
827 - try {
828 - // Remove file mu plugin create on version 4.1.7.
829 - $name = 'class-lp-mu-plugin.php';
830 - $mu_plugins_path = WPMU_PLUGIN_DIR;
831 - $mu_plugin_file_path = $mu_plugins_path . '/' . $name;
832 - if ( file_exists( $mu_plugin_file_path ) ) {
833 - LP_WP_Filesystem::instance()->lp_filesystem->delete( $mu_plugin_file_path );
834 - }
835 - } catch ( Throwable $e ) {
836 - error_log( $e->getMessage() );
837 - }
838 - }
839 1103 }
840 1104 }
841 1105
842 1106 /**
@@ -854,4 +1118,8 @@
854 1118 * Done! entry point of the plugin
855 1119 * Create new instance of LearnPress and put it to global
856 1120 */
857 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';