includes/class-llms-loader.php
<?php
/**
* LifterLMS file loader
*
* @package LifterLMS/Classes
*
* @since 4.0.0
* @version 7.2.0
*/
defined( 'ABSPATH' ) || exit;
/**
* LLMS_Loader.
*
* @since 4.0.0
* @since 5.3.0 Add traits to `autoload()`.
*/
class LLMS_Loader {
/**
* These classes do not conform to any of the LifterLMS class name or file name standards.
*
* @todo Rename these classes and/or add a namespace to them.
*
* @since 6.0.0
*
* @var string[] [ $lowercase_class_name => $path_relative_to_LLMS_PLUGIN_DIR ]
*/
private $non_standard_classes = array(
// Missing "_Abstract_" from class name.
'llms_admin_metabox' => 'includes/abstracts/abstract.llms.admin.metabox.php',
'llms_admin_table' => 'includes/abstracts/abstract.llms.admin.table.php',
'llms_analytics_widget' => 'includes/abstracts/abstract.llms.analytics.widget.php',
'llms_database_query' => 'includes/abstracts/abstract.llms.database.query.php',
'llms_payment_gateway' => 'includes/abstracts/abstract.llms.payment.gateway.php',
'llms_post_model' => 'includes/abstracts/abstract.llms.post.model.php',
'llms_shortcode_course_element' => 'includes/abstracts/abstract.llms.shortcode.course.element.php',
'llms_shortcode' => 'includes/abstracts/abstract.llms.shortcode.php',
'llms_update' => 'includes/abstracts/abstract.llms.update.php',
// Missing "_Admin_" from class name.
'llms_export_api' => 'includes/admin/class-llms-export-api.php',
// Meta box fields.
'llms_metabox_field' => 'includes/admin/post-types/meta-boxes/fields/llms.class.meta.box.fields.php',
'llms_metabox_textarea_w_tags_field' => 'includes/admin/post-types/meta-boxes/fields/llms.class.meta.box.textarea.tags.php',
'meta_box_field_interface' => 'includes/admin/post-types/meta-boxes/fields/llms.interface.meta.box.field.php',
// Missing "Model" from class name.
'llms_access_plan' => 'includes/models/model.llms.access.plan.php',
'llms_add_on' => 'includes/models/model.llms.add-on.php',
'llms_coupon' => 'includes/models/model.llms.coupon.php',
'llms_course' => 'includes/models/model.llms.course.php',
'llms_event' => 'includes/models/class-llms-event.php',
'llms_instructor' => 'includes/models/model.llms.instructor.php',
'llms_lesson' => 'includes/models/model.llms.lesson.php',
'llms_membership' => 'includes/models/model.llms.membership.php',
'llms_notification' => 'includes/models/model.llms.notification.php',
'llms_order' => 'includes/models/model.llms.order.php',
'llms_post_instructors' => 'includes/models/model.llms.post.instructors.php',
'llms_product' => 'includes/models/model.llms.product.php',
'llms_question_choice' => 'includes/models/model.llms.question.choice.php',
'llms_question' => 'includes/models/model.llms.question.php',
'llms_quiz_attempt' => 'includes/models/model.llms.quiz.attempt.php',
'llms_quiz_attempt_question' => 'includes/models/model.llms.quiz.attempt.question.php',
'llms_quiz' => 'includes/models/model.llms.quiz.php',
'llms_section' => 'includes/models/model.llms.section.php',
'llms_student' => 'includes/models/model.llms.student.php',
'llms_student_quizzes' => 'includes/models/model.llms.student.quizzes.php',
'llms_transaction' => 'includes/models/model.llms.transaction.php',
'llms_user_achievement' => 'includes/models/model.llms.user.achievement.php',
'llms_user_certificate' => 'includes/models/model.llms.user.certificate.php',
'llms_user_postmeta' => 'includes/models/model.llms.user.postmeta.php',
// Miscellaneous.
'llms_admin_reporting' => 'includes/admin/reporting/class.llms.admin.reporting.php',
'llms_admin_system_report' => 'includes/admin/class.llms.admin.system-report.php',
'llms_bbp_widget_course_forums_list' => 'includes/widgets/class.llms.bbp.widget.course.forums.list.php',
'llms_db_upgrader' => 'includes/class-llms-db-ugrader.php',
'llms_emails' => 'includes/class.llms.emails.php',
'llms_payment_gateway_manual' => 'includes/class.llms.gateway.manual.php',
'llms_settings_page' => 'includes/admin/settings/class.llms.settings.page.php',
'llms_table_notificationsettings' => 'includes/admin/settings/tables/class.llms.table.notification.settings.php',
'llms_table_student_certificates' => 'includes/admin/reporting/tables/llms.table.certificates.php',
'llms_table_studentmanagement' => 'includes/admin/post-types/tables/class.llms.table.student.management.php',
// Deprecated classes.
'llms_achievement_user' => 'includes/achievements/class.llms.achievement.user.php',
'llms_certificate_user' => 'includes/certificates/class.llms.certificate.user.php',
);
/**
* An array of paths and what the class name starts with.
*
* @since 6.0.0
*
* @var string[] [ $path_relative_to_LLMS_PLUGIN_DIR => $class_name_starts_with ]
*/
private $class_paths = array(
'includes/admin/tools/' => 'llms_admin_tool_',
'includes/admin/' => 'llms_admin_',
'includes/controllers/' => 'llms_controller_',
'includes/emails/' => 'llms_email',
'includes/forms/' => 'llms_form',
'includes/integrations/' => 'llms_integration_',
'includes/admin/post-types/meta-boxes/' => 'llms_meta_box_',
'includes/notifications/views/' => 'llms_notification_view_',
'includes/notifications/' => 'llms_notification',
'includes/privacy/' => 'llms_privacy',
'includes/processors/' => 'llms_processor',
'includes/shortcodes/' => 'llms_shortcode',
'includes/widgets/' => 'llms_widget',
'includes/' => 'llms_',
);
/**
* Constructor
*
* @since 4.0.0
*
* @return void
*/
public function __construct() {
spl_autoload_register( array( $this, 'autoload' ) );
$this->includes_libraries();
$this->includes();
if ( is_admin() ) {
$this->includes_admin();
} else {
$this->includes_frontend();
}
}
/**
* Auto-load LLMS classes.
*
* @todo Add a {@link https://www.php.net/manual/en/language.namespaces.php namespace} to every file to simplify autoloading.
*
* @since 1.0.0
* @since 3.15.0 Unknown.
* @since 4.0.0 Moved from `LifterLMS` class.
* @since 5.3.0 Add traits.
* @since 6.0.0 Increased the number of files that are autoloaded instead of manually loaded on every request.
* Return early if not a LifterLMS core class.
*
* @param string $class Class name being called.
* @return void
*/
public function autoload( $class ) {
$class = strtolower( $class );
if ( 0 !== strpos( $class, 'llms_' ) && 'lifterlms' !== $class && 'meta_box_field_interface' !== $class ) {
return;
}
$path = null;
$fileize = str_replace( '_', '-', $class );
$file = 'class-' . $fileize . '.php';
if ( array_key_exists( $class, $this->non_standard_classes ) ) {
$path = LLMS_PLUGIN_DIR . $this->non_standard_classes[ $class ];
$file = null;
} elseif ( 0 === strpos( $class, 'llms_abstract_' ) ) {
$path = LLMS_PLUGIN_DIR . 'includes/abstracts/';
$file = $fileize . '.php';
} elseif (
0 === strpos( $class, 'llms_analytics_' ) && false !== strrpos( $class, '_widget', - 7 )
) {
$path = LLMS_PLUGIN_DIR . 'includes/admin/reporting/widgets/';
$file = 'class.llms.analytics.widget.' . substr( $class, 15, - 7 ) . '.php';
} elseif ( 0 === strpos( $class, 'llms_interface_' ) ) {
$path = LLMS_PLUGIN_DIR . 'includes/interfaces/';
$file = $fileize . '.php';
} elseif (
0 === strpos( $class, 'llms_metabox_' ) && false !== strrpos( $class, '_field', - 6 )
) {
$path = LLMS_PLUGIN_DIR . 'includes/admin/post-types/meta-boxes/fields/';
$file = 'llms-class-meta-box-' . substr( $fileize, 13, - 6 ) . '.php';
} elseif ( 0 === strpos( $class, 'llms_table_' ) ) {
/** @todo Prefix file names with 'class-' */
$path = LLMS_PLUGIN_DIR . 'includes/admin/reporting/tables/';
$file = $fileize . '.php';
} elseif ( 0 === strpos( $class, 'llms_trait_' ) ) {
$path = LLMS_PLUGIN_DIR . 'includes/traits/';
$file = $fileize . '.php';
}
if ( is_null( $path ) ) {
foreach ( $this->class_paths as $class_path => $class_name_starts_with ) {
if ( 0 === strpos( $class, $class_name_starts_with ) ) {
$path = LLMS_PLUGIN_DIR . $class_path;
break;
}
}
}
if ( $path ) {
if ( is_readable( $path . $file ) ) {
require_once $path . $file;
return;
}
$file = str_replace( '-', '.', $file );
if ( is_readable( $path . $file ) ) {
require_once $path . $file;
return;
}
}
}
/**
* Includes that are included everywhere.
*
* @since 4.0.0
* @since 4.4.0 Include `LLMS_Assets` class.
* @since 4.12.0 Class `LLMS_Staging` always loaded instead of only loaded on admin panel.
* @since 4.13.0 Include `LLMS_DOM_Document` class.
* @since 5.0.0 Include `LLMS_Forms`, `LLMS_Form_Post_Type`, `LLMS_Form_Templates`, and `LLMS_Form_Handler`.
* @since 5.2.0 Include `LLMS_DB_Upgrader`.
* @since 5.6.0 Include `LLMS_Prevent_Concurrent_Logins`.
* @since 6.0.0 Included `LLMS_Block_Library`, `LLMS_Controller_Awards`, and `LLMS_Engagement_Handler`.
* Removed loading of class files that don't instantiate their class in favor of autoloading.
* @since 6.4.0 Included `LLMS_Shortcodes` before `LLMS_Controller_Orders`.
* @since 7.0.0 Include `LLMS_Controller_Checkout`.
* @since 7.2.0 Include `LLMS_Shortcodes_Blocks`.
*
* @return void
*/
public function includes() {
// Instantiate LLMS_Shortcodes before LLMS_Controller_Orders.
require_once LLMS_PLUGIN_DIR . 'includes/shortcodes/class.llms.shortcodes.php';
require_once LLMS_PLUGIN_DIR . 'includes/shortcodes/class.llms.shortcodes.blocks.php';
// Functions.
require_once LLMS_PLUGIN_DIR . 'includes/llms.functions.core.php';
// Classes.
require_once LLMS_PLUGIN_DIR . 'includes/class-llms-block-library.php';
require_once LLMS_PLUGIN_DIR . 'includes/class-llms-events-core.php';
require_once LLMS_PLUGIN_DIR . 'includes/class-llms-rest-fields.php';
require_once LLMS_PLUGIN_DIR . 'includes/class-llms-sessions.php';
require_once LLMS_PLUGIN_DIR . 'includes/class-llms-staging.php';
require_once LLMS_PLUGIN_DIR . 'includes/class-llms-prevent-concurrent-logins.php';
// Forms.
require_once LLMS_PLUGIN_DIR . 'includes/forms/class-llms-forms.php';
require_once LLMS_PLUGIN_DIR . 'includes/forms/class-llms-forms-admin-bar.php';
require_once LLMS_PLUGIN_DIR . 'includes/forms/class-llms-forms-classic-editor.php';
require_once LLMS_PLUGIN_DIR . 'includes/forms/class-llms-forms-data.php';
require_once LLMS_PLUGIN_DIR . 'includes/forms/class-llms-forms-dynamic-fields.php';
// Classes (files to be renamed).
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.assets.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.ajax.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.ajax.handler.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.cache.helper.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.comments.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.date.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.install.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.l10n.js.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.nav.menus.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.oembed.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.playnice.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.post.relationships.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.post-types.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.query.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.question.types.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.review.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.sidebars.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.student.dashboard.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.user.permissions.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.view.manager.php';
// Controllers.
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class.llms.controller.achievements.php';
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class-llms-controller-awards.php';
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class.llms.controller.certificates.php';
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class.llms.controller.lesson.progression.php';
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class-llms-controller-checkout.php'; // Added out of alpha order to preserve action load order.
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class.llms.controller.orders.php';
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class.llms.controller.quizzes.php';
// Form controllers.
require_once LLMS_PLUGIN_DIR . 'includes/forms/controllers/class.llms.controller.account.php';
require_once LLMS_PLUGIN_DIR . 'includes/forms/controllers/class.llms.controller.login.php';
require_once LLMS_PLUGIN_DIR . 'includes/forms/controllers/class.llms.controller.registration.php';
// Hooks.
require_once LLMS_PLUGIN_DIR . 'includes/llms.template.hooks.php';
// Privacy components.
require_once LLMS_PLUGIN_DIR . 'includes/privacy/class-llms-privacy.php';
// Theme support.
require_once LLMS_PLUGIN_DIR . 'includes/theme-support/class-llms-theme-support.php';
// Widgets.
require_once LLMS_PLUGIN_DIR . 'includes/widgets/class.llms.widget.php';
require_once LLMS_PLUGIN_DIR . 'includes/widgets/class.llms.widgets.php';
}
/**
* Includes that are required only on the admin panel
*
* @since 4.0.0
* @since 4.7.0 Always load `LLMS_Admin_Reporting`.
* @since 4.8.0 Add `LLMS_Export_API`.
* @since 4.12.0 Class `LLMS_Staging` always loaded instead of only loaded on admin panel.
* @since 5.0.0 Include `LLMS_Forms_Unsupported_Versions` class.
* @since 5.9.0 Drop usage of deprecated `FILTER_SANITIZE_STRING`.
* @since 6.0.0 Removed loading of class files that don't instantiate their class in favor of autoloading.
* @since 7.2.0 Include `LLMS_Admin_Dashboard_Wigdet` class.
*
* @return void
*/
public function includes_admin() {
// Functions.
require_once LLMS_PLUGIN_DIR . 'includes/admin/llms.functions.admin.php';
// Admin classes.
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-admin-header.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-admin-export-download.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-admin-plugins.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-admin-review.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-admin-users-table.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-mailhawk.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-sendwp.php';
require_once LLMS_PLUGIN_DIR . 'includes/forms/class-llms-forms-unsupported-versions.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-admin-permalinks.php';
// Admin classes (files to be renamed).
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.dashboard.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.dashboard-widget.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.import.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.menus.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.notices.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.notices.core.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.post-types.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.reviews.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.user.custom.fields.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class-llms-admin-profile.php';
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.student.bulk.enroll.php';
// Post types.
require_once LLMS_PLUGIN_DIR . 'includes/admin/post-types/class.llms.post.tables.php';
// Controllers.
require_once LLMS_PLUGIN_DIR . 'includes/controllers/class.llms.controller.admin.quiz.attempts.php';
// Reporting.
require_once LLMS_PLUGIN_DIR . 'includes/admin/reporting/widgets/class.llms.analytics.widget.ajax.php';
// Load setup wizard conditionally.
if ( 'llms-setup' === llms_filter_input( INPUT_GET, 'page' ) ) {
require_once LLMS_PLUGIN_DIR . 'includes/admin/class.llms.admin.setup.wizard.php';
}
}
/**
* Include libraries
*
* @since 4.0.0
* @since 4.9.0 Adds constants which can be used to identify when included libraries have been loaded.
* @since 5.0.0 Load core libraries from new location, add WP Background Processing lib, add LLMS Helper.
* @since 5.1.3 Add keys to the $libs array and pass them through a filter.
* @since 5.5.0 Add LLMS-CLI to the list of included libraries.
*
* @return void
*/
public function includes_libraries() {
$libs = array(
'blocks' => array(
'const' => 'LLMS_BLOCKS_LIB',
'test' => function_exists( 'has_blocks' ) && ! defined( 'LLMS_BLOCKS_VERSION' ),
'file' => LLMS_PLUGIN_DIR . 'libraries/lifterlms-blocks/lifterlms-blocks.php',
),
'cli' => array(
'const' => 'LLMS_CLI_LIB',
'test' => ! function_exists( 'llms_cli' ),
'file' => LLMS_PLUGIN_DIR . 'libraries/lifterlms-cli/lifterlms-cli.php',
),
'rest' => array(
'const' => 'LLMS_REST_API_LIB',
'test' => ! class_exists( 'LifterLMS_REST_API' ),
'file' => LLMS_PLUGIN_DIR . 'libraries/lifterlms-rest/lifterlms-rest.php',
),
'helper' => array(
'const' => 'LLMS_HELPER_LIB',
'test' => ! class_exists( 'LifterLMS_Helper' ),
'file' => LLMS_PLUGIN_DIR . 'libraries/lifterlms-helper/lifterlms-helper.php',
),
);
/**
* Filters the list of LifterLMS libraries to be loaded.
*
* @since 5.1.3
*
* @param array $libs {
* Array of library data. Each array key serves as a unique ID for the library.
*
* @type string $const Name of the constant used to identify if the library is loaded as a library.
* @type bool $test A test which is evaluated to determine if the library should be loaded. Returning `false` causes the library not to load.
* @type string $file Path to the main library file's location in the LifterLMS core plugin.
* }
*/
$libs = apply_filters( 'llms_included_libs', $libs );
foreach ( $libs as $lib ) {
if ( $lib['test'] ) {
define( $lib['const'], true );
require_once $lib['file'];
}
}
// Action Scheduler.
require_once LLMS_PLUGIN_DIR . 'vendor/woocommerce/action-scheduler/action-scheduler.php';
// WP Background Processing.
require_once LLMS_PLUGIN_DIR . 'vendor/deliciousbrains/wp-background-processing/wp-background-processing.php';
}
/**
* Includes that are required only on the frontend
*
* @since 4.0.0
* @since 5.0.0 Removed deprecated classes: LLMS_Frontend_Forms & LLMS_Frontend_Password.
*
* @return void
*/
public function includes_frontend() {
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.frontend.assets.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.https.php';
require_once LLMS_PLUGIN_DIR . 'includes/class.llms.template.loader.php';
}
}
return new LLMS_Loader();