LifterLMS

LifterLMS Version 3.1.2

  • Update all course and lesson templates to rely only on global $post rather than on $course and $lesson globals which are working inconsistently across environments
  • Fix typo related to the line-height of LifterLMS order notes on the admin panel. Thanks @edent!

LifterLMS Version 3.1.1

  • Shortcode [lifterlms_hide_content] has some new functionality. See documentation for usage and more information!
  • Fix logic when determining if terms and condition checkboxes should be displayed on checkout & open registration.
  • Define a placeholder on the Terms & Conditions page selection so it can be removed
  • Explicitly declare LLMS_Lesson on lesson audio/video embed templates instead of relying the global $lesson. Some environments appear to be losing the global.
  • Removed unused lesson template “full-description”

LifterLMS Version 3.1.0

  • New engagement triggers available to allow engagements to be fired when a student enrolls into a course or membership!
  • Add custom email addresses for to, cc, and bcc when sending email engagements
  • New Merge Code button for easy merging of custom merge codes when creating emails
  • Added post table data for LifterLMS Engagements
  • Added new filter llms_email_engagement_date_format which allows customization of the format of the {current_date} merge code available in LifterLMS Emails
  • Added explicit max width declaration to images within LLMS Catalogs to prevent image overflow. Fixes some theme compatibility issues.
  • Optimize course and lesson audio video templates for faster loads
  • Fix course & lesson video to load videos instead of duplicating audio embeds
  • Fix coupon usage query so that coupons cannot be used more than the maximum number of times. Also now displays the correct number of coupons used on the coupons post table.
  • Fix LLMS Engagement Email merge codes to work in subject line

LifterLMS Version 3.0.4

  • Added shortcode [lifterlms_login] so the login form can be displayed. Information usage at https://lifterlms.com/docs/shortcodes/#lifterlms_login
  • Added internal function LLMS_Student->get_name()
  • Three basic course difficulties will be automatically created on installation and upgrades
  • Updated course difficulty save methods to rely only on the taxonomy rather than the taxonomy and postmeta table
  • Updated admin settings screens to only flush rewrite rules on screens where it is necessary to update rewrites
  • Fix issue with customization of LifterLMS account endpoint URLs
  • Fix a conflict with Redirection url monitoring that was causing redirects to be created from Courses and Memberships to the site home page automatically whenever updating the post
  • Fix an undefined index warning on courses / memberships when updating post data
  • Remove confusing and invalid warning message from Membership post screen on admin panel

LifterLMS Version 3.0.3

  • Added filter llms_show_preview_excerpt which can be used to hide the excerpt on course syllabus or next/back preview tiles in lesson navigation
  • Fix logic so that only free lessons are marked as free lessons post 3.0 upgrade
  • Fix incorrect display of the “restricted” and “non-restricted” content areas for memberships
  • Fix undefined index warning output by membership metaboxes
  • Fix dead like under “Force SSL” checkout setting
  • Course & Membership tiles output by course or membership shortcodes now automatically match column heights like the default catalogs do.
  • Correctly register students as the “Student” Role
  • Database Upgrade script converts users with the role “studnet” to “student”

LifterLMS Version 3.0.2

  • Added action lifterlms_before_student_dashboard_tab
  • Added action lifterlms_after_student_dashboard_greeting
  • Added action lifterlms_after_student_dashboard_tab
  • Added action lifterlms_sd_before_membership
  • Added action lifterlms_sd_after_membership
  • Fix membership shortcode
  • Fix issue that prevented “Student Dashboard” from rendering if the page was set as the child of another page
  • Fix undefined function error in admin notices
  • Fix nonce errors resulting from admin notice html being served from the database rather than being dynamically generated
  • Fix db upgrade script which was enabling course time period for restrictions for all courses regardless of their pre 3.0 restriction settings
  • Fix db upgrade script that was causing empty sale dates to show start of unix epoch b/c they were empty strings
  • Fix Javascript parse error preventing section & lesson editing from within the course outline on the admin panel
  • Fix lesson icons from highlighting lesson settings like drip delay & quiz association
  • Updated course outline color scheme to match the 3.0 admin color scheme overhaul
  • LLMS_Lesson::get_assigned_quiz() will output deprecation warnings for those using debug mode. LLMS core no longer uses this function and will be deprecated in the next major release.
  • Handle enrollment status of legacy orders based on enrollment rather than enrollment AND order status

