LifterLMS Version 4.0.0-rc.1

Version 4.0.0 Release Candidate

No additional API changes will be made prior to the release of 4.0.0 on the stable channel.

The expected stable release of 4.0.0 is Thursday, June 25, 2020.

Action Scheduler Library

Switches from prospress/action-scheduler to woocommerce/action-scheduler. The repository has been moved but it’s the same library & upgrades to latest version (3.1.6).

While this is a semantically major upgrade of the library there are no backwards incompatible changes to the public API.

There have been several deprecated functions/classes. The LifterLMS core does not directly use any of these deprecated functions but 3rd parties might and should review the changelog of the library to see if they are affected by any deprecations:

  • Function LLMS() is deprecated in favor of llms().
Templates Modified
  • templates/global/form-login.php
  • templates/global/form-registration.php
Miscellaneous Breaking Changes

WP Session Manager Library

Removes the bundled WP Session Manager plugin dependency, all public methods included with this plugin have been removed without direct replacements.

Removed JS dependencies

Removes bundled JS bootstrap 3 dependencies: “collapse” and “transition”

Removed CSS Classes

Removes classnames from student dashboard login and registration form wrapper elements which conflict with bootstrap causing visual issues.

These classes are not used by the LifterLMS core or add-ons and are a legacy class that hasn’t been removed for fear of creating backwards compatibility issues with any custom css, 3rd party themes, etc…

  • templates/global/form-login.php: Removes col-1 class from the div.llms-person-login-form-wrapper element.
  • templates/global/form-registration.php: : Removes col-2 class from the div.llms-new-person-form-wrapper element.
Previously deprecated classes (and files) that have been removed
  • LLMS_Admin_Analytics: includes/admin/
  • LLMS_Analytics: includes/
  • LLMS_Analytics_Courses: includes/admin/analytics/
  • LLMS_Analytics_Memberships: includes/admin/analytics/
  • LLMS_Analytics_Page: includes/admin/analytics/
  • LLMS_Analytics_Sales: includes/admin/analytics/
  • LLMS_Course_Basic: includes/class.llms.course.basic.php
  • LLMS_Course_Handler: includes/class.llms.course.handler.php
  • LLMS_Course_Factory: includes/class.llms.course.factory.php
  • LLMS_Lesson_Basic: includes/class.llms.lesson.basic.php
  • LLMS_Meta_Box_Expiration: includes/admin/post-types/meta-boxes/
  • LLMS_Meta_Box_Video: includes/admin/post-types/meta-boxes/
  • LLMS_Number: includes/class.llms.number.php
  • LLMS_Person: includes/class.llms.person.php
  • LLMS_Quiz_Legacy: includes/class.llms.quiz.legacy.php
  • LLMS_Table_Questions: includes/admin/reporting/tables/llms.table.questions.php
  • LLMS\Users\User: includes/Users/User.php
Previously deprecated class properties that have been removed
  • LifterLMS->person (generally accessed via LLMS()->person).
  • LLMS_Analytics_Widget->date_end
  • LLMS_Analytics_Widget->date_start
  • LLMS_Analytics_Widget->output
  • LLMS_Certificate->enabled
  • LLMS_Course_Data->$course
  • LLMS_Course_Data->$course_id
