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