LifterLMS Version 3.0.1

  • Properly prefix llms_is_ajax() to prevent 500 errors when leaving HTTPS forced checkout screen
  • Fix student unenrollment from memberships which was leaving a trace of enrollment in the user_meta table
  • Update student dashboard nav list items to have more specific no styles to prevent “double discs” on various themes
  • Return course progress bar and “continue” button which was accidentally removed
  • Added core support for “Divi” theme sidebars

LifterLMS Version 3.0.0

This is a massive update which breaks backwards compatibility for many LifterLMS features. A database migration is also necessary for upgrading users to reformat certain pieces of information which are being accessed differently in 3.0.0

We strongly recommend that you backup your website before upgrading and, if possible, test LifterLMS 3.0.0 in a non-public-facing testing environment to ensure compatibility with your theme and other plugins and to ensure that 3.0.0 changes do not adversely affect your existing website.

Please thoroughly read the following changelog and, if necessary, submit support tickets or post in the forums with any questions prior to upgrading. LifterLMS Support cannot and will not manually resolve migration issues which may arise from upgrading to 3.0.0.

  • New shortcodes to be documented later, checkout “includes/class.llms.shortcodes.php” if you’re feeling anxious
  • All kinds of CSS changes to make LifterLMS, in general, be a little less old looking
  • Added a number of CSS classes to various areas in the Checkout template at “templates/checkout/form-checkout.php”
  • Added a “Cancel” button that allows you to hide the coupon form if the user decides not to add a coupon
  • Removed jQuery animations from the coupon form toggle in favor of a CSS class toggle. If you decide you want some animations on the form add some CSS transitions to the .llms-coupon-entry element (and children) to change when the class .active is added or removed from the element.
  • Refactored JavaScript related to LifterLMS Checkout. Improvements are minimal (if any) but the file is now smaller and more readable! Yay code stuff.
  • Fixed some redundant text on single payment confirmation screen. (“Single payment of single payment of”)
  • Added a link to memberships listed under “My Memberships” on the LifterLMS Account Screen
  • LifterLMS Order posts have been renamed in the database from “order” to “llms_order” to prevent any potential conflicts with other plugins. Automated database migration will handle the renaming of old orders.
  • Fixed undefined variable notice generated by Sections without any lessons inside of them
  • renamed function add_query_var_product_id() to llms_add_query_var_product_id()
  • added a class for interacting with a course TRACK, instantiated by a track term or term_id (LLMS_Track)
  • password strength meter and related settings / options via utilizing WordPress password strength functions available
  • cleaned up the lesson locked tooltips to be a bit more sane and also utilized in course navigation on individual lessons.
  • Updated admin menus for LifterLMS content to be more sane and organized and intuitive and so on and so forth
Payment Gateways

NOTE: at this release, LifterLMS PayPal is the only payment gateway that will work with this release. We haven’t started working on Stripe 4.0.0 which will work with LifterLMS 3.0.0

  • Payment gateways powered by a new abstract gateway class
  • PayPal has been removed from LifterLMS and is available as premium extension
Frontend Notices
  • LifterLMS “Notices” have been rewritten, slightly.
  • Most templates have been updated
  • associated CSS has been updated
  • Some sanity has been added to the related functions
Post “Model” Concept / Overhaul

Updated classes for programmatically accessing all sorts of data related to custom post types registered by LifterLMS.