Previously deprecated class methods that have been removed:
  • LLMS_Admin_Table::queue_export()
  • LLMS_AJAX::get_achievements()
  • LLMS_AJAX::get_all_posts()
  • LLMS_AJAX::get_associated_lessons()
  • LLMS_AJAX::get_certificates()
  • LLMS_AJAX::get_courses()
  • LLMS_AJAX::get_course_tracks()
  • LLMS_AJAX::get_emails()
  • LLMS_AJAX::get_enrolled_students()
  • LLMS_AJAX::get_enrolled_students_ids()
  • LLMS_AJAX::get_lesson()
  • LLMS_AJAX::get_lessons()
  • LLMS_AJAX::get_lessons_alt()
  • LLMS_AJAX::get_memberships()
  • LLMS_AJAX::get_question()
  • LLMS_AJAX::get_sections()
  • LLMS_AJAX::get_sections_alt()
  • LLMS_AJAX::get_students()
  • LLMS_AJAX::update_syllabus()
  • LLMS_Course::get_children_sections()
  • LLMS_Course::get_children_lessons()
  • LLMS_Course::get_author()
  • LLMS_Course::get_author_id()
  • LLMS_Course::get_author_name()
  • LLMS_Course::get_sku()
  • LLMS_Course::get_id()
  • LLMS_Course::get_title()
  • LLMS_Course::get_permalink()
  • LLMS_Course::get_user_postmeta_data()
  • LLMS_Course::get_user_postmetas_by_key()
  • LLMS_Course::get_checkout_url()
  • LLMS_Course::get_start_date()
  • LLMS_Course::get_end_date()
  • LLMS_Course::get_next_uncompleted_lesson()
  • LLMS_Course::get_lesson_ids()
  • LLMS_Course::get_syllabus_sections()
  • LLMS_Course::get_short_description()
  • LLMS_Course::get_syllabus()
  • LLMS_Course::get_user_enroll_date()
  • LLMS_Course::get_user_post_data()
  • LLMS_Course::check_enrollment()
  • LLMS_Course::is_user_enrolled()
  • LLMS_Course::get_student_progress()
  • LLMS_Course::get_membership_link()
  • LLMS_Lesson::get_assigned_quiz()
  • LLMS_Lesson::get_drip_days()
  • LLMS_Lesson::mark_complete()
  • LLMS_PlayNice::divi_fb_wc_product_tabs_after()
  • LLMS_PlayNice::divi_fb_wc_product_tabs_before()
  • LLMS_PlayNice::wc_is_account_page()
  • LLMS_Post_Instructors::get_defaults()
  • LLMS_Query::set_dashboard_pagination()
  • LLMS_Query::add_query_vars()
  • LLMS_Question::get_correct_option()
  • LLMS_Question::get_correct_option_key()
  • LLMS_Question::get_options()
  • LLMS_Quiz::get_assoc_lesson()
  • LLMS_Quiz::get_passing_percent()
  • LLMS_Quiz::get_remaining_attempts_by_user()
  • LLMS_Quiz::get_time_limit()
  • LLMS_Quiz::get_total_allowed_attempts()
  • LLMS_Quiz::get_total_attempts_by_user()
  • LLMS_Quiz_Attempt::get_status()
  • LLMS_Shortcode_My_Account::lost_password()
  • LLMS_Section::count_children_lessons()
  • LLMS_Section::delete()
  • LLMS_Section::get_children_lessons()
  • LLMS_Section::remove_all_child_lessons()
  • LLMS_Section::remove_child_lesson()
  • LLMS_Section::set_order()
  • LLMS_Section::set_title()
  • LLMS_Section::update()
  • LLMS_Session::init()
  • LLMS_Session::maybe_start_session()
  • LLMS_Session::set_expiration_variant_time()
  • LLMS_Session::set_expiration_time()
  • LLMS_Session::use_php_sessions()
  • LLMS_Student::delete_quiz_attempt()
  • LLMS_Student::get_best_quiz_attempt()
  • LLMS_Student::get_quiz_data()
  • LLMS_Student::has_access()
  • LLMS_Student_Dashboard::output_courses_content()
  • LLMS_Student_Dashboard::output_dashboard_content()
  • LLMS_Student_Dashboard::output_notifications_content()
  • LLMS_Widget_Course_Progress::widget_contents()
Previously deprecated functions that have been removed
  • is_filtered()
  • lifterlms_template_loop_view_link()
  • llms_add_user_table_columns()
  • llms_add_user_table_rows()
  • llms_create_new_person()
  • llms_get_question()
  • llms_get_quiz()
  • llms_set_user_password_rest_key()
  • llms_setup_product_data()
  • llms_setup_question_data()
  • llms_verify_password_reset_key()
Previously deprecated hooks that have been removed
  • Action: lifterlms_before_memberships_loop_item_title
  • Action: lifterlms_after_memberships_loop_item_title
  • Action: lifterlms_after_memberships_loop_item_title
  • Filter: lifterlms_completed_transaction_message
  • Filter: lifterlms_is_filtered
  • Filter: lifterlms_get_analytics_pages
  • Filter: lifterlms_analytics_tabs_array
Previously deprecated shortcodes that have been removed
  • [courses]
  • [lifterlms_user_statistics]
Previously deprecated templates that have been removed
  • templates/loop/view-link.php
Previously deprecated global variables that have been removed
  • $product
  • $question

LifterLMS Version 3.41.0

Bug Fixes
  • Fix issues encountered when a user role with the edit_users capability has multiple LifterLMS roles (like Student).
LifterLMS 4.0.0 Release Preparation

LifterLMS 4.0.0, our first major release in several years, is nearing the end of it’s beta testing cycle. Many unused legacy functions, classes, and files are being removed in version 4.0.0 and well as many functions, classes, and files that were previously deprecated.

The following is a list of items that have not been previously deprecated but will be removed from LifterLMS 4.0.0.

