This major release of LifterLMS focuses on improving the experience of creating, designing, and managing achievements and certificates: use the block editor to design certificates, sync awards with their templates, award achievements and certificates on demand without requiring an engagement trigger, and much more. In addition, this release removes a significant number of previously deprecated classes, methods, and functions. Please read the full Breaking Changes sections for more information on removed code.
New Features
- The block editor is now enabled by default for certificates when using WordPress versions 5.8 and later.
- Existing certificates are marked as “legacy” and will continue to use the classic editor until migrated.
- To migrate a certificate, click the “Migrate Certificate” button. This will force the certificate’s content into blocks.
- A number of new settings are available to certificates when using the block editor:
- Set the certificate’s display (and print) size using common paper sizes such as US Letter, US Legal, A3, A4, and more.
- Set the certificate’s display orientation: portrait of landscape.
- Set the certificate’s inner margins.
- Set the certificate’s background color.
- A new block, the Certificate Title Block, has been made available to certificates.
- The block works like a WordPress core Heading Block with added options for selecting from a few display fonts (provided by Google Web Fonts).
- The block controls the title of awarded certificates.
- Added the ability for administrators and LMS managers to edit earned certificates/achievements from the students reporting screen, as well as award new certificates/achievements to students.
- Added the ability to sync awarded certificates with the template used to generate them. #1078
- The
post_name
of earned certificate posts will be generated with a randomized 3+ character string in favor of relying on sequential numbers. - Added certificate global options for the default size of new certificates and certificate templates.
- Certificate and email template merge code buttons now include [llms-user] information shortcodes.
- Added certificate sequential ID functionality merge code.
- Added a link to return to the student dashboard when viewing an awarded certificate. #1959
- Provide additional information to hooks on the student single course reporting screen.
Updates and Enhancements
- Added new default images for use with achievements and certificates.
- The site-wide default images can be customized on the admin panel under Settings -> Engagements.
- The old default images will automatically be used for legacy certificates and can be forced by filtering
llms_use_legacy_engagement_images
. #1081 - Certificates no longer use the
header.php
andfooter.php
files from the site’s theme, instead custom templates (templates/certificates/header.php
andtemplates/certificates/footer.php
) are used instead. These templates are minimal and exclude theme wrappers which reduces the visual conflicts encountered from theme wrappers, backgrounds, and more, especially when printing certificates. #463 - The achievements and certificates dashboard endpoints are now paginated. #669
- Added pagination to achievement and certificate reporting pages.
- The URL of earned user certificates has been changed from “my_certificate” to “certificate”. Requests to the old url are automatically redirected to the new url, including instances where the URL slug has been translated.
- The URL of certificate template previews has been changed from “certificate” to “certificate-template”.
- The certificate merge code,
{first_name}
, now outputs an empty string in favor of falling back to the user’s nickname when there is no first name for the user. #1640 - The look and behavior of the certificate {{MINI_CERTIFICATE}} pop-over notification merge code now displays a placeholder preview of the certificate in favor of attempting to render a tiny version of the actual certificate. #1950
- The coupon code in the student’s order details table is now wrapped in a
<code>
tag instead of an<a>
tag. #2033 - Updates LifterLMS REST to v1.0.0-beta.23.
- Updated LifterLMS Blocks to version 2.4.0.
Bug Fixes
- Delayed engagements are automatically unscheduled when the related post is deleted.
- A disabled student dashboard endpoint will no longer display the endpoint’s summary on the main dashboard page. #535
- Prior to sending a delayed engagement the recipient’s enrollment in the related post is verified resulting the engagement not being triggered if the recipient’s enrollment has been terminated. #290
- Post search filter boxes on various post tables will now longer display a link to the selected post.
- Basic notification code is no longer loaded on the admin panel.
- Fixed the label hover on picture type quizzes in some themes. #2015
Database Migration
- A database migration is required when upgrading from versions earlier than 6.0.0. A description of the required updates can be found at https://lifterlms.com/docs/lifterlms-database-updates/#600.
Deprecations
- Public access to properties of the abstract
LLMS_Database_Query
has been deprecated. - Public access to class property
LLMS_Database_Query::$found_results
. The property is no longer publicly writable but can be read viaLLMS_Database_Query::get_found_results()
. - Public access to class property
LLMS_Database_Query::$max_pages
. The property is no longer publicly writable but can be read viaLLMS_Database_Query::get_max_pages()
. - Public access to class property
LLMS_Database_Query::$number_results
. The property is no longer publicly writable but can be read viaLLMS_Database_Query::get_number_results()
. - Public access to class property
LLMS_Database_Query::$results
. The property is no longer publicly writable but can be read viaLLMS_Database_Query::get_results()
. - Public access to class property
LLMS_Database_Query::$query_vars
. The variable as a whole cannot be publicly accessed, instead useLLMS_Database_Query::get()
andLLMS_Database_Query::set()
to read and write to the array. - The above changes were made to the abstract class
LLMS_Database_Query
but the following concrete classes that utilize the abstract are also affected by this change:LLMS_Query_User_Postmeta
,LLMS_Student_Query
,LLMS_Query_Quiz_Attempt
,LLMS_Events_Query
, andLLMS_Notifications_Query
. - Class
LLMS_Achievement_User
is deprecated with no direct replacement. - Method
LLMS_Achievement::is_enabled()
is deprecated with no replacement. - Method
LLMS_Achievement::get_blogname()
is deprecated with no replacement. - Method
LLMS_Achievement::format_string()
is deprecated with no replacement. - Method
LLMS_Achievement::get_title()
is deprecated with no replacement. - Method
LLMS_Achievement::get_content()
is deprecated with no replacement. - Method
LLMS_Achievement::get_content_html()
is deprecated with no replacement. - Method
LLMS_Achievement::create()
is deprecated with no replacement. - Method
LLMS_Achievements::trigger_engagement()
is deprecated in favor ofLLMS_Engagement_Handler::handle_achievement()
. - Class
LLMS_Certificate
is deprecated with no direct replacement. - Method
LLMS_Certificate::is_enabled()
is deprecated with no replacement. - Method
LLMS_Certificate::get_blogname()
is deprecated with no replacement. - Method
LLMS_Certificate::format_string()
is deprecated with no replacement. - Method
LLMS_Certificate::get_title()
is deprecated with no replacement. - Method
LLMS_Certificate::get_content()
is deprecated with no replacement. - Method
LLMS_Certificate::get_content_html()
is deprecated with no replacement. - Method
LLMS_Certificate::get_title()
is deprecated with no replacement. - Method
LLMS_Certificates::trigger_engagement()
is deprecated in favor ofLLMS_Engagement_Handler::handle_certificate()
. - Method
LLMS_Engagements::init()
is deprecated with no replacement. - Method
LLMS_Engagements::handle_achievement
is deprecated in favor ofLLMS_Engagement_Handler::handle_achievement
. - Method
LLMS_Engagements::handle_certificate
is deprecated in favor ofLLMS_Engagement_Handler::handle_certificate
. - Method
LLMS_Engagements::handle_email
is deprecated in favor ofLLMS_Engagement_Handler::handle_email
. - Method
LLMS_Database_Query::set_found_results()
is deprecated. - Class
LLMS_Achievement_User
is deprecated with no direct replacement. - Method
LLMS_Achievement_User::has_user_earned()
is deprecated with no replacement. - Method
LLMS_Achievement_User::init()
is deprecated with no replacement. - Method
LLMS_Achievement_User::trigger()
is deprecated with no replacement. - Method
LLMS_Achievement_User::get_content_html()
is deprecated with no replacement. - Class
LLMS_Certificate_User
is deprecated with no direct replacement. - Method
LLMS_Certificate_User::init()
is deprecated with no replacement. - Method
LLMS_Certificate_User::trigger()
is deprecated with no replacement. - Method
LLMS_Certificate_User::get_content_html()
is deprecated with no replacement. - Method
LLMS_Certificate_User::set_shortcode_user()
is deprecated with no replacement. - Engagement debug logging is removed. Use
llms_log()
directly instead. - Filter
llms_db_query_get_default_args
is deprecated in favor ofllms_{$this->id}_query_get_default_args
. - Filter
llms_certificate_has_user_earned
is deprecated in favor ofllms_earned_certificate_dupcheck
. - Unused public class property
LLMS_Achievements::$content
is deprecated with no replacement. - Method
LLMS_Admin_Post_Types::meta_metabox_init()
is deprecated with no replacement. - The site options
lifterlms_certificate_bg_img_width
,lifterlms_certificate_bg_img_height
, andlifterlms_certificate_legacy_image_size
are now used only for certificates and certificate templates created using the classic editor. - The settings, found on the Engagements Settings screen, are hidden by default.
- During the database upgrade from versions earlier than 6.x, an site option,
llms_has_legacy_certificates
is added when at least one certificate is found. This option will display the settings so they can continue to be used for legacy certificates. - After migrating all certificates on a site, the settings will still display. In order to remove them from the screen a developer can either delete the option
llms_has_legacy_certificates
or returnfalse
from the filterllms_has_legacy_certificates
. - Method
LLMS_Engagements::handle_certificate
is deprecated in favor ofLLMS_Engagement_Handler::handle_certificate
. #290 - Method
LLMS_Engagements::handle_achievement
is deprecated in favor ofLLMS_Engagement_Handler::handle_achievement
. #290 - The constant
LLMS_ENGAGEMENT_DEBUG
is deprecated with no replacement. - Engagement debugging via
LLMS_Engagements::log
is deprecated. Usellms_log()
instead. - Method
LLMS_Engagements::handle_email
is deprecated in favor ofLLMS_Engagement_Handler::handle_email
. - Filter
lifterlms_register_post_type_llms_my_certificate
is deprecated in favor oflifterlms_register_post_type_my_certificate
. - Deprecated the misspelled protected method
LLMS_Database_Query::preprare_query()
and replaced withLLMS_Database_Query::prepare_query()
. - Class method
LLMS_Events_Query::preprare_query
replaced withLLMS_Events_Query::prepare_query()
. - Class method
LLMS_Query_Quiz_Attempt::preprare_query
replaced withLLMS_Query_Quiz_Attempt::prepare_query()
. - Class method
LLMS_Query_User_Postmeta::preprare_query
replaced withLLMS_Query_User_Postmeta::prepare_query()
. - Class method
LLMS_Student_Query::preprare_query
replaced withLLMS_Student_Query::prepare_query()
. - Class method
LLMS_Notifications_Query::preprare_query
replaced withLLMS_Notifications_Query::prepare_query()
. - Class method
LLMS_Notifications_Query::preprare_query
replaced withLLMS_Notifications_Query::prepare_query()
. #859
Breaking Changes
- Removed FSE template:
templates/block-templates/single-certificate.html
. - Removed the deprecated
LLMS()
function in favor of thellms()
function. - Removed the deprecated the
LLMS_SendWP::do_remote_install()
method in favor of theLLMS_Abstract_Email_Provider::do_remote_install()
method. - Removed the deprecated
LLMS_Abstract_Email_Provider::output_css()
method. - Removed the deprecated
LLMS_Abstract_Generator_Posts::increment()
method. - Removed the deprecated
LLMS_Admin_Users_Table::load_dependencies()
method. - Removed the deprecated
LLMS_Admin_Import::localize_stat()
method. - Removed the deprecated
LLMS_Admin_Notices_Core::check_staging()
method. - Removed the deprecated
LLMS_Admin_Setup_Wizard::generator_course_status()
method. - Removed the deprecated
LLMS_Admin_Setup_Wizard::output_step_html()
method. - Removed the deprecated
LLMS_Admin_Setup_Wizard::scripts()
method. - Removed the deprecated
LLMS_Admin_Setup_Wizard::watch_course_generation()
method. - Removed the deprecated
llms_format_decimal()
function. - Removed the deprecated
llms_set_person_auth_cookie()
function. - Removed the deprecated
LLMS_Course::sections
property. - Removed the deprecated
LLMS_Course::sku
property. - Removed the deprecated
LLMS_Frontend_Assets::enqueue_inline_pw_script()
method. - Removed the deprecated
LLMS_Frontend_Assets::enqueue_inline_script()
method. - Removed the deprecated
LLMS_Frontend_Assets::is_inline_script_enqueued()
method. - Removed the deprecated
LLMS_Generator::add_custom_values()
method. - Removed the deprecated
LLMS_Generator::add_custom_values()
method. - Removed the deprecated
LLMS_Generator::format_date()
method. - Removed the deprecated
LLMS_Generator::get_author_id_from_raw()
method. - Removed the deprecated
LLMS_Generator::get_default_post_status()
method. - Removed the deprecated
LLMS_Generator::get_generated_posts()
method. - Removed the deprecated
LLMS_Generator::increment()
method. - Removed the deprecated
llms__created
action hook from theLLMS_Abstract_Database_Store::create()
method. - Removed the deprecated
llms__deleted
action hook from theLLMS_Abstract_Database_Store::delete()
method. - Removed the deprecated
llms__updated
action hook from theLLMS_Abstract_Database_Store::update()
method. - Removed the deprecated
llms_user_removed_from_membership_level
action hook from theLLMS_Student::unenroll()
method. - Removed the deprecated and misspelled
$purchaseable
global variable in thelifterlms_template_pricing_table()
function. - Removed the deprecated and misspelled
$purchaseable
global variable in thetemplates/product/pricing-table.php
file. - Removed the deprecated
LLMS_Frontend_Password
class. - Removed the deprecated
LLMS_Install::db_updates()
method. - Removed the deprecated
LLMS_Install::update_notice()
method. - Removed the deprecated
LLMS_Notifications::dispatch_processors()
method. - Removed the deprecated
llms_processors_async_dispatching
filter hook from theLLMS_Notifications::__construct()
method. - Removed the deprecated
LLMS_Notifications::$_instance
property. - Removed the deprecated
LLMS_Person_Handler::register()
method. - Removed the deprecated
LLMS_Person_Handler::sanitize_field()
method. - Removed the deprecated
LLMS_Person_Handler::update()
method. - Removed the deprecated
LLMS_Person_Handler::validate_fields()
method. - Removed the deprecated
LLMS_Person_Handler::voucher_toggle_script()
method. - Removed the deprecated
templates/admin/notices/db-update.php
file. - Removed the deprecated
templates/admin/notices/db-updating.php
file. - Removed the deprecated
llms_usernames_blacklist
filter hook in thellms_get_usernames_blocklist()
function. - Removed the deprecated
includes/libraries/wp-background-processing/index.php
file. - Removed the deprecated
includes/libraries/wp-background-processing/wp-async-request.php
file. - Removed the deprecated
includes/libraries/wp-background-processing/wp-background-process.php
file. - Removed the deprecated
LLMS_Section::get_next_available_lesson_order()
method. - Removed the deprecated
LLMS_Section::get_order()
method. - Removed the deprecated
LLMS_Section::get_parent_course()
method. - Removed the deprecated
LLMS_Section::set_parent_course()
method. - Removed the deprecated
LLMS_AJAX::check_voucher_duplicate()
method. - Removed the deprecated
LLMS_AJAX::get_ajax_data()
method. - Removed the deprecated
LLMS_AJAX::register_script()
method. - Removed the deprecated
LLMS_Interface_Post_Audio
interface. - Removed the deprecated
LLMS_Interface_Post_Sales_Page
interface. - Removed the deprecated
LLMS_Interface_Post_Video
interface. - Removed the deprecated
LLMS_Achievements::$_instance
property. - Removed the deprecated
LLMS_Certificates::$_instance
property. - Removed the deprecated
LLMS_Emails::$_instance
property. - Removed the deprecated
LLMS_Engagements::$_instance
property. - Removed the deprecated
LLMS_Events::$_instance
property. - Removed the deprecated
LLMS_Grades::$_instance
property. - Removed the deprecated
LLMS_Integrations::$_instance
property. - Removed the deprecated
LLMS_Payment_Gateways::$_instance
property. - Removed the deprecated
LLMS_Processors::$_instance
property. - Removed the deprecated
LLMS_Sessions::$_instance
property.
Developer Notes
- Added
LLMS_Awards_Query
, used for querying data about awarded certificates and achievements. - The method signature
LLMS_Student::get_achievements()
andLLMS_Student::get_certificates()
now use this class under tho hood. - The previous method signature, which passed data into a direct SQL query, is now deprecated.
- Achievement and certificate data storage locations have been modified, primarily to reduce reliance on the
wp_postmeta
table which will result in a site-wide performance improvement, especially on large sites. - Meta properties
_llms_achievement_content
and_llms_certificate_content
have been removed in favor ofWP_Post::$post_content
. - Meta properties
_llms_achievement_title
and_llms_certificate_title
have been removed in favor ofWP_Post::$post_title
. - Meta properties
_llms_achievement_template
and_llms_certificate_template
have been removed in favor ofWP_Post::$post_parent
. - Meta properties
_llms_achievement_image
and_llms_certificate_image
have been moved the meta property_thumbnail_id
in order to utilize the WordPress core’s featured image functionality and internal APIs. - Reliance on
lifterlms_user_postmeta
for achievement and certificate data will be removed in a future release. - User postmeta properties
_achievement_earned
and_certificate_earned
will continue to be recorded but are no longer being used internally. - The
updated_date
is now accessible viaWP_Post::$post_date
. - The
user_id
is now accessible viaWP_Post::$post_author
. - Added new Javascript UI components library, modeled after
@wordpress/components
. Read more. - Added a new SVG icon library, modeled after
@wordpress/icons
. Read more. - The merge code button seen on certificate and email template editors is now an SVG image instead of a PNG.
- Added utility function for escaping and quoting strings. #1027
- Added the ability to force an admin metabox field value through the new
meta
arg. #2016 - Added new utility function for stripping prefixes from strings.
Performance Improvements
- Increased the number of files that are autoloaded instead of manually loaded.
Updated Templates
- templates/achievements/loop.php
- templates/achievements/template.php
- templates/admin/notices/db-update.php
- templates/admin/notices/db-updating.php
- templates/admin/reporting/reporting.php
- templates/admin/reporting/tabs/students/courses-course.php
- templates/admin/reporting/tabs/students/information.php
- templates/block-templates/single-certificate.html
- templates/certificates/actions.php
- templates/certificates/content-legacy.php
- templates/certificates/content.php
- templates/certificates/dynamic-styles.php
- templates/certificates/footer.php
- templates/certificates/header.php
- templates/certificates/loop.php
- templates/certificates/preview.php
- templates/certificates/template.php
- templates/checkout/form-switch-source.php
- templates/content-certificate.php
- templates/emails/footer.php
- templates/emails/header.php
- templates/myaccount/my-grades-single-table.php
- templates/myaccount/view-order-actions.php
- templates/myaccount/view-order-information.php
- templates/myaccount/view-order-transactions.php
- templates/myaccount/view-order.php
- templates/product/pricing-table.php
- templates/single-certificate.php