These post types currently include:

  • Access Plans — a non-public post type associated with courses and memberships which store payment related information
  • Coupons (replaces includes/class.llms.coupon.php)
  • Courses (replaces includes/class.llms.course.php)
  • Lessons (replaces includes/class.llms.lesson.php)
  • Memberships
  • Orders (replaces includes/class.llms.order.php
  • Products — can be instantiated from courses or memberships (replaces includes/class.llms.product.php)
  • Transaction — a non-public post type associated with orders which store completed/attempted transaction data
Improved admin metabox methods (and related)
  • Updated custom LifterLMS Admin Metaboxes to have a more sane programmatic interface. This affects nearly all admin metabox classes in the plugin.
  • A set of methods and classes have been added to improve the programmatic interface around custom post type post tables. These can be found in “includes/admin/post-types/post-tables”
Coupons
  • New class LLMS_Coupon allows for easy getting & setting of coupon data.
  • Updated coupon post table to include relevant coupon information for all coupons at a glance
  • Refactored admin panel coupon metabox generation to utilize new model for saving data
  • Added translation functions to all strings in coupon settings screen
  • Added new coupon settings
  • Expiration Date — coupons cannot be applied to a purchase after the expiration date
  • Payment Type — coupons can only be applied to either single or recurring payment plans. Existing coupons will be treated as single payment coupons until updated by the Admin.
  • First Payment Discount — Applies only to recurring payment coupons. Determines the discount applied to the first payment of a recurring payment transaction.
  • Recurring Payments Discount — Applies only to recurring payment coupons. Determines the discount applied all payments (other than the first) of a recurring payment transaction.
  • Description — Record internal notes for a coupon visible only by admins on the admin panel
  • The “Coupon Code” field has been removed in favor of the WordPress Coupon Post Title being utilized as the code. After upgrading, an automated database migration will move all coupon code fields to the title. The title previously functioned as the coupon description. During the migration the existing title will be moved to the new description field.
Orders
  • Added Order Statuses
  • Completed – Single payment only. Denotes a successful transaction
  • Active – Recurring only. Denotes the subscription is active with no issues
  • Expired – Recurring only. Denotes the subscription has ended and is no longer active
  • Refunded – Denotes the order has been refunded.
  • Cancelled – Denotes the order has been cancelled manually by an admin.
  • Failed – Denotes payment has failed. For subscriptions a failed payment will switch from “active” to “failed”
  • Pending – Denotes that the order has been created but payment has not been completed yet
  • Admin panel order table new features:
  • The following columns are now sortable in ascending and descending orders: Order, Product, and Date
  • Added totals based on order type (single or recurring) to the “Total” column
  • Added an order status column for quick status review
  • Order notes available for internal and system notes. powered by WP comments. lots of inspiration (and code) from WooCommerce, thank you <3
  • Added a bunch of currency settings (as well as right-side currency and decimal-less currency support!)
New Templates
  • Pricing Table at “templates/product/pricing-table.php” utilized by courses and memberships for displaying access plan information. Replaces “templates/membership/purchase-link.php” and “templates/course/purchase-link.php”
  • Course Taxonomy Templates at “templates/course/categories.php”, “templates/course/tags.php”, and “templates/course/tracks.php” display comma separated lists for course custom taxonomy terms
  • Course Prerequisite Template at “templates/course/prerequisites.php” displays prerequisite information (course and tracks) for a given course.
  • Meta Wrapper templates at “templates/course/meta-wrapper-end.php” and “templates/course/meta-wrapper-start.php” wrap some HTML around various meta data output about a course
  • Significantly updated checkout process with all kinds of new templates including:
  • templates/checkout/form-gateways.php
  • templates/checkout/form-summary.php
  • Unified “Lesson Preview” at “templates/course/lesson-preview.php” displays “buttons” in course syllabus (on course page) and in course navigation (on lesson pages)
  • Various template hook priority changes in order to make adding content between default LifterLMS areas easier
Deleted Templates
  • templates/checkout/form-checkout-cc.php
  • templates/checkout/form-pricing.php
New & Updated Admin Interfaces & Templates
  • Significantly improved, changed, or brand new templates for metaboxes for various post types:
  • templates/admin/post-types/order-details.php
  • templates/admin/post-types/order-transactions.php
  • templates/admin/post-types/product-access-plan.php
  • templates/admin/post-types/product.php
New Functions
  • llms_confirm_payment_url() – Retrieve the URL used for confirming LifterLMS Payments
  • llms_cancel_payment_url() – Retrieve the URL users are directed to when cancelling a payment
Install Script
  • Removed some legacy default options that were being created and are no longer required for new installations.
  • Removed unused update_courses_archive() function & related hook
Select2

Now utilizing a forked version of Select2 to prevent 3.5.x conflicts we’ve been plagued with

Deprecated
  • Removed filter lifterlms_get_price_html, use lifterlms_get_single_price_html instead
  • Removed unused LLMS_Product->get_price_suffix_html() function
  • Removed LLMS_Product->set_price_html_as_value() because we didn’t like it anymore, don’t use anything instead.
  • Removed add_query_var_course_id() function
  • Removed displaying_sidebar_in_post_types() function with the LLMS_Sidebars::replace_default_sidebars() function
  • Filter lifterlms_order_process_pending_redirect has been replaced with lifterlms_order_process_payment_redirect
  • Action lifterlms_order_process_begin has been deprecated
  • Removed lifterlms_order_process_complete action
  • Replaced LLMS_Course::check_enrollment() with various new utilities. See llms_is_user_enrolled() for fastest use.
  • Officially removed the LLMS_Language class
  • Officially removed the PluginUpdateChecker class stubs we created to prevent updating issues with LifterLMS extensions during our transition to 2.0.0. This library has caused nothing but pain for everyone on our team and many of our users. It’s gone now, forever.
  • Removed function lifterlms_template_single_price() and replaced with lifterlms_template_pricing_table()
  • Removed templates at “includes/course/price.php” and “includes/membership/price.php” in favor of “includes/product/pricing-table.php”
  • Removed LLMS_Person::create_new_person() in favor of LLMS_Person_Handler::register() or llms_create_new_person()
  • Removed LLMS_Person->set_user_login_timestamp_on_register() and are simply adding the metadata during registration
  • Removed lifterlms_register_post action hook which fired after new user registration validation, this has been replaced with lifterlms_user_registration_after_validation
  • Removed lifterlms_new_person_data and lifterlms_new_person_address filters, replaced with lifterlms_user_registration_data
  • Removed LLMS_Person::login_user() in favor of LLMS_Person_Handler::login()
  • background updater
  • system report facelift + inclusion of all new settings via LLMS_Data class
  • Fix setup wizard styles to follow update admin panel styles
  • add links to last step of setup wizard for documentation and demo
  • removed a bunch of deprecated coupon-related functions
  • added a “force ssl” option to ensure checkout is secured
  • added settings and options around recurring payments and staging sites to prevent duplicate charges when testing on a cloned site
  • Check course restrictions automatically when checking lesson
  • Added user_id to all access function checks to allow for checks for non current user
  • course restriction messages display regardless of enrollment status
  • check memberships and lock purchase of members only access plans
  • Fixed titles of course closed and open messages on the course restrictions options
  • record a start date for access plans based off when order moves to complete or active for the first time
  • automatically expire limited access plans
  • gave a quick facelift & unification to a lot of admin panel elements
  • Color consistency updated according to LLMS brand guide
  • Unified front and backend button classes
  • Updated all frontend buttons to have consistent classes
  • Removed the “FREE” lesson SVG in favor of simple text which allows translating
  • Install & activation overhauls. Resolves #179
  • jQuery MatchHeight lib unignored
  • A bunch of settings pages updated and a bunch of settings deprecated
  • Gateways setting page removed
  • Memberships & Courses page combined into “Catalogs” settings
  • Added a data getting class used by the tracker class
  • added a new page creation function with better intelligence that (hopefully) prevents duplicate pages from being created during core page installation
  • new default country setting
  • all order status changes recorded as order notes
  • pending orders can be completed after failed payments
  • better handling for gateways with fields
  • JS spinners support multiples via start & stop!
  • Updated (and semi-finished) analytics
  • achievement metabox converted
  • minor updates to voucher class
  • Added a “post state” visible on the Pages posts table identifying if the page is saved as a LifterLMS page (EG: Checkout Page)
  • Fixed copy/paste error of duplicate enrollment closed message on course restrictions tab
  • Removed WC integration in favor of WC
  • Upgrade “back to course” template to new lesson API
  • Renamed course/parent_course.php to course/parent-course.php for template naming consistency
  • use strict when auto generating usernames when creating from email addresses, resolves #182
3.0.0 Auto Upgrader
  • lots of postmeta data rekeyed
  • intelligently generated defaults for various pieces of new meta data on courses, lessons, and memberships
  • automatically generate access plans from existing course and membership data
  • update existing orders to pull semi-accurate data into analytics based on new database structure
  • cleans database of a ton of deprecated options and postmeta data
Deprecated
  • function llms_is_user_member(), use llms_is_user_enrolled() instead
  • function llms_check_course_date_restrictions()
  • function quiz_restricted()
  • function membership_page_restricted()
  • function is_topic_restricted()
  • function llms_get_post_memberships()
  • function llms_get_parent_post_memberships()
  • function parent_page_restricted_by_membership()
  • function outstanding_prerequisite_exists()
  • function find_prerequisite()
  • function llms_get_course_enrolled_date()
  • function llms_get_lesson_start_date()
  • function lesson_start_date_in_future()
  • function page_restricted_by_membership_alert()
  • function llms_does_user_memberships_contain_course()
  • class LLMS_Checkout
  • function LLMS()->checkout()
Auto Enrollment
  • Course auto enrollment for Memberships has been restored
  • Works exactly the same as previously except auto-enrollment is not dependent on a course “belonging to” the membership via membership restrictions. This is because membership restrictions no longer apply to courses
Analytics
  • Charts! I’m really excited about this. I know we still need more data but please say nice things to me, I worked really hard on these little charts.
  • Updated styles & interface
bbPress
  • Restrict individual forums (and their topics) to LifterLMS Membership levels
BuddyPress
  • Fixes broken course display on bp profile
  • Adds memberships subpage to bp profile
notices
  • Admin notices class for managing admin notices, it’s pretty neat!
Student Management on Courses and Memberships
  • All new and improved student management interface for managing student enrollments from courses and memberships
Deprecated
  • filter: llms_meta_fields_course_main, replace with llms_metabox_fields_lifterlms_course_options
Manual Payments
  • Manual Payment Gateway can now be enabled on the frontend!
  • When a manual payment is recorded the user will be redirected to a view order page where they will be prompted to make a manual payment
  • Define the payment instructions on the admin panel “Checkout Settings”
  • Once you verify payment, head to the pending order and hit the “Record a Manual Payment” button to record the transaction
  • Upon recording the order status will be upgraded to “Complete” and the user will be enrolled automatically
Student Dashboard Upgrades
  • More sane template hooks and functions
  • Pagination on Courses endpoint (view only a preview on the main dashboard)
  • Orders history & view orders screens!

Deprecated options (and related functions where applicable) for the following course & membership options:

  • lifterlms_button_purchase_membership_custom_text
  • lifterlms_course_display_outline_lesson_thumbnails
  • lifterlms_course_display_author
  • lifterlms_course_display_banner
  • lifterlms_course_display_difficulty
  • lifterlms_course_display_length
  • lifterlms_course_display_categories
  • lifterlms_course_display_tags
  • lifterlms_course_display_tracks
  • lifterlms_lesson_nav_display_excerpt
  • lifterlms_course_display_outline
  • lifterlms_course_display_outline_titles
  • lifterlms_course_display_outline_lesson_thumbnails
  • lifterlms_display_lesson_complete_placeholders
  • redirect_to_checkout

In all scenarios either a add_filter (returning false) or a remove_action() can be used to replicate the option.

LifterLMS Version 3.0.0-beta.4

  • fix issue with course prereq checks
  • next payment due date visible on order admin view
  • trial end date visible on order admin view
Free Access Plans
  • “Free” access plans now defined as such based on a checkbox rather than by entering 0 into the price
  • Only single payment access plans can be free (a free recurring payment makes no sense but we can certainly discuss this if you disagree with me)
  • trials are disabled with free plans (because trials only apply to recurring plans)
  • sales are disabled for free access plans
Checkout Form JS API
  • unified JS checkout handler
  • allows extensions to enqueue validation or pre-submission JS functions that should run prior to checkout form submission
Manual Payment Gateway
  • handles purchase of access plans marked ar FREE & orders that are discounted to 100% via coupons
Open Enrollment
  • Open Enrollment allows users to register on the account dashboard without purchasing a course
  • Voucher settings are available to customize whether vouchers should be optional or required during open registration
  • Better error reporting around voucher usage during enrollment
Deprecated Functions
  • llms_get_coupon()
  • get_section_id()
  • check_course_capacity()
Quizzes
  • Updated admin metaboxes to use new metabox abstract class
  • display 0 instead of negative attempts on quiz summary
  • updated logic in start button template
Emails (for engagements)
  • Admin metabox updated to new API
  • Postmeta data migration:
  • _email_subject renamed to _llms_email_subject
  • _email_heading renamed to _llms_email_heading