For full details on the release, information on beta testing, and more, see our blog post on the release.


The WP Session Manager plugin / library that is bundled into the LifterLMS core code base is deprecated from our code base and is being fully removed in favor of an internal session manager.

The bundled Javascript Boostrap 3 modules, “collapse” and “transition” are deprecated from our codebase and are being removed.

The following CSS classes are deprecated and will be removed:

  • templates/global/form-login.php: The col-1 class from the div.llms-person-login-form-wrapper element will be removed.
  • templates/global/form-registration.php: : The col-2 class from the div.llms-new-person-form-wrapper element will be removed.

The following classes are deprecated:

  • LLMS_Number: includes/class.llms.number.php
  • LLMS_Person: includes/class.llms.person.php
  • LLMS_Table_Questions: includes/admin/reporting/tables/llms.table.questions.php

The following class methods are deprecated:

  • LLMS_PlayNice::divi_fb_wc_product_tabs_after()
  • LLMS_PlayNice::divi_fb_wc_product_tabs_before()
  • LLMS_Question::get_correct_option()
  • LLMS_Question::get_correct_option_key()
  • LLMS_Quiz::get_passing_percent(), use LLMS_Quiz::get( 'passing_percent' ) instead.
  • LLMS_Quiz::get_assoc_lesson(), use LLMS_Quiz::get( 'lesson_id' ) instead.
  • LLMS_Session::init()
  • LLMS_Session::maybe_start_session()
  • LLMS_Session::set_expiration_variant_time()
  • LLMS_Session::set_expiration_time()
  • LLMS_Session::use_php_sessions()

The following class properties are deprecated:

  • LifterLMS->person (generally accessed via LLMS()->person).

The following functions are deprecated:

  • lifterlms_template_loop_view_link()
  • llms_add_user_table_columns()
  • llms_add_user_table_rows()
  • llms_get_question()
  • llms_get_quiz()
  • llms_setup_product_data()
  • llms_setup_question_data()

The following global variables are deprecated:

  • $product
  • $question

The following action hooks are deprecated:

  • lifterlms_before_memberships_loop_item_title
  • lifterlms_after_memberships_loop_item_title
  • lifterlms_after_memberships_loop_item_title

The following template file is deprecated:

  • templates/loop/view-link.php

LifterLMS Version 4.0.0-beta.3

Removed classes
  • LLMS_Table_Questions: includes/admin/reporting/tables/llms.table.questions.php
Removed class methods
  • LLMS_Question::get_correct_option()
  • LLMS_Question::get_correct_option_key()
  • LLMS_Section::count_children_lessons()
  • LLMS_Section::delete()
  • LLMS_Section::get_children_lessons()
  • LLMS_Section::remove_all_child_lessons()
  • LLMS_Section::remove_child_lesson()
  • LLMS_Section::set_order()
  • LLMS_Section::set_title()
  • LLMS_Section::update()
Removed classes
  • LLMS_PlayNice::divi_fb_wc_product_tabs_after()
  • LLMS_PlayNice::divi_fb_wc_product_tabs_before()
Removed functions
  • lifterlms_template_loop_view_link()
  • llms_setup_product_data()
Removed hooks
  • Action: lifterlms_before_memberships_loop_item_title
  • Action: lifterlms_after_memberships_loop_item_title
  • Action: lifterlms_after_memberships_loop_item_title
Removed templates
  • templates/loop/view-link.php

LifterLMS Version 3.40.0

  • Adds a 1-click installation connector for the MailHawk email delivery plugin.
  • Fixed an issue encountered during checkout when using a coupon against an access plan with a free trial.
  • LLMS_SendWP::do_remote_install() will be converted to a protected method and should no longer be called directly.
  • LLMS_Abstract_Email_Provider::output_css()
Templates updated
  • templates/checkout/form-gateways.php

LifterLMS Groups Version 1.0.0-beta.5

  • Added an interface allowing group admins and leaders to view and delete pending member invitations.
  • Added REST API endpoints for managing group invitations.
  • Some translatable strings found in LifterLMS Groups and the LifterLMS Core will now use the core string to reduce duplicate translations.
Bug fixes
  • Added validation when attempting to create a new invitation to ensure new invitations can only be created if the group has open seats.
  • Fixed transposition issue in the groups list column header on the admin panel.
  • Fixed the group name displayed in the invitation notices.
  • Set the default visibility setting of a new group to match the site’s global setting.
  • The group description “placeholder” text is now a true placeholder instead of being stored as the default group description in the database.

