PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9.1
4.4.9.1 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 All 141 releases
← All changes | learnpress.php +682 -444 4.1.7.1 → 4.4.9.1 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.1
7 + * Version: 4.4.9.1
8 8 * Author URI: http://thimpress.com
9 - * Requires at least: 5.6
10 - * Tested up to: 6.0
11 - * Requires PHP: 7.0
9 + * Requires at least: 6.0
10 + * Requires PHP: 7.4
12 11 * Text Domain: learnpress
13 12 * Domain Path: /languages/
14 13 *
15 14 * @package LearnPress
@@ -14,18 +13,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,191 +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/course/class-lp-course-utils.php';
352 - require_once 'inc/quiz/lp-quiz-functions.php';
353 - require_once 'inc/quiz/class-lp-quiz.php';
354 - require_once 'inc/lesson/lp-lesson-functions.php';
355 - require_once 'inc/order/lp-order-functions.php';
356 - require_once 'inc/order/class-lp-order.php';
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';
357 529
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';
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';
368 540
369 - 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';
370 550
371 551 // 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';
552 + include_once 'inc/lp-template-functions.php';
553 + include_once 'inc/templates/abstract-template.php';
554 + //include_once 'inc/class-lp-template.php';
375 555
376 556 // Cart
377 - require_once 'inc/cart/class-lp-cart.php';
378 - 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';
379 559
380 560 // Block Templates
381 - require_once 'inc/block-template/class-block-until.php';
382 - 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();
383 564
384 565 // 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';
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';
389 570
390 571 /** Jwt */
391 572 include_once 'inc/jwt/class-jwt-auth.php';
392 573
393 - require_once 'inc/class-lp-widget.php';
394 - 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';
395 577
396 - // For plugin Elementor
397 - if ( defined( 'ELEMENTOR_VERSION' ) ) {
398 - require_once 'inc/external-plugin/elementor/class-lp-elementor.php';
399 - }
400 -
401 578 // TODO: update frontend editor before move to function include_files_admin.
402 - 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';
403 580
404 - require_once 'inc/class-lp-page-controller.php';
581 + include_once 'inc/class-lp-page-controller.php';
582 + LP_Page_Controller::instance();
405 583
406 - require_once 'inc/gateways/class-lp-gateway-abstract.php';
407 - 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';
408 587 }
409 588
410 589 /**
411 590 * Include file run on backend
@@ -414,20 +593,18 @@
414 593 if ( ! is_admin() ) {
415 594 return;
416 595 }
417 596
418 - require_once 'inc/admin/class-lp-admin-notice.php';
597 + include_once 'inc/admin/class-lp-admin-ajax.php';
419 598
420 599 // File handle install LP
421 - require_once 'inc/class-lp-install.php';
600 + include_once 'inc/class-lp-install.php';
422 601
423 602 // Meta box helper
424 - 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';
425 604
426 - require_once 'inc/admin/class-lp-admin.php';
427 - // require_once 'inc/admin/settings/abstract-settings-page.php';
428 -
429 - require_once 'inc/admin/class-lp-admin-ajax.php';
605 + // include_once 'inc/admin/class-lp-admin.php';
606 + // include_once 'inc/admin/settings/abstract-settings-page.php';
430 607 }
431 608
432 609 /**
433 610 * Include file run on frontend
@@ -436,80 +613,314 @@
436 613 if ( is_admin() ) {
437 614 return;
438 615 }
439 616
440 - require_once 'inc/class-lp-assets.php';
617 + include_once 'inc/class-lp-assets.php';
441 618
442 - 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';
443 620
444 - 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';
445 624 }
446 625
447 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 + /**
448 764 * Initial common hooks
449 765 */
450 - public function init_hooks() {
451 - if ( 0 !== strcmp( LP_PLUGIN_BASENAME, 'learnpress/learnpress.php' ) ) {
452 - add_action( 'admin_notices', array( $this, 'error' ) );
453 - }
766 + public function hooks() {
767 + add_action( 'init', array( $this, 'maybe_init_mcp_abilities' ), 20 );
454 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 +
455 800 // Add links setting|document|addon on plugins page.
456 801 add_filter( 'plugin_action_links_' . LP_PLUGIN_BASENAME, array( $this, 'plugin_links' ) );
457 802
458 - register_activation_hook( LP_PLUGIN_FILE, array( $this, 'on_activate' ) );
459 - register_deactivation_hook( LP_PLUGIN_FILE, array( $this, 'on_deactivate' ) );
460 - // 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 + );*/
461 813
462 - if ( ! LP_Install::instance()->tables_install_done() ) {
463 - 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' ) );
464 817 }
465 818
466 - add_action( 'wp_loaded', array( $this, 'wp_loaded' ), 20 );
467 - //add_action( 'after_setup_theme', array( $this, 'setup_theme' ) );
468 - add_action( 'plugins_loaded', array( $this, 'plugin_loaded' ), - 10 );
819 + // Check and 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(
824 + $plugin_upgrader->result
825 + || ! isset( $_POST['lp-load-ajax'] )
826 + ) ) {
827 + try {
828 + $res = $plugin_upgrader->result;
829 + $path_source = $res['destination'] ?? '';
830 + if ( empty( $path_source ) ) {
831 + return;
832 + }
469 833
470 - // Check require version thim-core.
471 - add_action( 'before_thim_core_init', array( $this, 'check_thim_core_version_require' ) );
834 + $key_purchase_path = realpath( $path_source . '/purchase-code.txt' );
835 + if ( file_exists( $key_purchase_path ) ) {
836 + $purchase_code_content = file_get_contents( $key_purchase_path );
837 + if ( empty( $purchase_code_content ) ) {
838 + return;
839 + }
840 +
841 + $addon_slug = $res['destination_name'] ?? '';
842 + if ( empty( $addon_slug ) ) {
843 + return;
844 + }
845 +
846 + // Call active purchase code for site.
847 + AddonService::instance()->active_site( $addon_slug, $purchase_code_content );
848 + }
849 + } catch ( Throwable $e ) {
850 + LP_Debug::error_log( $e );
851 + }
852 + }
853 + }
854 + );
855 +
856 + // Clear cache UserModel when save user.
857 + add_action(
858 + 'wp_update_user',
859 + function ( $user_id ) {
860 + $user = UserModel::find( $user_id, true );
861 + $user->clean_caches();
862 + }
863 + );
864 +
865 + // For temporary fix issue security of wp comments. Is it error of WP, not LP, LP only call to comments_template function.
866 + add_filter(
867 + 'comments_array',
868 + function ( $comments_flat, $post_id ) {
869 + // Check if post type is course or item's course (lesson, quiz...)
870 + $post_type = get_post_type( $post_id );
871 + $course_item_types = CourseModel::item_types_support();
872 + $course_item_types[] = LP_COURSE_CPT;
873 + if ( ! in_array( $post_type, $course_item_types ) ) {
874 + return $comments_flat;
875 + }
876 +
877 + foreach ( $comments_flat as $key => $comment ) {
878 + $comment->comment_content = wp_kses_post( $comment->comment_content );
879 + $comments_flat[ $key ] = $comment;
880 + }
881 +
882 + return $comments_flat;
883 + },
884 + 10,
885 + 2
886 + );
472 887 }
473 888
474 889 /**
475 890 * Add links to Documentation and Extensions in plugin's list of action links
476 891 *
477 - * @since 4.3.11
478 - *
479 892 * @param array $links Array of action links
480 893 *
481 894 * @return array
895 + * @since 4.3.11
896 + * @version 1.0.1
482 897 */
483 898 public function plugin_links( array $links ): array {
484 - $links[] = sprintf( '<a href="%s">%s</a>', admin_url( 'admin.php?page=learn-press-settings' ), __( 'Settings', 'learnpress' ) );
485 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', 'https://docspress.thimpress.com/learnpress-4-0/', __( 'Documentation', 'learnpress' ) );
486 - $links[] = sprintf( '<a href="%s" target="_blank">%s</a>', get_admin_url() . '/admin.php?page=learn-press-addons', __( 'Add-ons', 'learnpress' ) );
899 + $links[] = sprintf(
900 + '<a href="%s">%s</a>',
901 + esc_url_raw( admin_url( 'admin.php?page=learn-press-settings' ) ),
902 + esc_html__( 'Settings', 'learnpress' )
903 + );
904 + $links[] = sprintf(
905 + '<a href="%s" target="_blank">%s</a>',
906 + esc_url_raw( LearnPress::$doc_link ),
907 + esc_html__( 'Documentation', 'learnpress' )
908 + );
909 + $links[] = sprintf(
910 + '<a href="%s" target="_blank">%s</a>',
911 + esc_url_raw( admin_url( 'admin.php?page=learn-press-addons' ) ),
912 + esc_html__( 'Add-ons', 'learnpress' )
913 + );
487 914
488 915 return $links;
489 916 }
490 917
491 - public function error() {
492 - ?>
493 - <div class="error">
494 - <p>
495 - <?php
496 - printf(
497 - __(
498 - 'LearnPress plugin base directory must be <strong>learnpress/learnpres.php</strong> (case sensitive) to ensure all functions work properly and fully operational (currently <strong>%s</strong>)',
499 - 'learnpress'
500 - ),
501 - LP_PLUGIN_BASENAME
502 - );
503 - ?>
504 - </p>
505 - </div>
506 - <?php
507 - }
508 -
509 918 /**
510 - * Trigger this function while activating Learnpress.
919 + * Activation hook callback.
511 920 *
921 + * Including creating database tables, default pages, registering CPTs and flushing rewrite rules.
922 + *
512 923 * @since 3.0.0
513 924 * @version 4.1.4.1
514 925 */
515 926 public function on_activate() {
@@ -527,123 +938,43 @@
527 938 do_action( 'learn-press/deactivate', $this );
528 939 }
529 940
530 941 /**
531 - * Trigger WP loaded actions.
942 + * Conditionally bootstrap MCP abilities.
532 943 *
533 - * @since 3.0.0
944 + * @return void
534 945 */
535 - public function wp_loaded() {
536 - if ( $this->is_request( 'frontend' ) ) {
537 - $this->gateways = LP_Gateways::instance()->get_available_payment_gateways();
946 + public function maybe_init_mcp_abilities() {
947 + if ( LP_Settings::get_option( 'enable_mcp_integration', 'no' ) !== 'yes' ) {
948 + return;
538 949 }
539 - }
540 950
541 - /**
542 - * Setup courses thumbnail.
543 - *
544 - * @since 3.0.0
545 - */
546 - public function setup_theme() {
547 - if ( ! current_theme_supports( 'post-thumbnails' ) ) {
548 - add_theme_support( 'post-thumbnails' );
549 - }
550 - add_post_type_support( LP_COURSE_CPT, 'thumbnail' );
551 -
552 - $size = LP_Settings::get_option(
553 - 'course_thumbnail_dimensions',
554 - array(
555 - 500,
556 - 300,
557 - )
558 - );
559 -
560 - $size = array_values( (array) $size );
561 -
562 - add_image_size( 'course_thumbnail', $size[0], $size[1], true );
951 + ApiKeyAuthenticator::init();
952 + Abilities::init();
563 953 }
564 954
565 955 /**
566 - * Trigger Learnpress loaded actions.
956 + * Handle load text domain for LearnPress.
567 957 *
568 - * @since 3.0.0
569 - * @version 1.0.2
570 - * @editor tungnx
958 + * @since 4.2.7.4
959 + * @version 1.0.1
571 960 */
572 - public function plugin_loaded() {
573 - do_action( 'learnpress/hook/before-addons-call-hook-learnpress-ready' );
961 + public function load_plugin_text_domain() {
962 + /*$locale = determine_locale();
963 + $locale = apply_filters( 'plugin_locale', $locale, 'learnpress' );
574 964
575 - // Polylang
576 - if ( defined( 'POLYLANG_VERSION' ) ) {
577 - require_once 'inc/external-plugin/polylang/class-lp-polylang.php';
578 - LP_Polylang::instance();
579 - }
965 + $plugin_translation_path = WP_LANG_DIR . '/plugins/learnpress-' . $locale . '.mo';
966 + $custom_translation_path = WP_LANG_DIR . '/learnpress/learnpress-' . $locale . '.mo';
967 + if ( is_readable( $custom_translation_path ) ) {
968 + unload_textdomain( LP_TEXT_DOMAIN );
969 + load_textdomain( LP_TEXT_DOMAIN, $custom_translation_path );
970 + load_textdomain( LP_TEXT_DOMAIN, $plugin_translation_path );
971 + }*/
580 972
581 - $this->init();
582 -
583 - require_once 'inc/lp-template-hooks.php';
584 -
585 - /**
586 - * Check version addons valid version require.
587 - * If not valid will be to deactivate.
588 - * Reload page, so not affect to hook "learn-press/ready"
589 - */
590 - $addons_valid = true;
591 - $plugins = get_option( 'active_plugins' );
592 -
593 - $list_lp_addon_activated = preg_grep( '/^learnpress-.*/i', $plugins );
594 -
595 - // Remove hook deactivate addon assignments v3.
596 - add_action(
597 - 'deactivate_learnpress-assignments/learnpress-assignments.php',
598 - array( $this, 'lp_assignment_install' ),
599 - - 10
600 - );
601 -
602 - foreach ( $list_lp_addon_activated as $lp_addon ) {
603 - $lp_addon_info = get_file_data(
604 - WP_PLUGIN_DIR . '/' . $lp_addon,
605 - array(
606 - 'Require_LP_Version' => 'Require_LP_Version',
607 - 'Version' => 'Version',
608 - )
609 - );
610 -
611 - // $lp_addon_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $lp_addon );
612 - $lp_addon_version = $lp_addon_info['Version'];
613 -
614 - $addon = new Lp_Addon();
615 - $addon->version = $lp_addon_version;
616 - $addon->plugin_base = $lp_addon;
617 - $addon->require_version = $lp_addon_info['Require_LP_Version'];
618 - $addon_valid = $addon->check_require_version_addon();
619 -
620 - if ( $addons_valid ) {
621 - $addon_valid = $addon->check_require_version_lp();
622 - }
623 -
624 - if ( ! $addon_valid ) {
625 - $addons_valid = false;
626 - }
627 - }
628 - // End check addons valid.
629 -
630 - if ( ! $addons_valid ) {
631 - return;
632 - }
633 -
634 - // let third parties know that we're ready .
635 - do_action( 'learn-press/ready' );
973 + load_plugin_textdomain( LP_TEXT_DOMAIN, false, LP_PLUGIN_FOLDER_NAME . '/languages' );
636 974 }
637 975
638 976 /**
639 - * Remove hook deactivate addon assignments v3.
640 - */
641 - public function lp_assignment_install() {
642 - remove_action( 'deactivate_learnpress-assignments/learnpress-assignments.php', 'lp_assignment_remove' );
643 - }
644 -
645 - /**
646 977 * Get instance of class LP_Template.
647 978 *
648 979 * @param string $type
649 980 *
@@ -652,37 +983,15 @@
652 983 * @throws Exception
653 984 * @since 3.3.0
654 985 */
655 986 public function template( $type = '' ) {
656 - if ( ! $this->template ) {
657 - $this->template = LP_Template::instance();
658 - }
987 + $this->template = LP_Template::instance();
988 + $templates = (array) $this->template->get_templates();
659 989
660 - return isset( $this->template[ $type ] ) ? $this->template[ $type ] : $this->template;
990 + return $templates[ $type ] ?? $this->template;
661 991 }
662 992
663 993 /**
664 - * Init LearnPress when WP initialises
665 - */
666 - public function init() {
667 - $this->api = new LP_Core_API();
668 - $this->admin_api = new LP_Admin_Core_API();
669 -
670 - $this->get_session();
671 -
672 - $this->settings = $this->settings();
673 -
674 - if ( $this->is_request( 'frontend' ) ) {
675 - $this->get_cart();
676 - }
677 -
678 - // Email hook notify
679 - include_once 'inc/emails/class-lp-email-hooks.php';
680 - // Init emails
681 - LP_Emails::instance();
682 - }
683 -
684 - /**
685 994 * Get session object instance.
686 995 *
687 996 * @return mixed
688 997 */
@@ -707,9 +1016,9 @@
707 1016 * Get cart object instance for online learning market.
708 1017 *
709 1018 * @return LP_Cart
710 1019 */
711 - public function get_cart() : LP_Cart {
1020 + public function get_cart(): LP_Cart {
712 1021 if ( ! $this->cart ) {
713 1022 $this->cart = LP_Cart::instance();
714 1023 }
715 1024
@@ -716,30 +1025,8 @@
716 1025 return $this->cart;
717 1026 }
718 1027
719 1028 /**
720 - * Check type of request.
721 - *
722 - * @param string $type ajax, frontend or admin.
723 - *
724 - * @return bool
725 - */
726 - public function is_request( $type ) {
727 - switch ( $type ) {
728 - case 'admin':
729 - return is_admin();
730 - case 'ajax':
731 - return defined( 'LP_DOING_AJAX' );
732 - case 'cron':
733 - return defined( 'DOING_CRON' );
734 - case 'frontend':
735 - return ( ! is_admin() || defined( 'LP_DOING_AJAX' ) ) && ! defined( 'DOING_CRON' );
736 - default:
737 - return strtolower( $_SERVER['REQUEST_METHOD'] ) == $type;
738 - }
739 - }
740 -
741 - /**
742 1029 * Get the plugin url.
743 1030 *
744 1031 * @param string $sub_dir
745 1032 *
@@ -833,61 +1120,8 @@
833 1120 }
834 1121
835 1122 return self::$_instance;
836 1123 }
837 -
838 - public function admin_notice_require_addon_version() {
839 - ?>
840 - <div class="notice notice-error">
841 - <p><?php echo( '<strong>LearnPress version ' . LEARNPRESS_VERSION . ' require Addon</strong> version 4.0.0 or higher' ); ?></p>
842 - </div>
843 - <?php
844 - }
845 -
846 - /**
847 - * Copy class-lp-mu-plugin.php to mu_plugins folder
848 - *
849 - * @return void
850 - */
851 - public function mu_plugin() {
852 - try {
853 - $name = 'class-lp-mu-plugin.php';
854 - $can_copy = false;
855 -
856 - // replace the old file
857 - $mu_plugin_file = LP_PLUGIN_PATH . '/mu-plugin/' . $name;
858 -
859 - if ( defined( 'WPMU_PLUGIN_DIR' ) ) {
860 - $mu_plugins_path = WPMU_PLUGIN_DIR;
861 - } else {
862 - $mu_plugins_path = WP_CONTENT_DIR . '/' . 'mu-plugins';
863 - }
864 -
865 - if ( ! file_exists( $mu_plugins_path ) ) {
866 - mkdir( $mu_plugins_path, 0755, true );
867 - }
868 -
869 - $mu_plugin_file_path = $mu_plugins_path . '/' . $name;
870 -
871 - // add mu file
872 - if ( file_exists( $mu_plugins_path ) ) {
873 - if ( file_exists( $mu_plugin_file_path ) ) {
874 - if ( LP_MU_Plugin::$version < $this->mu_file_version ) {
875 - $can_copy = true;
876 - }
877 - } else {
878 - $can_copy = true;
879 - }
880 - }
881 -
882 - if ( $can_copy ) {
883 - //update_option( 'learnpress_mu_plugin_version', $this->mu_file_version );
884 - LP_WP_Filesystem::instance()->copy( $mu_plugin_file, $mu_plugin_file_path );
885 - }
886 - } catch ( Throwable $e ) {
887 - error_log( $e->getMessage() );
888 - }
889 - }
890 1124 }
891 1125 }
892 1126
893 1127 /**
@@ -904,5 +1138,9 @@
904 1138 /**
905 1139 * Done! entry point of the plugin
906 1140 * Create new instance of LearnPress and put it to global
907 1141 */
908 -$GLOBALS['LearnPress'] = LP();
1142 +$GLOBALS['LearnPress'] = LearnPress::instance();
1143 +
1144 +// Load template hooks here, before theme add hooks remove.
1145 +// Load here because this file call LearnPress::instance(), loop call.
1146 +require_once 'inc/lp-template-hooks.php';