Preparing for LifterLMS 4.0.0

Today marks the start of the beta testing process for the first major core release since 2016, LifterLMS 4.0.0!

What’s a Major Release?

Before proceeding, we wish to convey that this release is a major release, but it does not include any major features.

LifterLMS aims to adhere to semantic versioning (although we’ll confess that we’ve made some mistakes along the way).

While many WordPress users are accustomed to a major release denoting large new features and enhancements, this is not necessarily true when following semantic versioning. In semantic versioning, a major release indicates that backwards incompatible (or breaking) changes have been introduced.

We strive, wherever possible, to remain backwards compatible. Doing so ensures that themes and integration do not have to worry about their codebases being negatively impacted by changes in LifterLMS. However, this also results in a larger codebase full of many unused and deprecated functions, classes, and files.

This makes maintenance more complicated and causes the codebase to be harder to read for new developers and contributors.

Therefore, LifterLMS 4.0.0 is primarily a release intended to clean house.

Breaking Changes in 4.0.0

We’re removing several hundred previously deprecated classes, methods, functions, files, variables, and assets.

In doing this we’ve shrunk the overall footprint of the LifterLMS plugin codebase, improved the overall code quality, and fixed numerous bugs and issues.

All breaking changes have been documented in the changelog.

LifterLMS 4.0.0 Timeline

The release cycle for LifterLMS 4.0.0 starts today, Monday, June 1, 2020 with the release of 4.0.0-beta.1.

We do not have a predetermined release date scheduled. Instead, we have some internal and public testing and quality assurance targets.

Once our targets have been met and we have determined that the beta is stable, we will ship a Release Candidate. One week following the publication of the Release Candidate we aim to move 4.0.0 to the stable public channel where it will be publicly accessible and become the primary supported version of LifterLMS.

Over the coming weeks expect to see several additional beta releases as bugs and issues are reported and resolved.

What Happens to 3.x?

LifterLMS does not (and will not) maintain multiple forks. We support and maintain a single stable release.

Upon the public release of LifterLMS 4.0.0 all users will encouraged to update to LifterLMS 4.0.0 and all future updates to LifterLMS will be updates to 4.0.0.

Contributing as a Beta Tester

The beta releases are available publicly to anyone interested in helping the core team root out bugs and issues.

You can subscribe to the beta channel using the LifterLMS Helper in order to start receiving automatic updates for beta releases through the WordPress admin panel. Alternatively, you can download the latest releases directly from the LifterLMS GitHub repository.

Beta testing is not always fun or easy. At this stage the beta is considered generally stable but you should still use caution and expect to find some issues. Do not install the beta in production.

If you find any issues, please let us know by filing a new bug report or submitting a support request.

If you have general comments or feedback on the beta let us know in the comments below or post a reply in GitHub on our 4.0.0 general feedback issue.

What Should a Beta Tester Look For?

The changes in this beta release are going to be mostly unnoticeable for most users and, therefore, most will not have any issues. Installing the beta will likely be uneventful and that’s good!

If you nave any 3rd-party integrations or themes installed on your site, you should check if developer has reported compatibility and, if they haven’t, reach out to them as soon as possible to ensure there’s no issues when 4.0.0 is released to the stable channel.

If you have any custom code on your site that uses LifterLMS actions, functions, classes, or custom templates, we urge you to test your site as soon as possible.

If you encounter any problems you should let your developer know and if you get stuck, file a new bug report or submit a support request and we’ll point you in the right direction.

A Call to 3rd-Party Integration and Theme Developers

If you maintain a LifterLMS theme, plugin, or integration we need your help!

Please install the latest beta version and test your code against ours. If you find any issues along the way let us know by reporting an issue in GitHub.

We do not expect that you’ll encounter any issues. Almost all of the breaking changes being made are removals of previously deprecated functions and methods. We’re assuming that these deprecated methods are not being utilized publicly but we need your help to ensure that this is true!

After testing your integration please let us know by commenting on our 3rd-party compatibility issue in GitHub.

A Call to LifterLMS Experts

If you’re a member of the LifterLMS Experts program please collaborate with us during this beta period and help us ensure the transition to 4.0.0 is as smooth as possibly for all of our users but especially your clients!

We’d like you to, at the very least, install and test the beta in your own testing environment.

As an expert we expect that you have a few LifterLMS clients, possibly with custom templates and feature plugins. If your clients (and contracts) allow, please test (or help your clients test) the beta in a safe testing or staging environment.

If you encounter any issues or run tests and find that everything goes well, please let us know by posting in GitHub or emailing your contact at LifterLMS.