Repository: gocodebox/lifterlms Branch: trunk Commit: 8c7f47418740 Files: 1659 Total size: 9.4 MB Directory structure: gitextract_4knxr8ph/ ├── .codeclimate.yml ├── .cursor/ │ └── BUGBOT.md ├── .editorconfig ├── .eslintrc.js ├── .github/ │ ├── CODEOWNERS │ ├── CONTRIBUTING.md │ ├── ISSUE_TEMPLATE/ │ │ ├── Bug_Report.md │ │ ├── Feature_Request.md │ │ └── Question.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── SECURITY.md │ ├── workflow-matrix.yml │ └── workflows/ │ ├── codeql-analysis.yml │ ├── contributors.yml │ ├── keep-alive.yml │ ├── lint-js.yml │ ├── ossar-analysis.yml │ ├── project-automation.yml │ ├── publish.yml │ ├── sync-branches.yml │ ├── test-e2e.yml │ ├── test-js-unit.yml │ └── test-phpunit.yml ├── .gitignore ├── .llmsconfig ├── .llmsdev.yml ├── .llmsdevrc ├── .llmsenv.dist ├── .source/ │ └── README.md ├── .wordpress-org/ │ ├── README.md │ └── readme/ │ ├── 01-header.md │ ├── 05-description.md │ ├── 10-installation.md │ ├── 15-faqs.md │ ├── 20-screenshots.md │ └── 25-changelog.md ├── CHANGELOG.md ├── LICENSE ├── README.md ├── assets/ │ ├── css/ │ │ ├── bricks-editor.css │ │ ├── dancing-script.css │ │ ├── imperial-script.css │ │ ├── pirata-one.css │ │ └── unifraktur-maguntia.css │ ├── fonts/ │ │ └── FontAwesome.otf │ ├── js/ │ │ ├── app/ │ │ │ ├── llms-achievements.js │ │ │ ├── llms-ajax.js │ │ │ ├── llms-donut.js │ │ │ ├── llms-forms.js │ │ │ ├── llms-instructors.js │ │ │ ├── llms-l10n.js │ │ │ ├── llms-lesson-preview.js │ │ │ ├── llms-outline-collapse.js │ │ │ ├── llms-password-strength.js │ │ │ ├── llms-pricing-tables.js │ │ │ ├── llms-quiz-attempt.js │ │ │ ├── llms-review.js │ │ │ ├── llms-storage.js │ │ │ ├── llms-student-dashboard.js │ │ │ ├── llms-tracking.js │ │ │ ├── llms-visibility-toggle.js │ │ │ └── rest.js │ │ ├── builder/ │ │ │ ├── Collections/ │ │ │ │ ├── Lessons.js │ │ │ │ ├── QuestionChoices.js │ │ │ │ ├── QuestionTypes.js │ │ │ │ ├── Questions.js │ │ │ │ ├── Sections.js │ │ │ │ └── loader.js │ │ │ ├── Controllers/ │ │ │ │ ├── Construct.js │ │ │ │ ├── Debug.js │ │ │ │ ├── Schemas.js │ │ │ │ └── Sync.js │ │ │ ├── Models/ │ │ │ │ ├── Abstract.js │ │ │ │ ├── Course.js │ │ │ │ ├── Image.js │ │ │ │ ├── Lesson.js │ │ │ │ ├── Question.js │ │ │ │ ├── QuestionChoice.js │ │ │ │ ├── QuestionType.js │ │ │ │ ├── Quiz.js │ │ │ │ ├── Section.js │ │ │ │ ├── _Relationships.js │ │ │ │ ├── _Utilities.js │ │ │ │ └── loader.js │ │ │ ├── Schemas/ │ │ │ │ ├── Lesson.js │ │ │ │ └── Quiz.js │ │ │ ├── Views/ │ │ │ │ ├── Assignment.js │ │ │ │ ├── Course.js │ │ │ │ ├── Editor.js │ │ │ │ ├── Elements.js │ │ │ │ ├── FormattingToolbar.js │ │ │ │ ├── Lesson.js │ │ │ │ ├── LessonEditor.js │ │ │ │ ├── LessonList.js │ │ │ │ ├── Popover.js │ │ │ │ ├── PostSearch.js │ │ │ │ ├── Question.js │ │ │ │ ├── QuestionBank.js │ │ │ │ ├── QuestionChoice.js │ │ │ │ ├── QuestionChoiceList.js │ │ │ │ ├── QuestionList.js │ │ │ │ ├── QuestionType.js │ │ │ │ ├── Quiz.js │ │ │ │ ├── Section.js │ │ │ │ ├── SectionList.js │ │ │ │ ├── SettingsFields.js │ │ │ │ ├── Sidebar.js │ │ │ │ ├── Utilities.js │ │ │ │ ├── _Detachable.js │ │ │ │ ├── _Editable.js │ │ │ │ ├── _Receivable.js │ │ │ │ ├── _Shiftable.js │ │ │ │ ├── _Subview.js │ │ │ │ ├── _Trashable.js │ │ │ │ └── _loader.js │ │ │ ├── backbone.js │ │ │ ├── jquery.js │ │ │ ├── main.js │ │ │ ├── underscore.js │ │ │ └── vendor/ │ │ │ ├── almond.js │ │ │ ├── backbone.collectionView.js │ │ │ ├── backbone.trackit.js │ │ │ └── wp-hooks.js │ │ ├── llms-admin-forms.js │ │ ├── llms-admin-media-protection-attachment-settings.js │ │ ├── llms-admin-settings.js │ │ ├── llms-admin-tables.js │ │ ├── llms-admin-wizard.js │ │ ├── llms-admin.js │ │ ├── llms-ajax.js │ │ ├── llms-analytics.js │ │ ├── llms-favorites.js │ │ ├── llms-focus-mode.js │ │ ├── llms-form-checkout.js │ │ ├── llms-launch-course-button.js │ │ ├── llms-metabox-achievement.js │ │ ├── llms-metabox-certificate.js │ │ ├── llms-metabox-fields.js │ │ ├── llms-metabox-instructors.js │ │ ├── llms-metabox-options.js │ │ ├── llms-metabox-product.js │ │ ├── llms-metabox-students.js │ │ ├── llms-metabox-voucher.js │ │ ├── llms-notifications.js │ │ ├── llms-quiz-attempt-review.js │ │ ├── llms-quiz.js │ │ ├── llms-view-manager.js │ │ ├── llms-widget-syllabus.js │ │ ├── partials/ │ │ │ └── _metabox-field-repeater.js │ │ ├── private/ │ │ │ ├── llms-metaboxes.js │ │ │ └── llms.js │ │ └── vendor/ │ │ ├── jquery.matchHeight.js │ │ └── js.cookie.js │ ├── scss/ │ │ ├── _includes/ │ │ │ ├── _buttons.scss │ │ │ ├── _extends.scss │ │ │ ├── _grid.scss │ │ │ ├── _llms-donut.scss │ │ │ ├── _llms-form-field.scss │ │ │ ├── _mixins.scss │ │ │ ├── _quiz-result-question-list.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _vars-brand-colors.scss │ │ │ ├── _vars.scss │ │ │ └── vendor/ │ │ │ └── _font-awesome.scss │ │ ├── admin/ │ │ │ ├── _course-builder.scss │ │ │ ├── _dashboard-widget.scss │ │ │ ├── _dashboard.scss │ │ │ ├── _fonts.scss │ │ │ ├── _llms-table.scss │ │ │ ├── _main.scss │ │ │ ├── _media-protection.scss │ │ │ ├── _quiz-attempt-review.scss │ │ │ ├── _reporting.scss │ │ │ ├── _resources.scss │ │ │ ├── _settings.scss │ │ │ ├── _tabs.scss │ │ │ ├── _wp-menu.scss │ │ │ ├── breakpoints/ │ │ │ │ ├── _1030up.scss │ │ │ │ ├── _1240up.scss │ │ │ │ ├── _481up.scss │ │ │ │ ├── _768up.scss │ │ │ │ └── _base.scss │ │ │ ├── metaboxes/ │ │ │ │ ├── _builder-launcher.scss │ │ │ │ ├── _llms-metabox.scss │ │ │ │ ├── _metabox-engagements-type.scss │ │ │ │ ├── _metabox-field-repeater.scss │ │ │ │ ├── _metabox-instructors.scss │ │ │ │ ├── _metabox-orders.scss │ │ │ │ ├── _metabox-product.scss │ │ │ │ └── _metabox-students.scss │ │ │ ├── modules/ │ │ │ │ ├── _forms.scss │ │ │ │ ├── _icons.scss │ │ │ │ ├── _llms-order-note.scss │ │ │ │ ├── _mb-tabs.scss │ │ │ │ ├── _merge-codes.scss │ │ │ │ ├── _top-modal.scss │ │ │ │ ├── _voucher.scss │ │ │ │ └── _widgets.scss │ │ │ ├── partials/ │ │ │ │ └── _grid.scss │ │ │ └── post-tables/ │ │ │ ├── _llms_orders.scss │ │ │ └── _post-tables.scss │ │ ├── admin-importer.scss │ │ ├── admin-wizard.scss │ │ ├── admin.scss │ │ ├── builder.scss │ │ ├── certificates.scss │ │ ├── editor.scss │ │ ├── frontend/ │ │ │ ├── _checkout.scss │ │ │ ├── _course.scss │ │ │ ├── _focus-mode.scss │ │ │ ├── _llms-access-plans.scss │ │ │ ├── _llms-achievements-certs.scss │ │ │ ├── _llms-author.scss │ │ │ ├── _llms-notifications.scss │ │ │ ├── _llms-outline-collapse.scss │ │ │ ├── _llms-pagination.scss │ │ │ ├── _llms-progress.scss │ │ │ ├── _llms-quizzes.scss │ │ │ ├── _llms-table.scss │ │ │ ├── _loop.scss │ │ │ ├── _main.scss │ │ │ ├── _notices.scss │ │ │ ├── _reviews.scss │ │ │ ├── _student-dashboard.scss │ │ │ ├── _syllabus.scss │ │ │ ├── _tooltip.scss │ │ │ └── _voucher.scss │ │ ├── lifterlms.scss │ │ └── llms-focus-mode.scss │ └── vendor/ │ ├── a11y-dialog/ │ │ └── LICENSE │ ├── datetimepicker/ │ │ └── jquery.datetimepicker.full.js │ ├── izimodal/ │ │ ├── iziModal.css │ │ └── iziModal.js │ ├── jquery-ui-flick/ │ │ └── jquery-ui-flick.css │ ├── quill/ │ │ ├── quill.bubble.css │ │ ├── quill.js │ │ ├── quill.js.LICENSE.txt │ │ └── quill.module.wordcount.js │ ├── select2/ │ │ ├── css/ │ │ │ └── select2.css │ │ └── js/ │ │ └── select2.js │ └── webui-popover/ │ ├── jquery.webui-popover.css │ └── jquery.webui-popover.js ├── babel.config.js ├── class-lifterlms.php ├── composer.json ├── docker-compose.yml ├── docs/ │ ├── block-development.md │ ├── coding-standards.md │ ├── contributing.md │ ├── documentation-standards.md │ ├── e2e-tests-real.md │ └── installing.md ├── gulpfile.js/ │ ├── index.js │ └── tasks/ │ ├── hacky-clean.js │ ├── js-additional.js │ └── js-builder.js ├── includes/ │ ├── abstracts/ │ │ ├── abstract.llms.admin.metabox.php │ │ ├── abstract.llms.admin.table.php │ │ ├── abstract.llms.analytics.widget.php │ │ ├── abstract.llms.database.query.php │ │ ├── abstract.llms.payment.gateway.php │ │ ├── abstract.llms.post.model.php │ │ ├── abstract.llms.shortcode.course.element.php │ │ ├── abstract.llms.shortcode.php │ │ ├── abstract.llms.update.php │ │ ├── index.php │ │ ├── llms-abstract-admin-tool.php │ │ ├── llms-abstract-admin-wizard.php │ │ ├── llms-abstract-controller-user-engagements.php │ │ ├── llms-abstract-email-provider.php │ │ ├── llms-abstract-generator-posts.php │ │ ├── llms-abstract-meta-box-user-engagement-sync.php │ │ ├── llms-abstract-posts-query.php │ │ ├── llms-abstract-processor-user-engagement-sync.php │ │ ├── llms-abstract-query.php │ │ ├── llms-abstract-session-data.php │ │ ├── llms-abstract-session-database-handler.php │ │ ├── llms-abstract-user-engagement.php │ │ ├── llms.abstract.api.handler.php │ │ ├── llms.abstract.database.store.php │ │ ├── llms.abstract.exportable.admin.table.php │ │ ├── llms.abstract.integration.php │ │ ├── llms.abstract.notification.controller.php │ │ ├── llms.abstract.notification.processor.php │ │ ├── llms.abstract.notification.view.php │ │ ├── llms.abstract.notification.view.quiz.completion.php │ │ ├── llms.abstract.options.data.php │ │ ├── llms.abstract.post.data.php │ │ ├── llms.abstract.privacy.php │ │ ├── llms.abstract.processor.php │ │ └── llms.abstract.user.data.php │ ├── achievements/ │ │ ├── class.llms.achievement.user.php │ │ └── index.php │ ├── admin/ │ │ ├── class-llms-admin-events-promo.php │ │ ├── class-llms-admin-export-download.php │ │ ├── class-llms-admin-header.php │ │ ├── class-llms-admin-media-protection-attachment-settings.php │ │ ├── class-llms-admin-permalinks.php │ │ ├── class-llms-admin-plugins.php │ │ ├── class-llms-admin-profile.php │ │ ├── class-llms-admin-review.php │ │ ├── class-llms-admin-users-table.php │ │ ├── class-llms-export-api.php │ │ ├── class-llms-mailhawk.php │ │ ├── class-llms-sendwp.php │ │ ├── class.llms.admin.addons.php │ │ ├── class.llms.admin.assets.php │ │ ├── class.llms.admin.builder.php │ │ ├── class.llms.admin.dashboard-widget.php │ │ ├── class.llms.admin.dashboard.php │ │ ├── class.llms.admin.import.php │ │ ├── class.llms.admin.menus.php │ │ ├── class.llms.admin.notices.core.php │ │ ├── class.llms.admin.notices.php │ │ ├── class.llms.admin.page.status.php │ │ ├── class.llms.admin.post-types.php │ │ ├── class.llms.admin.resources.php │ │ ├── class.llms.admin.reviews.php │ │ ├── class.llms.admin.settings.php │ │ ├── class.llms.admin.setup.wizard.php │ │ ├── class.llms.admin.system-report.php │ │ ├── class.llms.admin.user.custom.fields.php │ │ ├── class.llms.student.bulk.enroll.php │ │ ├── index.php │ │ ├── llms.functions.admin.php │ │ ├── post-types/ │ │ │ ├── class.llms.meta.boxes.php │ │ │ ├── class.llms.post.tables.php │ │ │ ├── index.php │ │ │ ├── meta-boxes/ │ │ │ │ ├── class-llms-meta-box-achievement-sync.php │ │ │ │ ├── class-llms-meta-box-certificate-sync.php │ │ │ │ ├── class.llms.meta.box.access.php │ │ │ │ ├── class.llms.meta.box.achievement.php │ │ │ │ ├── class.llms.meta.box.award.engagement.submit.php │ │ │ │ ├── class.llms.meta.box.certificate.php │ │ │ │ ├── class.llms.meta.box.coupon.php │ │ │ │ ├── class.llms.meta.box.course.builder.php │ │ │ │ ├── class.llms.meta.box.course.options.php │ │ │ │ ├── class.llms.meta.box.course.short.description.php │ │ │ │ ├── class.llms.meta.box.email.settings.php │ │ │ │ ├── class.llms.meta.box.engagement.php │ │ │ │ ├── class.llms.meta.box.lesson.php │ │ │ │ ├── class.llms.meta.box.membership.php │ │ │ │ ├── class.llms.meta.box.order.details.php │ │ │ │ ├── class.llms.meta.box.order.enrollment.php │ │ │ │ ├── class.llms.meta.box.order.notes.php │ │ │ │ ├── class.llms.meta.box.order.submit.php │ │ │ │ ├── class.llms.meta.box.order.transactions.php │ │ │ │ ├── class.llms.meta.box.product.php │ │ │ │ ├── class.llms.meta.box.students.php │ │ │ │ ├── class.llms.meta.box.visibility.php │ │ │ │ ├── class.llms.meta.box.voucher.export.php │ │ │ │ ├── class.llms.meta.box.voucher.php │ │ │ │ ├── fields/ │ │ │ │ │ ├── index.php │ │ │ │ │ ├── llms.class.meta.box.basic.editor.php │ │ │ │ │ ├── llms.class.meta.box.button.php │ │ │ │ │ ├── llms.class.meta.box.checkbox.php │ │ │ │ │ ├── llms.class.meta.box.color.php │ │ │ │ │ ├── llms.class.meta.box.custom.html.php │ │ │ │ │ ├── llms.class.meta.box.date.php │ │ │ │ │ ├── llms.class.meta.box.editor.php │ │ │ │ │ ├── llms.class.meta.box.fields.php │ │ │ │ │ ├── llms.class.meta.box.hidden.php │ │ │ │ │ ├── llms.class.meta.box.image.php │ │ │ │ │ ├── llms.class.meta.box.number.php │ │ │ │ │ ├── llms.class.meta.box.post.content.php │ │ │ │ │ ├── llms.class.meta.box.post.excerpt.php │ │ │ │ │ ├── llms.class.meta.box.repeater.php │ │ │ │ │ ├── llms.class.meta.box.search.php │ │ │ │ │ ├── llms.class.meta.box.select.php │ │ │ │ │ ├── llms.class.meta.box.table.php │ │ │ │ │ ├── llms.class.meta.box.text.php │ │ │ │ │ ├── llms.class.meta.box.textarea.php │ │ │ │ │ ├── llms.class.meta.box.textarea.tags.php │ │ │ │ │ └── llms.interface.meta.box.field.php │ │ │ │ └── index.php │ │ │ ├── post-tables/ │ │ │ │ ├── class-llms-admin-post-table-achievements.php │ │ │ │ ├── class-llms-admin-post-table-awards.php │ │ │ │ ├── class-llms-admin-post-table-certificates.php │ │ │ │ ├── class-llms-admin-post-table-forms.php │ │ │ │ ├── class.llms.admin.post.table.coupons.php │ │ │ │ ├── class.llms.admin.post.table.courses.php │ │ │ │ ├── class.llms.admin.post.table.engagements.php │ │ │ │ ├── class.llms.admin.post.table.instructors.php │ │ │ │ ├── class.llms.admin.post.table.lessons.php │ │ │ │ ├── class.llms.admin.post.table.orders.php │ │ │ │ ├── class.llms.admin.post.table.pages.php │ │ │ │ └── index.php │ │ │ └── tables/ │ │ │ ├── class.llms.table.student.management.php │ │ │ └── index.php │ │ ├── reporting/ │ │ │ ├── class.llms.admin.reporting.php │ │ │ ├── index.php │ │ │ ├── tables/ │ │ │ │ ├── index.php │ │ │ │ ├── llms.table.achievements.php │ │ │ │ ├── llms.table.certificates.php │ │ │ │ ├── llms.table.course.students.php │ │ │ │ ├── llms.table.courses.php │ │ │ │ ├── llms.table.membership.students.php │ │ │ │ ├── llms.table.memberships.php │ │ │ │ ├── llms.table.quiz.attempts.php │ │ │ │ ├── llms.table.quiz.non.attempts.php │ │ │ │ ├── llms.table.quizzes.php │ │ │ │ ├── llms.table.student.course.php │ │ │ │ ├── llms.table.student.courses.php │ │ │ │ ├── llms.table.student.memberships.php │ │ │ │ ├── llms.table.student.quiz.attempts.php │ │ │ │ └── llms.table.students.php │ │ │ ├── tabs/ │ │ │ │ ├── class.llms.admin.reporting.tab.courses.php │ │ │ │ ├── class.llms.admin.reporting.tab.enrollments.php │ │ │ │ ├── class.llms.admin.reporting.tab.memberships.php │ │ │ │ ├── class.llms.admin.reporting.tab.quizzes.php │ │ │ │ ├── class.llms.admin.reporting.tab.sales.php │ │ │ │ ├── class.llms.admin.reporting.tab.students.php │ │ │ │ └── index.php │ │ │ └── widgets/ │ │ │ ├── class.llms.analytics.widget.ajax.php │ │ │ ├── class.llms.analytics.widget.coupons.php │ │ │ ├── class.llms.analytics.widget.coursecompletions.php │ │ │ ├── class.llms.analytics.widget.discounts.php │ │ │ ├── class.llms.analytics.widget.enrollments.php │ │ │ ├── class.llms.analytics.widget.lessoncompletions.php │ │ │ ├── class.llms.analytics.widget.refunded.php │ │ │ ├── class.llms.analytics.widget.refunds.php │ │ │ ├── class.llms.analytics.widget.registrations.php │ │ │ ├── class.llms.analytics.widget.revenue.php │ │ │ ├── class.llms.analytics.widget.sales.php │ │ │ ├── class.llms.analytics.widget.sold.php │ │ │ ├── class.llms.analytics.widget.transactions.php │ │ │ └── index.php │ │ ├── settings/ │ │ │ ├── class.llms.settings.accounts.php │ │ │ ├── class.llms.settings.checkout.php │ │ │ ├── class.llms.settings.courses.php │ │ │ ├── class.llms.settings.engagements.php │ │ │ ├── class.llms.settings.general.php │ │ │ ├── class.llms.settings.integrations.php │ │ │ ├── class.llms.settings.memberships.php │ │ │ ├── class.llms.settings.notifications.php │ │ │ ├── class.llms.settings.page.php │ │ │ ├── class.llms.settings.security.php │ │ │ ├── index.php │ │ │ └── tables/ │ │ │ ├── class.llms.table.notification.settings.php │ │ │ └── index.php │ │ ├── tools/ │ │ │ ├── class-llms-admin-tool-batch-eraser.php │ │ │ ├── class-llms-admin-tool-clear-sessions.php │ │ │ ├── class-llms-admin-tool-course-data-lock-eraser.php │ │ │ ├── class-llms-admin-tool-install-forms.php │ │ │ ├── class-llms-admin-tool-limited-billing-order-locator.php │ │ │ ├── class-llms-admin-tool-recurring-payment-rescheduler.php │ │ │ ├── class-llms-admin-tool-reset-automatic-payments.php │ │ │ ├── class-llms-admin-tool-wipe-legacy-account-options.php │ │ │ └── index.php │ │ └── views/ │ │ ├── access-plans/ │ │ │ ├── access-plan-dialog.php │ │ │ ├── access-plan.php │ │ │ ├── index.php │ │ │ └── metabox.php │ │ ├── addons/ │ │ │ ├── addon-item.php │ │ │ └── index.php │ │ ├── builder/ │ │ │ ├── assignment.php │ │ │ ├── course.php │ │ │ ├── editor.php │ │ │ ├── elements.php │ │ │ ├── index.php │ │ │ ├── lesson-settings.php │ │ │ ├── lesson.php │ │ │ ├── question-choice.php │ │ │ ├── question-type.php │ │ │ ├── question.php │ │ │ ├── quiz.php │ │ │ ├── section.php │ │ │ ├── settings-fields.php │ │ │ ├── sidebar.php │ │ │ └── utilities.php │ │ ├── dashboard/ │ │ │ ├── addons.php │ │ │ ├── blog.php │ │ │ ├── index.php │ │ │ ├── podcast.php │ │ │ └── quick-links.php │ │ ├── dashboard.php │ │ ├── import/ │ │ │ ├── help-sidebar.php │ │ │ ├── help-tab-overview.php │ │ │ └── index.php │ │ ├── import.php │ │ ├── importable-course.php │ │ ├── importable-courses.php │ │ ├── index.php │ │ ├── merge-code-button.php │ │ ├── metaboxes/ │ │ │ ├── index.php │ │ │ ├── view-award-engagement-submit.php │ │ │ ├── view-order-details.php │ │ │ └── view-order-submit.php │ │ ├── notices/ │ │ │ ├── db-update.php │ │ │ ├── index.php │ │ │ └── review-request.php │ │ ├── reporting/ │ │ │ ├── index.php │ │ │ └── widget.php │ │ ├── resources/ │ │ │ ├── getting-started.php │ │ │ ├── index.php │ │ │ ├── resource-links.php │ │ │ └── welcome-video.php │ │ ├── resources.php │ │ ├── settings.php │ │ ├── setup-wizard/ │ │ │ ├── index.php │ │ │ ├── main.php │ │ │ ├── step-coupon.php │ │ │ ├── step-finish.php │ │ │ ├── step-intro.php │ │ │ ├── step-pages.php │ │ │ └── step-payments.php │ │ ├── status/ │ │ │ ├── index.php │ │ │ └── view-log.php │ │ └── user-edit-fields.php │ ├── assets/ │ │ ├── index.php │ │ ├── llms-assets-scripts.php │ │ └── llms-assets-styles.php │ ├── beaver-builder/ │ │ ├── index.php │ │ ├── modules/ │ │ │ ├── course-author/ │ │ │ │ ├── class.llms.lab.course.author.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ ├── course-continue-button/ │ │ │ │ ├── class.llms.lab.course.continue.button.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ ├── course-instructors/ │ │ │ │ ├── class.llms.lab.course.instructors.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ ├── course-meta-info/ │ │ │ │ ├── class.llms.lab.course.meta.info.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ ├── course-progress-bar/ │ │ │ │ ├── class.llms.lab.course.progress.bar.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ ├── course-syllabus/ │ │ │ │ ├── class.llms.lab.course.syllabus.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ ├── index.php │ │ │ ├── lesson-mark-complete/ │ │ │ │ ├── class.llms.lab.lesson.mark.complete.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ ├── membership-instructors/ │ │ │ │ ├── class.llms.lab.membership.instructors.module.php │ │ │ │ ├── includes/ │ │ │ │ │ ├── frontend.php │ │ │ │ │ └── index.php │ │ │ │ └── index.php │ │ │ └── pricing-table/ │ │ │ ├── class.llms.lab.pricing.table.module.php │ │ │ ├── includes/ │ │ │ │ ├── frontend.php │ │ │ │ └── index.php │ │ │ ├── index.php │ │ │ └── js/ │ │ │ └── frontend.js │ │ └── templates/ │ │ └── index.php │ ├── bricks/ │ │ ├── class-llms-bricks-element-course-author.php │ │ ├── class-llms-bricks-element-course-continue.php │ │ ├── class-llms-bricks-element-course-information.php │ │ ├── class-llms-bricks-element-course-meta-info.php │ │ ├── class-llms-bricks-element-course-progress.php │ │ ├── class-llms-bricks-element-course-syllabus.php │ │ ├── class-llms-bricks-element-instructors.php │ │ ├── class-llms-bricks-element-lesson-progression.php │ │ └── class-llms-bricks-element-pricing-table.php │ ├── certificates/ │ │ ├── class.llms.certificate.user.php │ │ └── index.php │ ├── class-llms-assets.php │ ├── class-llms-awards-query.php │ ├── class-llms-beaver-builder-migrate.php │ ├── class-llms-beaver-builder.php │ ├── class-llms-block-library.php │ ├── class-llms-block-templates.php │ ├── class-llms-bricks.php │ ├── class-llms-course-completion-page.php │ ├── class-llms-db-ugrader.php │ ├── class-llms-dom-document.php │ ├── class-llms-elementor-migrate.php │ ├── class-llms-engagement-handler.php │ ├── class-llms-events-core.php │ ├── class-llms-events-query.php │ ├── class-llms-events.php │ ├── class-llms-generator-courses.php │ ├── class-llms-grades.php │ ├── class-llms-loader.php │ ├── class-llms-media-protector.php │ ├── class-llms-mime-type-extractor.php │ ├── class-llms-order-generator.php │ ├── class-llms-prevent-concurrent-logins.php │ ├── class-llms-rest-fields.php │ ├── class-llms-sessions.php │ ├── class-llms-staging.php │ ├── class.llms.achievement.php │ ├── class.llms.achievements.php │ ├── class.llms.ajax.handler.php │ ├── class.llms.ajax.php │ ├── class.llms.background.updater.php │ ├── class.llms.cache.helper.php │ ├── class.llms.certificate.php │ ├── class.llms.certificates.php │ ├── class.llms.comments.php │ ├── class.llms.course.data.php │ ├── class.llms.data.php │ ├── class.llms.date.php │ ├── class.llms.dot.com.api.php │ ├── class.llms.emails.php │ ├── class.llms.engagements.php │ ├── class.llms.frontend.assets.php │ ├── class.llms.gateway.manual.php │ ├── class.llms.generator.php │ ├── class.llms.hasher.php │ ├── class.llms.https.php │ ├── class.llms.install.php │ ├── class.llms.integrations.php │ ├── class.llms.l10n.php │ ├── class.llms.lesson.handler.php │ ├── class.llms.membership.data.php │ ├── class.llms.nav.menus.php │ ├── class.llms.oembed.php │ ├── class.llms.payment.gateways.php │ ├── class.llms.person.handler.php │ ├── class.llms.playnice.php │ ├── class.llms.post-types.php │ ├── class.llms.post.handler.php │ ├── class.llms.post.relationships.php │ ├── class.llms.query.php │ ├── class.llms.query.quiz.attempt.php │ ├── class.llms.query.user.postmeta.php │ ├── class.llms.question.manager.php │ ├── class.llms.question.types.php │ ├── class.llms.quiz.data.php │ ├── class.llms.review.php │ ├── class.llms.roles.php │ ├── class.llms.session.php │ ├── class.llms.sidebars.php │ ├── class.llms.site.php │ ├── class.llms.student.dashboard.php │ ├── class.llms.student.query.php │ ├── class.llms.template.loader.php │ ├── class.llms.track.php │ ├── class.llms.tracker.php │ ├── class.llms.user.permissions.php │ ├── class.llms.view.manager.php │ ├── class.llms.voucher.php │ ├── controllers/ │ │ ├── class-llms-controller-awards.php │ │ ├── class-llms-controller-checkout.php │ │ ├── class.llms.controller.achievements.php │ │ ├── class.llms.controller.admin.quiz.attempts.php │ │ ├── class.llms.controller.certificates.php │ │ ├── class.llms.controller.lesson.progression.php │ │ ├── class.llms.controller.orders.php │ │ ├── class.llms.controller.quizzes.php │ │ └── index.php │ ├── elementor/ │ │ ├── class-llms-elementor-widget-base.php │ │ ├── class-llms-elementor-widget-course-continue-button.php │ │ ├── class-llms-elementor-widget-course-instructors.php │ │ ├── class-llms-elementor-widget-course-meta-info.php │ │ ├── class-llms-elementor-widget-course-progress.php │ │ ├── class-llms-elementor-widget-course-syllabus.php │ │ ├── class-llms-elementor-widget-pricing-table.php │ │ └── class-llms-elementor-widgets.php │ ├── emails/ │ │ ├── class.llms.email.engagement.php │ │ ├── class.llms.email.php │ │ ├── class.llms.email.reset.password.php │ │ └── index.php │ ├── forms/ │ │ ├── class-llms-form-field.php │ │ ├── class-llms-form-handler.php │ │ ├── class-llms-form-post-type.php │ │ ├── class-llms-form-templates.php │ │ ├── class-llms-form-validator.php │ │ ├── class-llms-forms-admin-bar.php │ │ ├── class-llms-forms-classic-editor.php │ │ ├── class-llms-forms-data.php │ │ ├── class-llms-forms-dynamic-fields.php │ │ ├── class-llms-forms-unsupported-versions.php │ │ ├── class-llms-forms.php │ │ ├── controllers/ │ │ │ ├── class.llms.controller.account.php │ │ │ ├── class.llms.controller.login.php │ │ │ ├── class.llms.controller.registration.php │ │ │ └── index.php │ │ └── index.php │ ├── functions/ │ │ ├── index.php │ │ ├── llms-functions-access-plans.php │ │ ├── llms-functions-conditional-tags.php │ │ ├── llms-functions-content.php │ │ ├── llms-functions-deprecated.php │ │ ├── llms-functions-forms.php │ │ ├── llms-functions-l10n.php │ │ ├── llms-functions-locale.php │ │ ├── llms-functions-options.php │ │ ├── llms-functions-progression.php │ │ ├── llms-functions-template-view-order.php │ │ ├── llms-functions-templates-courses.php │ │ ├── llms-functions-templates-memberships.php │ │ ├── llms-functions-templates-shared.php │ │ ├── llms-functions-user-information-fields.php │ │ ├── llms-functions-wrappers.php │ │ ├── llms.functions.access.php │ │ ├── llms.functions.certificate.php │ │ ├── llms.functions.course.php │ │ ├── llms.functions.currency.php │ │ ├── llms.functions.favorite.php │ │ ├── llms.functions.log.php │ │ ├── llms.functions.notice.php │ │ ├── llms.functions.order.php │ │ ├── llms.functions.page.php │ │ ├── llms.functions.person.php │ │ ├── llms.functions.privacy.php │ │ ├── llms.functions.quiz.php │ │ ├── llms.functions.template.php │ │ ├── llms.functions.templates.achievements.php │ │ ├── llms.functions.templates.certificates.php │ │ ├── llms.functions.templates.dashboard.php │ │ ├── llms.functions.templates.dashboard.widgets.php │ │ ├── llms.functions.templates.loop.php │ │ ├── llms.functions.templates.pricing.table.php │ │ ├── llms.functions.templates.privacy.php │ │ ├── llms.functions.templates.quizzes.php │ │ ├── llms.functions.updates.php │ │ ├── llms.functions.user.postmeta.php │ │ └── updates/ │ │ ├── index.php │ │ ├── llms-functions-updates-300.php │ │ ├── llms-functions-updates-303.php │ │ ├── llms-functions-updates-3120.php │ │ ├── llms-functions-updates-3130.php │ │ ├── llms-functions-updates-3160.php │ │ ├── llms-functions-updates-3280.php │ │ ├── llms-functions-updates-343.php │ │ ├── llms-functions-updates-360.php │ │ ├── llms-functions-updates-380.php │ │ ├── llms-functions-updates-400.php │ │ ├── llms-functions-updates-4150.php │ │ ├── llms-functions-updates-450.php │ │ ├── llms-functions-updates-500.php │ │ ├── llms-functions-updates-520.php │ │ ├── llms-functions-updates-600.php │ │ ├── llms-functions-updates-6100.php │ │ ├── llms-functions-updates-630.php │ │ ├── llms-functions-updates-750.php │ │ ├── llms-functions-updates-780.php │ │ ├── llms-functions-updates-785.php │ │ ├── llms-functions-updates-900.php │ │ └── llms-functions-updates-921.php │ ├── index.php │ ├── integrations/ │ │ ├── class.llms.integration.bbpress.php │ │ ├── class.llms.integration.buddypress.php │ │ └── index.php │ ├── interfaces/ │ │ ├── index.php │ │ ├── interface.llms.notification.manager.php │ │ ├── llms.interface.notification.controller.php │ │ └── llms.interface.post.instructors.php │ ├── llms-notifications.php │ ├── llms.functions.core.php │ ├── llms.spam.functions.php │ ├── llms.template.functions.php │ ├── llms.template.hooks.php │ ├── models/ │ │ ├── class-llms-event.php │ │ ├── index.php │ │ ├── model.llms.access.plan.php │ │ ├── model.llms.add-on.php │ │ ├── model.llms.coupon.php │ │ ├── model.llms.course.php │ │ ├── model.llms.instructor.php │ │ ├── model.llms.lesson.php │ │ ├── model.llms.membership.php │ │ ├── model.llms.notification.php │ │ ├── model.llms.order.php │ │ ├── model.llms.post.instructors.php │ │ ├── model.llms.product.php │ │ ├── model.llms.question.choice.php │ │ ├── model.llms.question.php │ │ ├── model.llms.quiz.attempt.php │ │ ├── model.llms.quiz.attempt.question.php │ │ ├── model.llms.quiz.php │ │ ├── model.llms.section.php │ │ ├── model.llms.student.php │ │ ├── model.llms.student.quizzes.php │ │ ├── model.llms.transaction.php │ │ ├── model.llms.user.achievement.php │ │ ├── model.llms.user.certificate.php │ │ └── model.llms.user.postmeta.php │ ├── notifications/ │ │ ├── class.llms.notifications.php │ │ ├── class.llms.notifications.query.php │ │ ├── controllers/ │ │ │ ├── class.llms.notification.controller.achievement.earned.php │ │ │ ├── class.llms.notification.controller.certificate.earned.php │ │ │ ├── class.llms.notification.controller.course.complete.php │ │ │ ├── class.llms.notification.controller.course.track.complete.php │ │ │ ├── class.llms.notification.controller.enrollment.php │ │ │ ├── class.llms.notification.controller.lesson.complete.php │ │ │ ├── class.llms.notification.controller.manual.payment.due.php │ │ │ ├── class.llms.notification.controller.payment.retry.php │ │ │ ├── class.llms.notification.controller.purchase.receipt.php │ │ │ ├── class.llms.notification.controller.quiz.failed.php │ │ │ ├── class.llms.notification.controller.quiz.graded.php │ │ │ ├── class.llms.notification.controller.quiz.passed.php │ │ │ ├── class.llms.notification.controller.section.complete.php │ │ │ ├── class.llms.notification.controller.student.welcome.php │ │ │ ├── class.llms.notification.controller.subscription.cancelled.php │ │ │ ├── class.llms.notification.controller.upcoming.payment.reminder.php │ │ │ └── index.php │ │ ├── index.php │ │ ├── processors/ │ │ │ ├── class.llms.notification.processor.email.php │ │ │ └── index.php │ │ └── views/ │ │ ├── class.llms.notification.view.achievement.earned.php │ │ ├── class.llms.notification.view.certificate.earned.php │ │ ├── class.llms.notification.view.course.complete.php │ │ ├── class.llms.notification.view.course.track.complete.php │ │ ├── class.llms.notification.view.enrollment.php │ │ ├── class.llms.notification.view.lesson.complete.php │ │ ├── class.llms.notification.view.manual.payment.due.php │ │ ├── class.llms.notification.view.payment.retry.php │ │ ├── class.llms.notification.view.purchase.receipt.php │ │ ├── class.llms.notification.view.quiz.failed.php │ │ ├── class.llms.notification.view.quiz.graded.php │ │ ├── class.llms.notification.view.quiz.passed.php │ │ ├── class.llms.notification.view.section.complete.php │ │ ├── class.llms.notification.view.student.welcome.php │ │ ├── class.llms.notification.view.subscription.cancelled.php │ │ ├── class.llms.notification.view.upcoming.payment.reminder.php │ │ └── index.php │ ├── privacy/ │ │ ├── class-llms-privacy-erasers.php │ │ ├── class-llms-privacy-exporters.php │ │ ├── class-llms-privacy.php │ │ └── index.php │ ├── processors/ │ │ ├── class-llms-processor-achievement-sync.php │ │ ├── class-llms-processor-certificate-sync.php │ │ ├── class.llms.processor.course.data.php │ │ ├── class.llms.processor.membership.bulk.enroll.php │ │ ├── class.llms.processors.php │ │ └── index.php │ ├── schemas/ │ │ ├── index.php │ │ ├── llms-block-templates.php │ │ ├── llms-db-updates.php │ │ ├── llms-form-locations.php │ │ ├── llms-reusable-blocks.php │ │ └── llms-user-information-fields.php │ ├── shortcodes/ │ │ ├── class-llms-shortcode-user-info.php │ │ ├── class.llms.bbp.shortcode.course.forums.list.php │ │ ├── class.llms.shortcode.checkout.php │ │ ├── class.llms.shortcode.course.author.php │ │ ├── class.llms.shortcode.course.continue.button.php │ │ ├── class.llms.shortcode.course.continue.php │ │ ├── class.llms.shortcode.course.instructors.php │ │ ├── class.llms.shortcode.course.meta.info.php │ │ ├── class.llms.shortcode.course.outline.php │ │ ├── class.llms.shortcode.course.prerequisites.php │ │ ├── class.llms.shortcode.course.reviews.php │ │ ├── class.llms.shortcode.course.syllabus.php │ │ ├── class.llms.shortcode.courses.php │ │ ├── class.llms.shortcode.favorites.php │ │ ├── class.llms.shortcode.hide.content.php │ │ ├── class.llms.shortcode.lesson.mark.complete.php │ │ ├── class.llms.shortcode.lesson.navigation.php │ │ ├── class.llms.shortcode.membership.instructors.php │ │ ├── class.llms.shortcode.membership.link.php │ │ ├── class.llms.shortcode.my.account.php │ │ ├── class.llms.shortcode.my.achievements.php │ │ ├── class.llms.shortcode.registration.php │ │ ├── class.llms.shortcodes.blocks.php │ │ ├── class.llms.shortcodes.php │ │ └── index.php │ ├── spam/ │ │ ├── class-llms-akismet.php │ │ ├── class-llms-captcha.php │ │ ├── class-llms-recaptcha.php │ │ └── class-llms-turnstile.php │ ├── theme-support/ │ │ ├── class-llms-theme-support.php │ │ ├── class-llms-twenty-nineteen.php │ │ ├── class-llms-twenty-twenty-one.php │ │ ├── class-llms-twenty-twenty-two.php │ │ ├── class-llms-twenty-twenty.php │ │ └── index.php │ ├── traits/ │ │ ├── llms-trait-audio-video-embed.php │ │ ├── llms-trait-award-default-images.php │ │ ├── llms-trait-award-templates-post-list-table.php │ │ ├── llms-trait-earned-engagement-reporting-table.php │ │ ├── llms-trait-sales-page.php │ │ ├── llms-trait-singleton.php │ │ ├── llms-trait-student-awards.php │ │ └── llms-trait-user-engagement-type.php │ └── widgets/ │ ├── class.llms.bbp.widget.course.forums.list.php │ ├── class.llms.widget.course.progress.php │ ├── class.llms.widget.course.syllabus.php │ ├── class.llms.widget.php │ ├── class.llms.widgets.php │ └── index.php ├── index.php ├── languages/ │ ├── README.md │ ├── countries-address-info.php │ ├── countries.php │ ├── currencies.php │ ├── currency-symbols.php │ └── states.php ├── lerna.json ├── libraries/ │ ├── README.md │ └── index.php ├── lifterlms.php ├── package.json ├── packages/ │ ├── README.md │ ├── brand/ │ │ ├── README.md │ │ ├── package.json │ │ └── sass/ │ │ ├── brand.scss │ │ ├── colors.scss │ │ └── typography.scss │ ├── components/ │ │ ├── .llmsdev.yml │ │ ├── .npmrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── package.json │ │ └── src/ │ │ ├── button-group-control/ │ │ │ ├── index.js │ │ │ └── test/ │ │ │ └── index.js │ │ ├── copy-button/ │ │ │ └── index.js │ │ ├── index.js │ │ ├── post-select/ │ │ │ └── index.js │ │ ├── search-control/ │ │ │ ├── base-search-control.js │ │ │ ├── defaults.js │ │ │ ├── index.js │ │ │ ├── post-search-control.js │ │ │ ├── styled-base-control.js │ │ │ └── user-search-control.js │ │ └── spinner/ │ │ ├── .eslintrc.js │ │ ├── constants.js │ │ ├── index.js │ │ ├── styles.js │ │ ├── test/ │ │ │ ├── __MOCKS__/ │ │ │ │ └── jquery.js │ │ │ ├── __snapshots__/ │ │ │ │ ├── index.test.js.snap │ │ │ │ └── utils.test.js.snap │ │ │ ├── index.test.js │ │ │ └── utils.test.js │ │ └── utils.js │ ├── dev/ │ │ ├── .llmsdev.yml │ │ ├── .npmrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── .eslintrc.js │ │ │ ├── cmds/ │ │ │ │ ├── changelog/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── list.js │ │ │ │ │ ├── validate.js │ │ │ │ │ ├── version.js │ │ │ │ │ └── write.js │ │ │ │ ├── docgen.js │ │ │ │ ├── meta/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── parse.js │ │ │ │ ├── pot.js │ │ │ │ ├── readme.js │ │ │ │ ├── release/ │ │ │ │ │ ├── archive.js │ │ │ │ │ ├── create.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── prepare.js │ │ │ │ └── update-version.js │ │ │ ├── index.js │ │ │ └── utils/ │ │ │ ├── changelog-entry.js │ │ │ ├── configs.js │ │ │ ├── create-dist-file.js │ │ │ ├── determine-version-increment.js │ │ │ ├── exec-sync.js │ │ │ ├── get-archive-filename.js │ │ │ ├── get-changelog-entries.js │ │ │ ├── get-changelog-for-version.js │ │ │ ├── get-changelog-options.js │ │ │ ├── get-current-version.js │ │ │ ├── get-default.js │ │ │ ├── get-next-version.js │ │ │ ├── get-project-privacy.js │ │ │ ├── get-project-slug.js │ │ │ ├── index.js │ │ │ ├── log-result.js │ │ │ ├── pare-main-file-metadata.js │ │ │ ├── parse-changelog-file.js │ │ │ ├── parse-issue-string.js │ │ │ ├── push-dist-file.js │ │ │ ├── repo-links.js │ │ │ └── validate-changelog.js │ │ └── test/ │ │ └── utils/ │ │ ├── configs.test.js │ │ ├── determine-version-increment.test.js │ │ ├── exec-sync.test.js │ │ ├── get-archive-filename.test.js │ │ ├── get-changelog-for-version.test.js │ │ ├── get-next-version.test.js │ │ ├── get-project-privacy.test.js │ │ ├── get-project-slug.test.js │ │ ├── parse-changelog-file.test.js │ │ ├── parse-issue-string.test.js │ │ ├── repo-links.test.js │ │ └── validate-changelog.test.js │ ├── fontawesome/ │ │ ├── .eslintrc.js │ │ ├── .npmrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── bin/ │ │ │ ├── .eslintrc.js │ │ │ ├── metadata.js │ │ │ └── svg.js │ │ ├── package.json │ │ └── src/ │ │ ├── components/ │ │ │ ├── icon-list.js │ │ │ ├── icon-picker.js │ │ │ └── icon.js │ │ ├── fontawesome.scss │ │ ├── index.js │ │ └── metadata.json │ ├── icons/ │ │ ├── .eslintrc.js │ │ ├── .llmsdev.yml │ │ ├── .npmrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── docs/ │ │ │ ├── app.js │ │ │ ├── generate.js │ │ │ └── index.html │ │ ├── package.json │ │ └── src/ │ │ ├── index.js │ │ └── lifterlms.js │ ├── llms-e2e-test-utils/ │ │ ├── .eslintrc.js │ │ ├── .llmsdev.yml │ │ ├── .npmrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── package.json │ │ └── src/ │ │ ├── .eslintrc.js │ │ ├── activate-theme.js │ │ ├── clear-blocks.js │ │ ├── click-and-wait.js │ │ ├── click-element-by-text.js │ │ ├── click.js │ │ ├── create-access-plan.js │ │ ├── create-certificate.js │ │ ├── create-coupon.js │ │ ├── create-course.js │ │ ├── create-engagement.js │ │ ├── create-membership.js │ │ ├── create-post.js │ │ ├── create-user.js │ │ ├── create-voucher.js │ │ ├── dismiss-editor-welcome-guide.js │ │ ├── enroll-student.js │ │ ├── fill-field.js │ │ ├── find-element-by-text.js │ │ ├── get-all-blocks.js │ │ ├── get-post-title.js │ │ ├── get-wp-version.js │ │ ├── highlight-node.js │ │ ├── import-course.js │ │ ├── index.js │ │ ├── login-student.js │ │ ├── logout-user.js │ │ ├── open-sidebar-panel-tab.js │ │ ├── publish-post.js │ │ ├── register-student.js │ │ ├── run-setup-wizard.js │ │ ├── select2-select.js │ │ ├── set-checkbox-setting.js │ │ ├── set-select2-option.js │ │ ├── toggle-open-registration.js │ │ ├── toggle-sidebar-panel.js │ │ ├── update-post.js │ │ ├── visit-page.js │ │ ├── visit-post-permalink.js │ │ ├── visit-settings-page.js │ │ └── wp-version-compare.js │ ├── quill-wordcount-module/ │ │ ├── .eslintrc.js │ │ ├── .npmrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── package.json │ │ └── src/ │ │ ├── create-container.js │ │ ├── format-number.js │ │ ├── get-counter-text-color.js │ │ ├── index.js │ │ ├── module.js │ │ └── test/ │ │ ├── __snapshots__/ │ │ │ ├── create-container.test.js.snap │ │ │ └── module.test.js.snap │ │ ├── create-container.test.js │ │ ├── format-number.test.js │ │ ├── get-counter-text-color.js │ │ ├── index.test.js │ │ └── module.test.js │ ├── scripts/ │ │ ├── .eslintrc.js │ │ ├── .llmsdev.yml │ │ ├── .npmrc │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── config/ │ │ │ ├── .eslintrc.js │ │ │ ├── blocks-webpack.config.js │ │ │ ├── import-resolver.js │ │ │ ├── jest-unit.config.js │ │ │ └── webpack.config.js │ │ ├── e2e/ │ │ │ ├── bootstrap.js │ │ │ ├── jest-puppeteer.config.js │ │ │ ├── jest.config.js │ │ │ └── sequencer.js │ │ └── package.json │ └── utils/ │ ├── .llmsdev.yml │ ├── .npmrc │ ├── CHANGELOG.md │ ├── README.md │ ├── babel.config.js │ ├── package.json │ └── src/ │ ├── formatting/ │ │ ├── index.js │ │ ├── test/ │ │ │ └── index.js │ │ ├── trailing-slash-it.js │ │ └── untrailing-slash-it.js │ ├── index.js │ └── url/ │ ├── get-admin-url.js │ ├── index.js │ └── test/ │ └── get-admin-url.test.js ├── phpcs.xml ├── phpmd.xml ├── phpunit.xml.dist ├── sample-data/ │ ├── index.php │ └── sample-course.json ├── src/ │ ├── blocks/ │ │ ├── access-plan-button/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── certificate-title/ │ │ │ ├── block.json │ │ │ ├── edit.jsx │ │ │ ├── icon.jsx │ │ │ ├── index.jsx │ │ │ └── save.jsx │ │ ├── checkout/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── course-author/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── course-continue/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── course-meta-info/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── course-outline/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── course-prerequisites/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── course-reviews/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── course-syllabus/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── courses/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── login/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── memberships/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── my-account/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── my-achievements/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── navigation-link/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ ├── pricing-table/ │ │ │ ├── block.json │ │ │ ├── icon.jsx │ │ │ └── index.jsx │ │ └── registration/ │ │ ├── block.json │ │ ├── icon.jsx │ │ └── index.jsx │ ├── js/ │ │ ├── .eslintrc.js │ │ ├── admin-addons.js │ │ ├── admin-award-certificate.js │ │ ├── admin-certificate-editor/ │ │ │ ├── document-settings.js │ │ │ ├── edit-certificate.js │ │ │ ├── editor.js │ │ │ ├── i18n.js │ │ │ ├── index.js │ │ │ ├── merge-codes.js │ │ │ ├── migrate.js │ │ │ ├── modify-blocks.js │ │ │ ├── notices.js │ │ │ ├── plugin/ │ │ │ │ ├── background-control.js │ │ │ │ ├── margins-control.js │ │ │ │ ├── orientation-control.js │ │ │ │ ├── sequential-id-control.js │ │ │ │ ├── size-control.js │ │ │ │ └── title-control.js │ │ │ ├── post-status-info/ │ │ │ │ ├── award-button.js │ │ │ │ ├── award-check.js │ │ │ │ ├── index.js │ │ │ │ ├── reset-template-button.js │ │ │ │ └── reset-template-check.js │ │ │ └── user-settings.js │ │ ├── admin-certificate-editor.js │ │ ├── admin-elementor-editor.js │ │ ├── admin-media-protection-block-protect.js │ │ ├── components.js │ │ ├── icons.js │ │ ├── quill-wordcount.js │ │ ├── spinner.js │ │ ├── util/ │ │ │ ├── README.md │ │ │ ├── award-certificate-button/ │ │ │ │ ├── create.js │ │ │ │ ├── index.js │ │ │ │ ├── message.js │ │ │ │ ├── test/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.js.snap │ │ │ │ │ └── index.js │ │ │ │ └── urls.js │ │ │ ├── edit-certificate-title.js │ │ │ └── index.js │ │ └── utils.js │ └── scss/ │ ├── admin-addons.scss │ └── fontawesome.scss ├── templates/ │ ├── achievements/ │ │ ├── loop.php │ │ └── template.php │ ├── admin/ │ │ ├── analytics/ │ │ │ └── analytics.php │ │ ├── notices/ │ │ │ └── staging.php │ │ ├── post-types/ │ │ │ ├── order-transactions.php │ │ │ └── students.php │ │ ├── reporting/ │ │ │ ├── nav-filters.php │ │ │ ├── reporting.php │ │ │ └── tabs/ │ │ │ ├── courses/ │ │ │ │ ├── course.php │ │ │ │ ├── overview.php │ │ │ │ └── students.php │ │ │ ├── memberships/ │ │ │ │ ├── membership.php │ │ │ │ ├── overview.php │ │ │ │ └── students.php │ │ │ ├── quizzes/ │ │ │ │ ├── attempt.php │ │ │ │ ├── attempts.php │ │ │ │ ├── non-attempts.php │ │ │ │ ├── overview.php │ │ │ │ └── quiz.php │ │ │ ├── students/ │ │ │ │ ├── achievements.php │ │ │ │ ├── certificates.php │ │ │ │ ├── courses-course.php │ │ │ │ ├── courses.php │ │ │ │ ├── information.php │ │ │ │ ├── memberships.php │ │ │ │ ├── quiz_attempts.php │ │ │ │ ├── student.php │ │ │ │ └── students.php │ │ │ └── widgets.php │ │ └── user-edit.php │ ├── archive-course.php │ ├── archive-llms_membership.php │ ├── block-templates/ │ │ ├── archive-course.html │ │ ├── archive-llms_membership.html │ │ ├── single-no-access.html │ │ ├── taxonomy-course_cat.html │ │ ├── taxonomy-course_difficulty.html │ │ ├── taxonomy-course_tag.html │ │ ├── taxonomy-course_track.html │ │ ├── taxonomy-membership_cat.html │ │ └── taxonomy-membership_tag.html │ ├── certificates/ │ │ ├── actions.php │ │ ├── content-legacy.php │ │ ├── content.php │ │ ├── dynamic-styles.php │ │ ├── footer.php │ │ ├── header.php │ │ ├── loop.php │ │ ├── preview.php │ │ └── template.php │ ├── checkout/ │ │ ├── form-checkout.php │ │ ├── form-confirm-payment.php │ │ ├── form-coupon.php │ │ ├── form-gateways.php │ │ ├── form-summary.php │ │ └── form-switch-source.php │ ├── content-certificate.php │ ├── content-no-access-after.php │ ├── content-no-access-before.php │ ├── content-no-access.php │ ├── content-single-course-after.php │ ├── content-single-course-before.php │ ├── content-single-lesson-after.php │ ├── content-single-lesson-before.php │ ├── content-single-membership-after.php │ ├── content-single-membership-before.php │ ├── content-single-question.php │ ├── content-single-quiz-after.php │ ├── content-single-quiz-before.php │ ├── course/ │ │ ├── audio.php │ │ ├── author.php │ │ ├── categories.php │ │ ├── complete-lesson-link.php │ │ ├── difficulty.php │ │ ├── favorite.php │ │ ├── full-description.php │ │ ├── length.php │ │ ├── lesson-count.php │ │ ├── lesson-navigation.php │ │ ├── lesson-preview.php │ │ ├── meta-wrapper-end.php │ │ ├── meta-wrapper-start.php │ │ ├── outline-list-small.php │ │ ├── parent-course.php │ │ ├── prerequisites.php │ │ ├── progress.php │ │ ├── short-description.php │ │ ├── syllabus.php │ │ ├── tags.php │ │ ├── title.php │ │ ├── tracks.php │ │ └── video.php │ ├── emails/ │ │ ├── footer.php │ │ ├── header.php │ │ ├── reset-password.php │ │ └── template.php │ ├── global/ │ │ ├── form-login.php │ │ ├── form-registration.php │ │ ├── sidebar.php │ │ ├── wrapper-end.php │ │ └── wrapper-start.php │ ├── lesson/ │ │ ├── audio.php │ │ └── video.php │ ├── loop/ │ │ ├── author.php │ │ ├── content.php │ │ ├── enroll-date.php │ │ ├── enroll-status.php │ │ ├── featured-image.php │ │ ├── featured-pricing.php │ │ ├── loop-end.php │ │ ├── loop-start.php │ │ ├── none-found.php │ │ └── pagination.php │ ├── loop-main.php │ ├── loop.php │ ├── membership/ │ │ ├── audio.php │ │ ├── full-description.php │ │ ├── instructors.php │ │ ├── price.php │ │ ├── title.php │ │ └── video.php │ ├── myaccount/ │ │ ├── dashboard-section.php │ │ ├── dashboard.php │ │ ├── form-edit-account.php │ │ ├── form-lost-password.php │ │ ├── form-redeem-voucher.php │ │ ├── header.php │ │ ├── my-favorites.php │ │ ├── my-grades-single-table.php │ │ ├── my-grades-single.php │ │ ├── my-grades.php │ │ ├── my-notifications.php │ │ ├── my-orders.php │ │ ├── navigation.php │ │ ├── view-order-actions.php │ │ ├── view-order-information.php │ │ ├── view-order-transactions.php │ │ └── view-order.php │ ├── notices/ │ │ ├── debug.php │ │ ├── error.php │ │ ├── notice.php │ │ └── success.php │ ├── notifications/ │ │ └── basic.php │ ├── product/ │ │ ├── access-plan-button.php │ │ ├── access-plan-description.php │ │ ├── access-plan-feature.php │ │ ├── access-plan-pricing.php │ │ ├── access-plan-restrictions.php │ │ ├── access-plan-title.php │ │ ├── access-plan-trial.php │ │ ├── access-plan.php │ │ ├── free-enroll-form.php │ │ ├── not-purchasable.php │ │ └── pricing-table.php │ ├── quiz/ │ │ ├── meta-information.php │ │ ├── questions/ │ │ │ ├── content-choice.php │ │ │ ├── content-picture_choice.php │ │ │ ├── content-true_false.php │ │ │ ├── description.php │ │ │ ├── image.php │ │ │ ├── video.php │ │ │ ├── wrapper-end.php │ │ │ └── wrapper-start.php │ │ ├── quiz-wrapper-end.php │ │ ├── quiz-wrapper-start.php │ │ ├── results-attempt-questions-list.php │ │ ├── results-attempt.php │ │ ├── results.php │ │ ├── return-to-lesson.php │ │ └── start-button.php │ ├── shared/ │ │ └── instructors.php │ ├── single-certificate.php │ ├── single-lesson-focus.php │ ├── single-no-access.php │ ├── taxonomy-course_cat.php │ ├── taxonomy-course_difficulty.php │ ├── taxonomy-course_tag.php │ ├── taxonomy-course_track.php │ ├── taxonomy-membership_cat.php │ └── taxonomy-membership_tag.php ├── tests/ │ ├── assets/ │ │ ├── example-style-1.css │ │ ├── example-style-2.css │ │ ├── example-style.css │ │ ├── import-error.json │ │ ├── import-fake-generator.json │ │ ├── import-with-prerequisites.json │ │ ├── import-with-quiz.json │ │ ├── import-with-restrictions.json │ │ ├── lifterlms-en_US-cd71ad734c92669051f6fd28eb90dfd4.json │ │ ├── lifterlms-en_US.mo │ │ ├── lifterlms-en_US.po │ │ └── lifterlms-mock-addon.php │ ├── bin/ │ │ └── setup-e2e.sh │ ├── e2e/ │ │ ├── README.md │ │ └── tests/ │ │ ├── activate/ │ │ │ └── bootstrap.test.js │ │ ├── checkout/ │ │ │ └── coupon.test.js │ │ ├── page-restrictions/ │ │ │ ├── course.test.js │ │ │ └── sitewide-membership.test.js │ │ ├── settings/ │ │ │ └── copy-prevention.test.js │ │ ├── student/ │ │ │ ├── __snapshots__/ │ │ │ │ ├── open-registration.test.js.snap │ │ │ │ └── voucher.test.js.snap │ │ │ ├── login.test.js │ │ │ ├── open-registration.test.js │ │ │ └── voucher.test.js │ │ └── view-manager/ │ │ ├── __snapshots__/ │ │ │ └── view-manager.test.js.snap │ │ └── view-manager.test.js │ └── phpunit/ │ ├── README.md │ ├── bootstrap.php │ ├── framework/ │ │ ├── class-llms-admin-tool-test-case.php │ │ ├── class-llms-notification-test-case.php │ │ ├── class-llms-payment-gateway-mock.php │ │ ├── class-llms-post-model-unit-test-case.php │ │ ├── class-llms-post-type-metabox-test-case.php │ │ ├── class-llms-settings-page-test-case.php │ │ ├── class-llms-shortcode-test-case.php │ │ └── class-llms-unit-test-case.php │ └── unit-tests/ │ ├── abstracts/ │ │ ├── class-llms-test-abstract-admin-metabox.php │ │ ├── class-llms-test-abstract-admin-tool.php │ │ ├── class-llms-test-abstract-database-query.php │ │ ├── class-llms-test-abstract-exportable-abmin-table.php │ │ ├── class-llms-test-abstract-generator-posts.php │ │ ├── class-llms-test-abstract-integration.php │ │ ├── class-llms-test-abstract-notification-view.php │ │ ├── class-llms-test-abstract-options-data.php │ │ ├── class-llms-test-abstract-payment-gateway.php │ │ ├── class-llms-test-abstract-post-model.php │ │ ├── class-llms-test-abstract-posts-query.php │ │ ├── class-llms-test-abstract-query.php │ │ ├── class-llms-test-abstract-session-data.php │ │ └── class-llms-test-abstract-session-database-handler.php │ ├── admin/ │ │ ├── class-llms-test-admin-assets.php │ │ ├── class-llms-test-admin-builder.php │ │ ├── class-llms-test-admin-import.php │ │ ├── class-llms-test-admin-menus.php │ │ ├── class-llms-test-admin-notices.php │ │ ├── class-llms-test-admin-page-status.php │ │ ├── class-llms-test-admin-post-types.php │ │ ├── class-llms-test-admin-profile.php │ │ ├── class-llms-test-admin-review.php │ │ ├── class-llms-test-admin-settings.php │ │ ├── class-llms-test-admin-setup-wizard.php │ │ ├── class-llms-test-admin-users-table.php │ │ ├── class-llms-test-export-api.php │ │ ├── class-llms-test-sendwp.php │ │ ├── post-types/ │ │ │ ├── class-llms-test-llms-admin-meta-boxes.php │ │ │ ├── meta-boxes/ │ │ │ │ ├── class-llms-test-meta-box-access.php │ │ │ │ ├── class-llms-test-meta-box-achievement-sync.php │ │ │ │ ├── class-llms-test-meta-box-achievement.php │ │ │ │ ├── class-llms-test-meta-box-award-engagement-submit.php │ │ │ │ ├── class-llms-test-meta-box-certificate-sync.php │ │ │ │ ├── class-llms-test-meta-box-certificate.php │ │ │ │ ├── class-llms-test-meta-box-lesson.php │ │ │ │ ├── class-llms-test-meta-box-order-details.php │ │ │ │ ├── class-llms-test-meta-box-order-enrollment.php │ │ │ │ ├── class-llms-test-meta-box-order-submit.php │ │ │ │ └── fields/ │ │ │ │ └── class-llms-test-meta-box-textarea-tags.php │ │ │ └── post-tables/ │ │ │ └── class-llms-admin-post-table-certificates.php │ │ ├── reporting/ │ │ │ ├── __snapshots__/ │ │ │ │ ├── admin-reporting-output_widget-test-a.txt │ │ │ │ ├── admin-reporting-output_widget-test-b.txt │ │ │ │ ├── admin-reporting-output_widget-test-c.txt │ │ │ │ ├── admin-reporting-output_widget-test-d.txt │ │ │ │ ├── admin-reporting-output_widget-test-e.txt │ │ │ │ ├── admin-reporting-output_widget-test-f.txt │ │ │ │ ├── admin-reporting-output_widget-test-g.txt │ │ │ │ └── admin-reporting-output_widget-test-h.txt │ │ │ └── class-llms-test-admin-reporting.php │ │ ├── settings/ │ │ │ ├── class-llms-test-settings-accounts.php │ │ │ ├── class-llms-test-settings-engagements.php │ │ │ └── class-llms-test-settings-page.php │ │ └── tools/ │ │ ├── class-llms-test-admin-tool-batch-eraser.php │ │ ├── class-llms-test-admin-tool-clear-sessions.php │ │ ├── class-llms-test-admin-tool-install-forms.php │ │ ├── class-llms-test-admin-tool-limited-billing-order-locator.php │ │ ├── class-llms-test-admin-tool-recurring-payment-rescheduler.php │ │ ├── class-llms-test-admin-tool-reset-automatic-payments.php │ │ └── class-llms-test-admin-tool-wipe-legacy-account-options.php │ ├── ajax/ │ │ ├── class-llms-test-ajax-handler-coupons.php │ │ └── class-llms-test-ajax-handler-quizzes.php │ ├── class-llms-test-admin-media-protection-attachment-settings.php │ ├── class-llms-test-ajax-handler.php │ ├── class-llms-test-assets.php │ ├── class-llms-test-awards-query.php │ ├── class-llms-test-block-library.php │ ├── class-llms-test-block-templates.php │ ├── class-llms-test-blocks.php │ ├── class-llms-test-cache-helper.php │ ├── class-llms-test-certificates.php │ ├── class-llms-test-cli.php │ ├── class-llms-test-comments.php │ ├── class-llms-test-db-upgrader.php │ ├── class-llms-test-engagement-handler.php │ ├── class-llms-test-engagements.php │ ├── class-llms-test-events-core.php │ ├── class-llms-test-events-query.php │ ├── class-llms-test-events.php │ ├── class-llms-test-frontend-assets.php │ ├── class-llms-test-functions-access.php │ ├── class-llms-test-functions-privacy.php │ ├── class-llms-test-functions-quiz.php │ ├── class-llms-test-gateway-manual.php │ ├── class-llms-test-generator-courses.php │ ├── class-llms-test-generator.php │ ├── class-llms-test-grades.php │ ├── class-llms-test-hasher.php │ ├── class-llms-test-helper.php │ ├── class-llms-test-https.php │ ├── class-llms-test-install.php │ ├── class-llms-test-integrations.php │ ├── class-llms-test-llms-dom-document.php │ ├── class-llms-test-main-class.php │ ├── class-llms-test-mime-type-extractor.php │ ├── class-llms-test-order-generator.php │ ├── class-llms-test-payment-gateway-integrations.php │ ├── class-llms-test-payment-gateways.php │ ├── class-llms-test-playnice.php │ ├── class-llms-test-post-instructors.php │ ├── class-llms-test-post-relationships.php │ ├── class-llms-test-post-types.php │ ├── class-llms-test-prevent-concurrent-logins.php │ ├── class-llms-test-query.php │ ├── class-llms-test-quiz-attempt-query.php │ ├── class-llms-test-rest-fields.php │ ├── class-llms-test-rest.php │ ├── class-llms-test-review.php │ ├── class-llms-test-roles.php │ ├── class-llms-test-session.php │ ├── class-llms-test-sessions.php │ ├── class-llms-test-shortcodes.php │ ├── class-llms-test-site.php │ ├── class-llms-test-staging.php │ ├── class-llms-test-student-query.php │ ├── class-llms-test-template-functions.php │ ├── class-llms-test-template-loader.php │ ├── class-llms-test-user-postmeta-query.php │ ├── class-llms-test-view-manager.php │ ├── controllers/ │ │ ├── class-llms-test-conroller-quizzes.php │ │ ├── class-llms-test-controller-account.php │ │ ├── class-llms-test-controller-achievements.php │ │ ├── class-llms-test-controller-awards.php │ │ ├── class-llms-test-controller-certificates.php │ │ ├── class-llms-test-controller-checkout.php │ │ ├── class-llms-test-controller-lesson-progression.php │ │ ├── class-llms-test-controller-login.php │ │ ├── class-llms-test-controller-orders.php │ │ └── class-llms-test-controller-registration.php │ ├── forms/ │ │ ├── class-llms-test-form-field.php │ │ ├── class-llms-test-form-handler.php │ │ ├── class-llms-test-form-post-type.php │ │ ├── class-llms-test-form-templates.php │ │ ├── class-llms-test-form-validator.php │ │ ├── class-llms-test-forms-admin-bar.php │ │ ├── class-llms-test-forms-classic-editor.php │ │ ├── class-llms-test-forms-data.php │ │ ├── class-llms-test-forms-dynamic-fields.php │ │ ├── class-llms-test-forms-unsupported-versions.php │ │ └── class-llms-test-forms.php │ ├── functions/ │ │ ├── class-llms-test-functions-access-plans.php │ │ ├── class-llms-test-functions-admin.php │ │ ├── class-llms-test-functions-certificates.php │ │ ├── class-llms-test-functions-conditional-tags.php │ │ ├── class-llms-test-functions-content.php │ │ ├── class-llms-test-functions-core.php │ │ ├── class-llms-test-functions-currency.php │ │ ├── class-llms-test-functions-deprecated.php │ │ ├── class-llms-test-functions-forms.php │ │ ├── class-llms-test-functions-l10n.php │ │ ├── class-llms-test-functions-locale.php │ │ ├── class-llms-test-functions-logs.php │ │ ├── class-llms-test-functions-options.php │ │ ├── class-llms-test-functions-order.php │ │ ├── class-llms-test-functions-page.php │ │ ├── class-llms-test-functions-person.php │ │ ├── class-llms-test-functions-progression.php │ │ ├── class-llms-test-functions-template.php │ │ ├── class-llms-test-functions-templates-certificates.php │ │ ├── class-llms-test-functions-templates-dasbhoard.php │ │ ├── class-llms-test-functions-templates-loop.php │ │ ├── class-llms-test-functions-templates-pricing-table.php │ │ ├── class-llms-test-functions-templates-vier-order.php │ │ ├── class-llms-test-functions-updates.php │ │ ├── class-llms-test-functions-user-information-fields.php │ │ ├── class-llms-test-functions-user-postmeta.php │ │ ├── class-llms-test-template-functions.php │ │ └── updates/ │ │ ├── class-llms-test-functions-updates-400.php │ │ ├── class-llms-test-functions-updates-4150.php │ │ ├── class-llms-test-functions-updates-450.php │ │ ├── class-llms-test-functions-updates-500.php │ │ ├── class-llms-test-functions-updates-520.php │ │ ├── class-llms-test-functions-updates-600.php │ │ ├── class-llms-test-functions-updates-6100.php │ │ └── class-llms-test-functions-updates-630.php │ ├── functions-templates/ │ │ ├── class-llms-test-functions-templates-courses.php │ │ ├── class-llms-test-functions-templates-memberships.php │ │ └── class-llms-test-functions-templates-pricing-table.php │ ├── integrations/ │ │ ├── class-llms-test-integration-bbpress.php │ │ └── class-llms-test-integration-buddypress.php │ ├── models/ │ │ ├── class-llms-test-event.php │ │ ├── class-llms-test-instructor.php │ │ ├── class-llms-test-model-llms-access-plan.php │ │ ├── class-llms-test-model-llms-add-on.php │ │ ├── class-llms-test-model-llms-coupon.php │ │ ├── class-llms-test-model-llms-course.php │ │ ├── class-llms-test-model-llms-lesson.php │ │ ├── class-llms-test-model-llms-membership.php │ │ ├── class-llms-test-model-llms-order.php │ │ ├── class-llms-test-model-llms-product.php │ │ ├── class-llms-test-model-llms-question.php │ │ ├── class-llms-test-model-llms-quiz-attempt.php │ │ ├── class-llms-test-model-llms-quiz.php │ │ ├── class-llms-test-model-llms-section.php │ │ ├── class-llms-test-model-llms-student-quizzes.php │ │ ├── class-llms-test-model-llms-student.php │ │ ├── class-llms-test-model-llms-transaction.php │ │ ├── class-llms-test-model-llms-user-achievement.php │ │ └── class-llms-test-model-llms-user-certificate.php │ ├── notifications/ │ │ ├── class-llms-test-notification-achievement-earned.php │ │ ├── class-llms-test-notification-certificate-earned.php │ │ ├── class-llms-test-notifications-query.php │ │ ├── class-llms-test-notifications.php │ │ └── controllers/ │ │ └── class-llms-test-notification-controller-upcoming-payment-reminder.php │ ├── processors/ │ │ ├── class-llms-test-processor-awarded-achievements-bulk-sync.php │ │ ├── class-llms-test-processor-awarded-certificates-bulk-sync.php │ │ ├── class-llms-test-processor-course-data.php │ │ └── class-llms-test-processors.php │ ├── shortcodes/ │ │ ├── class-llms-test-shortcode-checkout.php │ │ ├── class-llms-test-shortcode-course-progress.php │ │ ├── class-llms-test-shortcode-hide-content.php │ │ └── class-llms-test-shortcode-user-info.php │ ├── tables/ │ │ ├── class-llms-test-table-course-students.php │ │ ├── class-llms-test-table-quizzes.php │ │ └── class-llms-test-table-students.php │ ├── theme-support/ │ │ ├── class-llms-test-theme-support.php │ │ ├── class-llms-test-twenty-twenty-one.php │ │ ├── class-llms-test-twenty-twenty-two.php │ │ └── class-llms-test-twenty-twenty.php │ ├── traits/ │ │ ├── llms-test-trait-audio-video-embed.php │ │ ├── llms-test-trait-award-default-images.php │ │ ├── llms-test-trait-award-templates-post-list-table.php │ │ ├── llms-test-trait-sales-page.php │ │ ├── llms-test-trait-singleton.php │ │ ├── llms-test-trait-student-awards.php │ │ └── llms-test-trait-user-engagement-type.php │ └── user/ │ ├── class-llms-test-abstract-user-data.php │ ├── class-llms-test-person-handler.php │ ├── class-llms-test-student-quizzes.php │ ├── class-llms-test-student.php │ └── class-llms-test-user-permissions.php ├── uninstall.php └── webpack.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .codeclimate.yml ================================================ vesion: '2' exclude_patterns: # Ignore dot directories. - .changelogs/ - .config/ - .github/ - .source/ - .wordpress-org - ._private/ # Misc non-code directories. - dist/ - docs/ - gulpfile.js/ - gulpfile.js - i18n/ - languages/ - libraries/ - tests/ - tmp/ # Included vendor packages. - '**/vendor/' - '**/node_modules/' # Minified scripts. - '**/*.min.js' - '**/index.php' - '**/*.asset.php' - assets/js/llms.js - assets/js/llms-admin-addons.js - assets/js/llms-builder.js - assets/js/llms-components.js - assets/js/llms-icons.js - assets/js/llms-metaboxes.js - assets/js/llms-utils.js ================================================ FILE: .cursor/BUGBOT.md ================================================ Do not review pull requests authored by dependabot[bot] or any automated dependency update bots. ================================================ FILE: .editorconfig ================================================ ### # # This file is deployed into this repository via the "Sync Organization Files" workflow. # # Direct edits to this file are at risk of being overwritten by the next sync. All edits should be made # to the source file. # # @see Sync workflow {@link https://github.com/gocodebox/.github/blob/trunk/.github/workflows/workflow-sync.yml} # @see Workflow template {@link https://github.com/gocodebox/.github/blob/trunk/.github/workflow-templates/.editorconfig} # ### # This file is for unifying the coding style for different editors and IDEs # editorconfig.org # WordPress Coding Standards # https://developer.wordpress.org/coding-standards/wordpress-coding-standards/ root = true [*] charset = utf-8 end_of_line = lf indent_size = 4 tab_width = 4 indent_style = tab insert_final_newline = true trim_trailing_whitespace = true [*.{md,txt}] insert_final_newline = false trim_trailing_whitespace = false [*.{md,json,yml,yml.template}] indent_style = space indent_size = 2 ================================================ FILE: .eslintrc.js ================================================ /** * ESlint config * * @package LifterLMS/Scripts/Dev * * @since Unknown * @version Unknown */ const config = require( '@lifterlms/scripts/config/.eslintrc.js' ); module.exports = config; ================================================ FILE: .github/CODEOWNERS ================================================ * @brianhogg # Full Site Editing. includes/class-llms-block-templates.php @ideadude ================================================ FILE: .github/CONTRIBUTING.md ================================================ Contributing to LifterLMS ========================= We welcome and encourage contributions from the community. If you'd like to contribute to LifterLMS there are a few ways to do so. Here's our guidelines for contributions: *Please Note GitHub is for bug reports and contributions only! If you have a support question or a request for a customization this is not the right place to post it. Please refer to [LifterLMS Support](https://lifterlms.com/my-account/my-tickets) or the [community forums](https://wordpress.org/support/plugin/lifterlms). If you're looking for help customizing LifterLMS, please consider hiring a [LifterLMS Expert](https://lifterlms.com/docs/do-you-have-any-recommended-developers-who-can-modifycustomize-lifterlms/).* ### Ways to Contribute + [Submit bug and issues reports](#reporting-a-bug-or-issue) + [Contribute new features](#contributing-new-features) + [Contribute new code or bug fixes / patches](#contributing-code) + [Translate and localize LifterLMS](#contribute-translations) ### Reporting a Bug or Issue Bugs and issues can be reported at [https://github.com/gocodebox/lifterlms/issues/new/choose](https://github.com/gocodebox/lifterlms/issues/new). Before reporting a bug, [search existing issues](https://github.com/gocodebox/lifterlms/issues) and ensure you're not creating a duplicate. If the issue already exists you can add your information to the existing report. Also check our [known issues and conflicts](https://lifterlms.com/doc-category/lifterlms/known-conflicts/) for possible resolutions. ### Contributing New Features When contributing new features please communicate with us to ensure this is a feature we're interested in having added to LifterLMS before you start coding it. First check if we already have a feature request or proposal for the feature you're interested in developing. Take a look at our existing feature requests here in [GitHub](https://github.com/gocodebox/lifterlms/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22type%3A+feature+request%22) and on our [Feature Request voting board](https://trello.com/b/egC72ZZS/lifterlms-road-map-and-feature-voting). If you can't find an existing feature request you should propose it by opening a new [feature request issue](https://github.com/gocodebox/lifterlms/issues/new?template=Feature_Request.md). In the issue we'll discuss your feature before you start working on it. LifterLMS is a project that services a great many users. A feature which is attractive to a small number of users may create confusion for other users. These features may be better offered as a feature plugin instead of code in the core. In this scenario we'd be happy to help advise you on how to best develop and launch your feature as a plugin on WordPress.org! We'll even help market your add-on after you launch. ### Contributing Code + Fork the repository on GitHub. + [Install LifterLMS for development](../docs/installing.md). + Create a new branch from the 'trunk' branch. + Make the changes to your forked repository. + Ensure you stick to our [coding standards](https://github.com/gocodebox/lifterlms/blob/trunk/docs/coding-standards.md) and have properly documented new and updated functions, methods, actions, and filters following our [documentation standards](https://github.com/gocodebox/lifterlms/blob/trunk/docs/documentation-standards.md). + Run PHPCS and ensure the output has no errors. We **will** reject pull requests if they fail codesniffing. + Ensure new code doesn't break existing tests and add new code should aim to have 100% code coverage. See the [testing guide](https://github.com/gocodebox/lifterlms/blob/trunk/tests/phpunit/README.md) to get started with testing and let us know if you want help writing tests, we're happy to help! + When making changes to (S)CSS and Javascript files, you should only modify the source files. The compiled and minified files *should not be committed* or included in your PR. + When committing, reference your issue (if present) and include a note about the fix. Use [GitHub auto-references](https://help.github.com/en/articles/autolinked-references-and-urls). + Push the changes to your fork + Submit a pull request to the 'dev' branch of the LifterLMS repo. + We'll review all pull requests, and make suggestions and changes if necessary. We're newly open source and supporting users and customers and our own internal pull requests and releases will take priority over pull requests from the community. Please be patient! ### Contribute Translations All translations to LifterLMS can be made via our GlotPress project at [translate.wordpress.org](https://translate.wordpress.org/projects/wp-plugins/lifterlms). Anyone can contribute translations. All you need is to login to your wordpress.org account. If you have questions about how to submit translations please refer to the [Translator's Handbook](https://make.wordpress.org/polyglots/handbook/). We're always seeking Translation Editors who can manage and approve translations for their locale. If you're interested in becoming a translation editor for your locale please [review the documentation about translations here](https://lifterlms.com/docs/how-can-i-contribute-translations-to-lifterlms/). ### Need Help Getting Started as a Contributor? A number of resources are available for first time contributors: + Join our [LifterLMS Community Slack Channel](https://lifterlms.com/slack) and hop into the `#developers` channel. Our core contributors and maintainers are there to help out and answer questions. + Check out the [LifterLMS Community Events Calendar](https://lifterlms.com/community-events/) for opportunities to interact with other contributors. + Check out [this tutorial](https://www.digitalocean.com/community/tutorials/how-to-create-a-pull-request-on-github) on how to submit pull requests on GitHub. + Grab an issue marked tagged as a [`good first issue`](https://github.com/gocodebox/lifterlms/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) ================================================ FILE: .github/ISSUE_TEMPLATE/Bug_Report.md ================================================ --- name: Bug Report about: Report a bug or issue --- ### Reproduction Steps + Include clear and detailed step by step instructions on how the issue can be reliably reproduced + Include screenshots where applicable + Record a video if possible (if you post a video please still include a text version of your recreation steps!) ### Expected Behavior + Include a concise description of what you expected to happen (but didn't) ### Actual Behavior + Include a concise description of what actually happens (but isn't supposed to) ### Error Messages / Logs + Include any relevant error messages or log files ``` ``` ### System and Environment Information
System Report ``` ```
This issue has be recreated: + [ ] Locally + [ ] On a staging site + [ ] On a production website + [ ] With only LifterLMS and a default theme ### Browser, Device, and Operating System Information + Browser name and version + Operating System name and version + Device name and version (if applicable) ================================================ FILE: .github/ISSUE_TEMPLATE/Feature_Request.md ================================================ --- name: Feature request about: Suggest an idea or new feature for LifterLMS --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. ================================================ FILE: .github/ISSUE_TEMPLATE/Question.md ================================================ --- name: Question about: Questions or 'how to' about LifterLMS --- Remember that GitHub is NOT a support form! If you require user support with LifterLMS you will have more success in one of the following places: - Support Forums: https://wordpress.org/support/plugin/lifterlms - Official Support Tickets: https://lifterlms.com/my-account/my-tickets - LifterLMS Community Slack Channel: https://lifterlms.com/slack You may also wish to peruse our documentation at https://lifterlms.com/docs If none of these places seem appropriate ask away here. ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## Description Fixes # ## How has this been tested? ## Screenshots ## Types of changes ## Checklist: - [ ] This PR requires and contains at least one changelog file. - [ ] My code has been tested. - [ ] My code passes all existing automated tests. - [ ] My code follows the LifterLMS Coding & Documentation Standards. ================================================ FILE: .github/SECURITY.md ================================================ Security Policy --------------- ## Supported Versions The current minor version (currently LifterLMS 7.8.x) is the only supported branch of LifterLMS. If you're using an unsupported version of LifterLMS we strongly recommend you upgrade to the latest version as soon as possible. ## Reporting a Vulnerability The LifterLMS team takes security issues and vulnerabilities very seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. To report a vulnerability, please see our guidelines at https://lifterlms.com/security/ ================================================ FILE: .github/workflow-matrix.yml ================================================ ### # # Custom workflow matrix configurations # # @link https://github.com/gocodebox/.github/tree/trunk/.github/actions/setup-matrix # ### Test PHPUnit: __delete: # Remove the LLMS Nightly job (intended for add-ons). - include[1] ================================================ FILE: .github/workflows/codeql-analysis.yml ================================================ name: "CodeQL" on: pull_request: jobs: analyze: name: Analyze runs-on: ubuntu-latest strategy: fail-fast: false matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] language: ['javascript'] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection steps: - name: Checkout repository uses: actions/checkout@v2 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. fetch-depth: 2 # If this run was triggered by a pull request event, then checkout # the head of the pull request instead of the merge commit. - run: git checkout HEAD^2 if: ${{ github.event_name == 'pull_request' }} # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v1 with: languages: ${{ matrix.language }} - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1 ================================================ FILE: .github/workflows/contributors.yml ================================================ name: Contributors on: workflow_dispatch: push: branches: - trunk concurrency: group: ${{ github.workflow }}-${{ 'pull_request' == github.event_name && github.head_ref || github.sha }} cancel-in-progress: true jobs: build: name: Update contributors runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 with: token: ${{ secrets.ORG_WORKFLOWS }} - name: Setup Node uses: actions/setup-node@v2 with: node-version: '16' cache: 'npm' - name: Install dependencies run: npm install contributor-faces - name: Update README.md run: ./node_modules/.bin/contributor-faces -e '*\[bot\]' -l 100 - name: Commit Updates uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Update contributors list branch: trunk file_pattern: README.md commit_user_name: contributors-workflow[bot] commit_user_email: 41898282+github-actions[bot]@users.noreply.github.com ================================================ FILE: .github/workflows/keep-alive.yml ================================================ ### # # This workflow file is deployed into this repository via the "Sync Organization Files" workflow. # # Direct edits to this file are at risk of being overwritten by the next sync. All edits should be made # to the source file. # # @see Sync workflow {@link https://github.com/gocodebox/.github/actions/workflows/workflow-sync.yml} # @see Workflow template {@link https://github.com/gocodebox/.github/blob/trunk/.github/workflow-templates/keep-alive.yml} # # Keep Repo Alive # # This workflow ensures that cronjob workflows are not automatically disabled after 60 days of repo inactivity. # The workflow will automatically add an empty commit if the repo's latest commitwas made more than 50 days ago. This empty commit will prevent GitHub from automatically disabling this (and other) # cronjob actions in the repo. # ### name: Keep Repo Alive on: # Once daily at 00:00 UTC. schedule: - cron: '0 0 * * *' jobs: keep-alive: name: Keep Repo Alive runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: token: ${{ secrets.ORG_WORKFLOWS }} fetch-depth: 0 - name: Add keep-alive commit run: | LAST_COMMIT_TIME=$( git --no-pager log -1 --format=%ct ) NOW=$( date +%s ) DIFF_IN_DAYS=$(( ( NOW - LAST_COMMIT_TIME ) / 86400 )) echo "Days since last commit: $DIFF_IN_DAYS" if (( $DIFF_IN_DAYS > 50 )); then echo "Adding a keep-alive commit." git config --global user.name "keepalive[bot]" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" git commit --allow-empty -m "Automated commit from the Keep Repo Alive workflow" git push origin HEAD else echo "No keep-alive commit required." fi ================================================ FILE: .github/workflows/lint-js.yml ================================================ ### # # This workflow file is deployed into this repository via the "Sync Organization Files" workflow # # Direct edits to this file are at risk of being overwritten by the next sync. All edits should be made # to the source file. # # @see Sync workflow {@link https://github.com/gocodebox/.github/actions/workflows/workflow-sync.yml} # @see Workflow template {@link https://github.com/gocodebox/.github/blob/trunk/.github/workflow-templates/lint-js.yml} # ### name: Lint JavaScript on: workflow_dispatch: pull_request: # Once daily at 00:00 UTC. # schedule: # - cron: '0 0 * * *' concurrency: group: ${{ github.workflow }}-${{ 'pull_request' == github.event_name && github.head_ref || github.sha }} cancel-in-progress: true jobs: lint: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Node uses: actions/setup-node@v1 with: node-version: '16' cache: 'npm' - name: Install npm dependencies run: npm ci - name: Run linter continue-on-error: true run: npm run lint:js ================================================ FILE: .github/workflows/ossar-analysis.yml ================================================ # This workflow integrates a collection of open source static analysis tools # with GitHub code scanning. For documentation, or to provide feedback, visit # https://github.com/github/ossar-action name: OSSAR on: pull_request: jobs: OSSAR-Scan: runs-on: windows-latest steps: - uses: actions/checkout@v2 - name: Run OSSAR uses: github/ossar-action@v1 id: ossar - name: Upload results to Security tab uses: github/codeql-action/upload-sarif@v1 with: sarif_file: ${{ steps.ossar.outputs.sarifFile }} ================================================ FILE: .github/workflows/project-automation.yml ================================================ name: Issue & PR Automation on: issues: types: - opened - reopened pull_request_target: types: - opened - reopened - review_requested env: PRIMARY_CODEOWNER: '@ideadude' PROJECT_ORG: gocodebox PROJECT_ID: 18 jobs: ####################################### # Add issue to the Development project. ####################################### issue-to-project: name: Move Issue to Project Board runs-on: ubuntu-latest if: ( 'issues' == github.event_name && ( 'opened' == github.event.action || 'reopened' == github.event.action ) ) steps: - name: Add Issue to Project uses: leonsteinhaeuser/project-beta-automations@v2.1.0 with: gh_token: ${{ secrets.ORG_WORKFLOWS }} organization: ${{ env.PROJECT_ORG }} project_id: ${{ env.PROJECT_ID }} resource_node_id: ${{ github.event.issue.node_id }} status_value: "Awaiting Triage" # - uses: hmarr/debug-action@v2 #################################### # Assign to the project's CODEOWNER. #################################### issue-assig: name: Assign Issue to the Primary CODEOWNER runs-on: ubuntu-latest if: ( 'issues' == github.event_name && ( 'opened' == github.event.action || 'reopened' == github.event.action ) && ( null == github.event.issue.assignee ) ) steps: - name: Checkout uses: actions/checkout@v2 - name: Check CODEOWNERS file existence id: codeowners_file_exists uses: andstor/file-existence-action@v2 with: files: .github/CODEOWNERS - name: Parse CODEOWNERS file id: codeowner if: steps.codeowners_file_exists.outputs.files_exists == 'true' uses: SvanBoxel/codeowners-action@v1 with: path: .github/CODEOWNERS - name: Update PRIMARY_CODEOWNER env var if: steps.codeowners_file_exists.outputs.files_exists == 'true' run: | echo PRIMARY_CODEOWNER=$( echo '${{ steps.codeowner.outputs.codeowners }}' | jq -r '."*"[0]' ) >> $GITHUB_ENV - name: Strip @ from username run: | echo "PRIMARY_CODEOWNER=${PRIMARY_CODEOWNER#?}" >> $GITHUB_ENV - name: Assign issue uses: pozil/auto-assign-issue@v1 with: repo-token: ${{ secrets.ORG_WORKFLOWS }} assignees: ${{ env.PRIMARY_CODEOWNER }} ##################################### # Add PRs to the Development project. ##################################### pr-to-board: name: Move Pull Request to the Project Board runs-on: ubuntu-latest if: ( 'pull_request_target' == github.event_name && ( 'opened' == github.event.action || 'reopened' == github.event.action || 'review_requested' == github.event.action ) ) steps: - name: Mark PR as Awaiting Review uses: leonsteinhaeuser/project-beta-automations@v2.1.0 with: gh_token: ${{ secrets.ORG_WORKFLOWS }} organization: ${{ env.PROJECT_ORG }} project_id: ${{ env.PROJECT_ID }} resource_node_id: ${{ github.event.pull_request.node_id }} status_value: "Awaiting Review" ================================================ FILE: .github/workflows/publish.yml ================================================ name: Release Publication and Distribution on: workflow_dispatch: push: branches: - trunk paths: - 'CHANGELOG.md' jobs: check-secrets: name: "Check for required secrets" runs-on: ubuntu-latest outputs: has-secrets: ${{ steps.check-secrets.outputs.has-secrets }} steps: - name: Test secrets id: check-secrets run: | if [ ! -z "${{ secrets.LLMS_COM_API_URL }}" ] && [ ! -z "${{ secrets.LLMS_COM_API_KEY }}" ]; then echo "::set-output name=has-secrets::true" fi update-metadata: name: "Update product metadata at LifterLMS.com" runs-on: ubuntu-latest needs: check-secrets if: ${{ 'true' == needs.check-secrets.outputs.has-secrets }} steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Node uses: actions/setup-node@v2 with: node-version: '16' cache: 'npm' - name: Install Node dependencies run: npm i @lifterlms/dev - name: Get metadata run: | __LLMS_METADATA=$( ./node_modules/.bin/llms-dev meta parse -f json ) echo __LLMS_PKG_VERSION=$( echo $__LLMS_METADATA | jq --raw-output '.["Version"]' ) >> $GITHUB_ENV echo __LLMS_WP_VERSION=$( echo $__LLMS_METADATA | jq --raw-output '.["Requires at least"]' ) >> $GITHUB_ENV echo __LLMS_PHP_VERSION=$( echo $__LLMS_METADATA | jq --raw-output '.["Requires PHP"]' ) >> $GITHUB_ENV echo __LLMS_LLMS_VERSION=$( echo $__LLMS_METADATA | jq --raw-output '.["LLMS Requires at least"]' ) >> $GITHUB_ENV - name: Test metadata run: | echo "Package version: $__LLMS_PKG_VERSION" echo "Min WP Version: $__LLMS_WP_VERSION" echo "Min PHP Version: $__LLMS_PHP_VERSION" echo "Min LLMS Version: $__LLMS_LLMS_VERSION" - name: Update metadata run: | curl --location --request PATCH "${{ secrets.LLMS_COM_API_URL }}v3/products/${{ github.event.repository.name }}" \ --header "X-API-KEY: ${{ secrets.LLMS_COM_API_KEY }}" \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode "version=$__LLMS_PKG_VERSION" \ --data-urlencode "wp_version=$__LLMS_WP_VERSION" \ --data-urlencode "php_version=$__LLMS_PHP_VERSION" \ --data-urlencode "llms_version=$__LLMS_LLMS_VERSION" ================================================ FILE: .github/workflows/sync-branches.yml ================================================ ### # # This workflow file is deployed into this repository via the "Sync Organization Files" workflow # # Direct edits to this file are at risk of being overwritten by the next sync. All edits should be made # to the source file. # # @see Sync workflow {@link https://github.com/gocodebox/.github/actions/workflows/workflow-sync.yml} # @see Workflow template {@link https://github.com/gocodebox/.github/blob/trunk/.github/workflow-templates/sync-branches.yml} # ### name: Sync Branches on: push: branches: - trunk workflow_dispatch: jobs: sync: name: trunk -> dev runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: token: ${{ secrets.ORG_WORKFLOWS }} fetch-depth: 0 - name: Perform sync run: | git config --global user.name "branch-sync[bot]" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" git checkout dev git pull origin trunk --no-ff git status git push origin dev ================================================ FILE: .github/workflows/test-e2e.yml ================================================ ### # # This workflow file is deployed into this repository via the "Sync Organization Files" workflow # # Direct edits to this file are at risk of being overwritten by the next sync. All edits should be made # to the source file. # # @see Sync workflow {@link https://github.com/gocodebox/.github/actions/workflows/workflow-sync.yml} # @see Workflow template {@link https://github.com/gocodebox/.github/blob/trunk/.github/workflow-templates/test-e2e.yml} # ### name: Test E2E on: workflow_dispatch: pull_request: # Once daily at 00:00 UTC. # schedule: # - cron: '0 0 * * *' concurrency: group: ${{ github.workflow }}-${{ 'pull_request' == github.event_name && github.head_ref || github.sha }} cancel-in-progress: true jobs: ### # # Setup the test matrix. # ### set-matrix: name: Setup Matrix runs-on: ubuntu-latest outputs: matrix: ${{ steps.setup.outputs.matrix }} steps: - uses: actions/checkout@v2 - id: setup uses: gocodebox/.github/.github/actions/setup-matrix@trunk ### # # Run tests. # ### test: name: "WP ${{ matrix.WP }}" needs: set-matrix runs-on: ubuntu-latest continue-on-error: ${{ matrix.allow-failure }} strategy: fail-fast: false matrix: ${{ fromJSON( needs.set-matrix.outputs.matrix ) }} steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Environment uses: gocodebox/.github/.github/actions/setup-e2e@trunk with: wp-version: ${{ matrix.WP }} docker-user: ${{ secrets.DOCKER_USERNAME }} docker-pass: ${{ secrets.DOCKER_PASSWORD }} node-version: '16' # create a folder for the screenshots, this folder will be uploaded as artifact - run: mkdir screenshots - name: Run test suite run: npm run test -- --verbose - name: Upload artifacts uses: actions/upload-artifact@v4 if: failure() with: name: error-artifacts-wp-${{ matrix.WP }} path: | tmp/artifacts screenshots ### # # Check the status of the entire test matrix. # # This will succeed if all jobs from the `test` job's matrix succeed. It allows jobs marked with `allow-failure` # to fail. # # This job can be used as a single status check for branch protection rules. Without this # we would need to require every job in the above build matrix. # ### status: name: Test E2E Status runs-on: ubuntu-latest if: always() needs: test steps: - name: Check overall matrix status if: ${{ 'success' != needs.test.result }} run: exit 1 ================================================ FILE: .github/workflows/test-js-unit.yml ================================================ name: Test JS Unit on: workflow_dispatch: pull_request: paths: - src/js/** # Once daily at 00:00 UTC. # schedule: # - cron: '0 0 * * *' concurrency: group: ${{ github.workflow }}-${{ 'pull_request' == github.event_name && github.head_ref || github.sha }} cancel-in-progress: true jobs: test: name: "Run JS Unit Tests" runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Node uses: actions/setup-node@v2 with: node-version: '16' cache: 'npm' - name: Install Node dependencies run: npm ci - name: Run test suite run: npm run test:unit ================================================ FILE: .github/workflows/test-phpunit.yml ================================================ ### # # This workflow file is deployed into this repository via the "Sync Organization Files" workflow # # Direct edits to this file are at risk of being overwritten by the next sync. All edits should be made # to the source file. # # @see Sync workflow {@link https://github.com/gocodebox/.github/actions/workflows/workflow-sync.yml} # @see Workflow template {@link https://github.com/gocodebox/.github/blob/trunk/.github/workflow-templates/test-phpunit.yml} # ### name: Test PHPUnit on: workflow_dispatch: inputs: cache-suffix: description: Cache suffix type: string pull_request: # Once daily at 01:00 UTC. # schedule: # - cron: '0 1 * * *' concurrency: group: ${{ github.workflow }}-${{ 'pull_request' == github.event_name && github.head_ref || github.sha }} cancel-in-progress: true jobs: ### # # Setup the test matrix. # ### set-matrix: name: Setup Matrix runs-on: ubuntu-latest outputs: matrix: ${{ steps.setup.outputs.matrix }} steps: - uses: actions/checkout@v2 - id: setup uses: gocodebox/.github/.github/actions/setup-matrix@trunk ### # # Run tests. # ### test: name: WP ${{ matrix.WP }} on PHP ${{ matrix.PHP }}${{ matrix.name-append }} needs: set-matrix runs-on: ubuntu-latest continue-on-error: ${{ matrix.allow-failure }} strategy: fail-fast: false matrix: ${{ fromJSON( needs.set-matrix.outputs.matrix ) }} steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Environment uses: gocodebox/.github/.github/actions/setup-phpunit@trunk with: php-version: ${{ matrix.PHP }} wp-version: ${{ matrix.WP }} llms-branch: ${{ matrix.LLMS }} env-file: ".github/.env.test-phpunit" deploy-key: ${{ secrets.LLMS_DEPLOY_KEY }} secrets: ${{ toJSON( secrets ) }} cache-suffix: ${{ inputs.cache-suffix }} - name: Setup Node uses: actions/setup-node@v2 with: node-version: '16' - name: Install NPM Dependencies run: npm ci && npm run build - name: Run Tests run: composer run tests ### # # Check the status of the entire test matrix. # # This will succeed if all jobs from the `test` job's matrix succeed. It allows jobs marked with `allow-failure` # to fail. # # This job can be used as a single status check for branch protection rules. Without this # we would need to require every job in the above build matrix. # ### status: name: Test PHPUnit Status runs-on: ubuntu-latest if: ${{ always() }} needs: test steps: - name: Check overall matrix status if: ${{ 'success' != needs.test.result }} run: exit 1 ================================================ FILE: .gitignore ================================================ # Package managers. node_modules/ /vendor/ # Lock file intentionally excluded to allow easier testing against multiple php versions # This follows the precedent put forth by the WordPress core {@link https://github.com/WordPress/wordpress-develop/commit/0e442c4615bdcdc1c2e4f8db6f88f57e6859c2ff} composer.lock # Ignore built files /readme.txt assets/css/admin.css assets/css/admin.min.css assets/css/admin-rtl.css assets/css/admin-rtl.min.css assets/css/admin-wizard-rtl.css assets/css/admin-wizard-rtl.min.css assets/css/admin-wizard.css assets/css/admin-wizard.min.css assets/css/builder.css assets/css/builder.min.css assets/css/builder-rtl.css assets/css/builder-rtl.min.css assets/css/bricks-editor-rtl.css assets/css/admin-importer* assets/css/editor* assets/css/certificates* assets/css/lifterlms-rtl.css assets/css/lifterlms-rtl.min.css assets/css/lifterlms.css assets/css/lifterlms.min.css assets/css/llms-admin-addons.css assets/css/llms-admin-addons-rtl.css assets/css/llms-focus-mode* assets/js/llms-builder.js assets/js/llms-builder.min.js assets/js/llms-admin-elementor-editor.js assets/js/llms-admin-elementor-editor.asset.php assets/js/llms-admin-certificate-editor.asset.php assets/js/llms-admin-certificate-editor.js assets/js/llms-admin-media-protection-block-protect.asset.php assets/js/llms-admin-media-protection-block-protect.js assets/js/llms-components.asset.php assets/js/llms-components.js assets/js/llms-admin-addons.js assets/js/llms-admin-award-certificate.js assets/js/llms-icons.js assets/js/llms-quill-wordcount.js assets/js/llms-spinner.js assets/js/llms-utils.js assets/js/llms.js assets/js/*.min.js assets/js/*.asset.php assets/js/llms-metaboxes.js blocks/certificate-title/* blocks/my-account/* blocks/pricing-table/* blocks/access-plan-button/* blocks/checkout/* blocks/course-author/* blocks/course-continue/* blocks/course-meta-info/* blocks/course-outline/* blocks/course-prerequisites/* blocks/course-reviews/* blocks/course-syllabus/* blocks/courses/* blocks/login/* blocks/memberships/* blocks/my-achievements/* blocks/navigation-link/* blocks/registration/* includes/class.llms.l10n.frontend.php languages/lifterlms.pot # Ignore composer-installed libs. /libraries/* !/libraries/index.php !/libraries/README.md # Exclude maps. /blocks/**/*.js.map /assets/css/*.map /assets/js/*.map /assets/maps/* # Misc. *.log .DS_Store # Release distribution directory. /dist/ /tmp/ # Non-distributable configs. phpunit.xml .llmsenv ================================================ FILE: .llmsconfig ================================================ { "build": { "custom": [ "js-additional", "js-builder" ] }, "docs": { "package": "LifterLMS" }, "pot": { "bugReport": "https://github.com/gocodebox/lifterlms/issues", "domain": "lifterlms", "dest": "languages/", "jsClassname": "LLMS_L10n_JS", "jsFilename": "class.llms.l10n.frontend.php", "jsSince": "3.17.8", "jsSrc": [ "assets/js/**/*.js", "!assets/js/**/*.min.js", "!assets/js/**/*.js.map" ], "lastTranslator": "Thomas Patrick Levy ", "team": "LifterLMS ", "package": "lifterlms", "phpSrc": [ "./*.php", "./**/*.php", "!vendor/*", "!vendor/**/*.php", "!tmp/**", "!tests/**", "!wordpress/**", "./vendor/lifterlms/lifterlms-blocks/*.php", "./vendor/lifterlms/lifterlms-blocks/**/*.php", "./vendor/lifterlms/lifterlms-rest/*.php", "./vendor/lifterlms/lifterlms-rest/**/*.php" ] }, "publish": { "title": "LifterLMS", "lifterlms": { "make": { "tags": [ 6 ] }, "pot": false } }, "scripts": { "src": [ "assets/js/**/*.js", "!assets/js/llms-admin-addons.js", "!assets/js/llms-admin-award-certificate.js", "!assets/js/llms-admin-certificate-editor.js", "!assets/js/llms-admin-media-protection-block-protect.js", "!assets/js/**/*.min.js", "!assets/js/llms-builder*.js", "!assets/js/app/**/*.js", "!assets/js/builder/**/*.js", "!assets/js/partials/**/*.js", "!assets/js/private/**/*.js", "!assets/js/llms-components.js", "!assets/js/llms-icons.js", "!assets/js/llms-quill-wordcount.js", "!assets/js/llms-spinner.js", "!assets/js/llms-utils.js" ], "dest": "assets/js/" }, "watch": { "custom": [ { "glob": [ "assets/js/builder/**/*.js", "assets/js/private/**/*.js", "assets/js/app/*.js" ], "tasks": [ "js-additional", "js-builder" ] } ] }, "zip": { "composer": true, "src": { "custom": [ "!./**/CHANGELOG.md", "!./**/README.md", "!./_private/**", "!./_readme/**", "!./docs/**", "!./packages/**", "!./wordpress/**", "!lerna.json", "!babel.config.js", "!docker-compose.override.yml.template" ] } } } ================================================ FILE: .llmsdev.yml ================================================ pot: dir: languages ================================================ FILE: .llmsdevrc ================================================ { "readme": { "title": "LMS by LifterLMS - Online Course, Membership & Learning Management System Plugin for WordPress", "shortDescription": "LifterLMS is a powerful WordPress learning management system plugin that makes it easy to create, sell, and protect engaging online courses and training based membership websites.", "meta": { "Tags": "learning management system, LMS, membership, elearning, online courses, quizzes, sell courses, badges, gamification, learning, Lifter, LifterLMS", "Requires at least": "5.4", "Tested up to": "5.8", "Requires PHP": "7.3" }, "changelog": { "link": "https://make.lifterlms.com/tag/lifterlms/" }, "sections": { "Description": "file:./.wordpress-org/readme/description.md", "Installation": "file:./.wordpress-org/readme/installation.md", "Frequently Asked Questions": "file:./.wordpress-org/readme/faqs.md", "Screenshots": "file:./.wordpress-org/readme/screenshots.md" } }, "i18n": { "dir": "./languages/" } } ================================================ FILE: .llmsenv.dist ================================================ WORDPRESS_PORT=8080 WORDPRESS_TITLE=LifterLMS Core e2e ================================================ FILE: .source/README.md ================================================ LifterLMS Source Images ======================= This directory contains source images (.svg, .ai, .psd, etc...) for any image assets used in the LifterLMS core. ================================================ FILE: .wordpress-org/README.md ================================================ WordPress.org Plugin Repository Content and Assets ================================================== This directory contains the text content and assets used on the LifterLMS plugin listing on [WordPress.org Plugin Repository](https://wordpress.org/plugins/lifterlms/). ## README The [readme](./readme) directory contains the markdown files representing the sections (and tabs) used on the listing. These files are combined during a build step prior distribution and output as the [readme.txt](../readme.txt) file distributed with the LifterLMS plugin. Generally we do not ship updates for changes to the readme directory. These changes will be included in the next release which contains code changes. The files are prepended with numbers to preserve their order when programmatically combined. The command to build the readme file is `npm run dev readme`. See full documentation of the command in the [@lifterlms/dev package reference](https://github.com/gocodebox/lifterlms/tree/trunk/packages/dev#readme). ### File Parts + [01-header.md](./readme/01-header.md): The readme header containing the listing's display title, meta data, and a short description. + [05-description.md](./readme/05-description.md): The main listing "Details" tab. + [10-installation.md](./readme/10-installation.md): The contents of the "Installation" tab + [15-faqs.md](./readme/15-faqs.md): A list of frequently asked questions. This is listed at the bottom of the "Details" tab on the listing page. + [20-screenshots.md](./readme/15-faqs.md): An ordered list of screenshot captions. Each caption should correspond with a screenshot in the [assets directory](./assets). A screenshot with the filename `screenshot-5.png` corresponds to the item 5 in the screenshot list. + [25-changelog.md](./readme/25-changelog.md): an auto-generated changelog containing the latest 10 changelog entries from the main [CHANGELOG.md](../CHANGELOG.md) file. ### Merge Codes Various merge codes are available for use in the readme file parts. See the [@lifterlms/dev package reference](https://github.com/gocodebox/lifterlms/tree/trunk/packages/dev#readme) for merge code documentation. ## Assets The [assets](./assets) directory contains the images used in the listing: banners, icons, and screenshots. See also: [How Your Plugin Assets Work](https://developer.wordpress.org/plugins/wordpress-org/plugin-assets/). Assets are manually synced to WordPress.org via SVN @thomasplevy and will be updated in conjunction with the next release following their update in this directory. ================================================ FILE: .wordpress-org/readme/01-header.md ================================================ === LifterLMS - WP LMS for eLearning, Online Courses, & Quizzes === Contributors: lifterlms, chrisbadgett, strangerstudios, kimannwall, d4z_c0nf, actuallyakash, codeboxllc, brianhogg Donate link: {{__PROJECT_URI__}} Tags: lms, course, elearning, learning management system, quiz License: {{__LICENSE__}} License URI: {{__LICENSE_URI__}} Requires at least: {{__MIN_WP_VERSION__}} Tested up to: {{__TESTED_WP_VERSION__}} Requires PHP: {{__MIN_PHP_VERSION__}} Stable tag: {{__VERSION__}} {{__SHORT_DESCRIPTION__}} ================================================ FILE: .wordpress-org/readme/05-description.md ================================================ == Description == LifterLMS is a secure easy-to-use WordPress LMS plugin packed with features to easily create & sell courses online. Turn your WordPress website into a professional eLearning platform with every customizable feature you could possibly need from your LMS. + **Intuitive LMS Course Builder:** Create Courses, Sections, and Interactive Lessons with multimedia content. + **Track Student Progress:** In-Depth Reporting, Create Timed or Open Quizzes, Drip Content, Add Prerequisites, Analyze Progress, and Award Certificates + **Complete Ecommerce Platform:** Built-in Gateway Integration for Stripe and PayPal With Memberships and Subscriptions + **Community and Social Learning:** Integrate a Community Forum or Discussion Area, Add Multiple Instructors, and Display Course Reviews [Explore All LMS Features](https://lifterlms.com/features/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) LifterLMS makes it easy to create, sell, and protect engaging online courses and training-based membership websites. https://www.youtube.com/watch?v=N72Zw2EBm4A ### Integrate LifterLMS With Any Theme, Page Builder, & Block Editor LifterLMS works with any modern WordPress theme/FSE, the Block Editor (Gutenberg), and every popular WordPress page builder including Elementor, Beaver Builder, and Divi. **With over 10 years development,** our team is deeply engaged with the WordPress community. We encourage our integration partners to create the extensions you need most, like Affiliate WP, Monster Insights, WP Fusion, popular form plugins, GamiPress, Astra Pro, and more. ### Open Source, Free Core Plugin LifterLMS gives back to the open-source community. The core LifterLMS plugin is a totally FREE forever LMS - no limits on your courses, memberships, enrollments, or earnings. We believe in free, distributed learning for all. **LifterLMS exists to democratize education in the digital classroom.** ### Premium Add-ons and Bundles Get to know our team and product. by signing up for a **[$1 temporary _30 Day_ website](https://lifterlms.com/try/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale)**. You'll get instant access to a private demo site hosted on our servers pre-installed with: + the core LifterLMS plugin, AND + every premium LMS add-on See why so many people start with or switch from another WordPress LMS or hosted platform to [LifterLMS](https://lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) for online courses, membership sites, and remote schools. https://www.youtube.com/watch?v=RnZflrWG5YQ ### LifterLMS is Perfect For: **Builders** We’re the favorite LMS plugin for WordPress developers, designers and IT pros who **build LMS websites and training portals** for clients, employers, and themselves **DIY** Do-it-yourself innovators love that LifterLMS helps them easily **create high-value online courses, coaching or training-based membership websites,** right on WordPress. **Switchers** Have you outgrown a hosted LMS platform or an incomplete WordPress LMS stack? Choose LifterLMS if you are looking for **more power, control, and better support**. ### Meet The LifterLMS Team The LifterLMS team is a **diverse group of talented course creators, developers, designers, marketers, and entrepreneurs**. Before developing LifterLMS, we consulted and built custom WordPress-based online learning and membership sites for clients worldwide. LifterLMS was born through this deep hands-on experience building high-end, custom WordPress LMS websites from scratch. Learn more about [the people behind LifterLMS](https://lifterlms.com/about-us/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale#h-meet-the-team). ### LifterLMS By The Numbers + 8,377,042 Course Enrollments powered by LifterLMS + 12,570,881 Course and lesson completions powered by LifterLMS + 186,997 Achievement badges awarded by LifterLMS + 310,728 Certificates awarded by LifterLMS + Over 10,000 active installs of the WordPress LMS plugin + [308 5-star reviews](https://wordpress.org/support/plugin/lifterlms/reviews/?filter=5) ### [Features](https://lifterlms.com/features/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) Start with the free LMS plugin and [scale-up](https://lifterlms.com/pricing/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) as you grow. https://www.youtube.com/watch?v=ZNwo5inRSdM **Make Money Teaching Online** Set up LifterLMS, activate built-in payments with [Stripe](https://lifterlms.com/product/stripe-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) or [PayPal](https://lifterlms.com/product/paypal-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). That's all you need to get started. When you need more features and to expand your online learning business, we're here for you. We have several free and premium add-ons to help you create more value for your users, and scale your business revenue. + Credit card payments + One-time payments + Recurring payments + Payment plans + Unlimited course and membership pricing models + PayPal + Subscriptions + Checkout + Free courses + Course bundles + Private coaching upsells + Course and membership Coupons + Bulk course and membership sales + Affiliate ready + Native course and membership sales pages + Offline course and membership sales + Customizable course and membership enrollment + Country and currency + E-commerce dashboard + Credit card management + Subscription switching + Payment switching + Native Zapier integration **Create Courses on Your WordPress LMS Website** + Course multimedia lessons + Course quizzes + Quiz question banks + Course builder + Course cohorts + Drip Content + Course and lesson prerequisites + Course tracks + Course assignments + Quiz time limits + Student dashboard + Student note-taking + Multi-instructor courses + Lesson downloads + Course import & export + Discussion areas + Instructional design + Forum integrations + Graphics pack + Course reviews + Group enrollments for courses and memberships **Engage Your Students** + Achievement badges + Certificates + Personalized email + Social learning + Private coaching + Text messaging **Offer Memberships** + Sitewide membership + Course bundles + Traditional memberships + Automatic course enrollment + Bulk course enrollment + Content restrictions outside of a course + Members-only payment plans + Private group discussions + Members-only forums **Integrate your WordPress LMS with the Tools You Need** + Payment gateways + Email marketing + Forums + Mobile friendly + Use any theme or page builder + Built for compatibility + CRMs + E-learning authoring tools + Tin Can API (xAPI) **Secure and Protect Your Content** + Course protection + User account management and registration + Members only content + Course only content + Restricted access + Password management + Self-hosted **Own and Manage Your WordPress LMS Platform** + Detailed course, membership, ecommerce, and student reporting + Course gradebook + Email notifications + Bulk course and membership enrollments + Student management + Course and membership access management + Web design management + Branding & typography + WordPress LMS User Roles + Security + Require terms + Scalable + Layout + Testing tools **Get Support For Your WordPress LMS Project** + Technical support + 30 Days of live weekly onboarding calls called [Liftoff Sessions](https://lifterlms.com/blog/liftoff/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) + [Live office hours](https://lifterlms.com/product/office-hours/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [Free training courses](https://academy.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) + [Free training webinars](https://lifterlms.com/lifterlms-webinars/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) + Setup wizard + [Detailed documentation](https://lifterlms.com/docs/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + Dynamic resources + Demo course + System analyzer + User community + [REST API](https://developer.lifterlms.com/rest-api/) + [Developer ecosystem](https://make.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) + [Recommended Resources](https://lifterlms.com/recommended-resources/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) for course creators **More Resources** + The [LifterLMS Official Homepage](https://lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + The [LifterLMS Knowledge base](https://lifterlms.com/docs/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + The [LifterLMS Blog](https://lifterlms.com/blog/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + The [LifterLMS Podcast](https://podcast.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + The [LifterLMS Academy](https://academy.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) + The [LifterLMS Developer Blog](https://make.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) ### Enhance Your LMS With LifterLMS Add-Ons **Advanced** Increase your LMS website and it's training program's value with these add-ons: + [LifterLMS Advanced Quizzes](https://lifterlms.com/product/advanced-quizzes//?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Assignments](https://lifterlms.com/product/lifterlms-assignments/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Private Areas](https://lifterlms.com/product/private-areas/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Social Learning](https://lifterlms.com/product/social-learning/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Advanced Video](https://lifterlms.com/product/advanced-video/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) + [LifterLMS Custom Fields](https://lifterlms.com/product/custom-fields/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Groups](https://lifterlms.com/product/groups/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS PDFs](https://lifterlms.com/product/lifterlms-pdfs/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Private Site](https://lifterlms.com/product/private-site/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Course Cohorts](https://lifterlms.com/product/course-cohorts/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Advanced Coupons](https://lifterlms.com/product/lifterlms-advanced-coupons/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Notes](https://lifterlms.com/product/lifterlms-notes/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Continuing Education](https://lifterlms.com/product/lifterlms-continuing-education/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Gifts](https://lifterlms.com/product/lifterlms-gifts/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) **Integrations** Integrate your LMS with the tools you use: + [LifterLMS Stripe](https://lifterlms.com/product/stripe-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS PayPal](https://lifterlms.com/product/paypal-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Authorize.Net](https://lifterlms.com/product/authorize-net/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS WooCommerce](https://lifterlms.com/product/woocommerce-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Kit](https://lifterlms.com/product/lifterlms-convertkit/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Mailchimp](https://lifterlms.com/product/mailchimp-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) ### LMS Website and User Experience Design Tools Use LifterLMS with the modern LifterLMS [Sky Pilot Theme](https://lifterlms.com/product/sky-pilot/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) for even more beautiful results. LifterLMS works with any well-coded WordPress theme, but check out [Sky Pilot](https://lifterlms.com/product/sky-pilot/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) if you want to start with a modern, beautiful, full-site editing block-based theme. And consider using our [Aircraft page builder plugin](https://lifterlms.com/product/aircraft/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale), to make building beautiful web pages fast using our design template library. + [LifterLMS Sky Pilot Theme](https://lifterlms.com/product/sky-pilot/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Aircraft](https://lifterlms.com/product/aircraft/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) + [LifterLMS Powerpack](https://lifterlms.com/product/lifterlms-pro/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) https://www.youtube.com/watch?v=tE1K1FHiYDM ### Why Do People Switch to LifterLMS From Other LMS Plugins? There are several other LMS plugins like: + Sensei LMS + Tutor LMS + WP Courseware + LearnDash + Masterstudy LMS + Academy LMS + Namaste LMS + LearnPress There are some membership plugins with some course features like: + Paid Memberships Pro (Membership plugin that also integrates with LifterLMS) + MemberPress The main reasons we hear from users who switched to LifterLMS after trying out the [best WordPress LMS plugins](https://lifterlms.com/blog/best-wordpress-lms-plugins/) is that LifterLMS has: + The best most feature-complete customizable well-coded features + Outstanding customer support including live calls + The free LifterLMS plugin is amazing making the project affordable + Memberships, ecommerce, and gamification included in LifterLMS without the need for 3rd party plugins ### Other Plugins and Themes Commonly Used with LifterLMS The most common plugins and themes used with LifterLMS include Elementor, WooCommerce, Contact Form 7, Yoast SEO, WP Forms Lite, Akismet Anti-Spam, Elementor, Jetpack by WordPress.com, Classic Editor, Updrafts Plus Backup/Restore, Realy Simple SSL, All-in-One WP Migration, WordPress Importer, Starter Templates, Wordfence Security, Google Analytics for WordPress by MonsterInsights, Loco Translate, Slider Revolution, Astra Pro, Essential Addons for Elementor, WP Mail SMTP, WooCommerce Stripe Gateway, LiteSpeed Cache, Jetpack, Gravity Forms, MailChimp for WooCommerce, BuddyPress, BuddyBoss, Divi, Kadnece, Beaver Builder, bbpress, The Events Calendar, Ultmate Member, and more. Connect LifterLMS to over 7,000 other apps like Facebook, Google Sheets, Zoom, Shopify, etc. using the [LifterLMS Zapier app](https://lifterlms.com/blog/zapier/). ### Support From LifterLMS **All of our paid products include priority private support. + LifterLMS Support Ticket System, ready for any question you have about your LMS + Liftoff Sessions access with live screen-sharing to help you get started with the LMS software + [LifterLMS Office Hours](https://lifterlms.com/product/office-hours/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) is a weekly Mastermind group hosted by LifterLMS CEO Chris Badgett and special guests ### Save on LifterLMS With A Bundle Save money and get more features. + [Earth Bundle](https://lifterlms.com/product/earth-bundle/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) gives you all the essentials you need to get your online learning website up and running so it's collecting money today with the most powerful secure learning management system software. + Level up your online course LMS website with our ecommerce, design, marketing technology, and automation tools with the [Universe Bundle](https://lifterlms.com/product/universe-bundle/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). + Add more engagement and student transformation potential to your immersive training programs with our entire suite of products including advanced features used by the best teachers, experts, and coaches with the [Infinity Bundle](https://lifterlms.com/product/infinity-bundle/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). ### Try the Best LMS Plugin + Install the free core LifterLMS plugin right now. See how extensive and customizable our free core plugin is. + Get a temporary _30 Day_ website on our servers with the core LifterLMS plugin AND all the premium add-ons installed. This demo website allows you to test drive all the LMS add-ons before you invest. Practice creating courses, test out the learner experience, and see how easy it will be to manage your course with WordPress. Install your favorite plugins & themes to test compatibility. **[Try LifterLMS for $1](https://lifterlms.com/try/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale)** now. + Test LifterLMS as a student. Take a **free** course on how to build a LifterLMS website in 20 minutes. [Take a Free Course](https://academy.lifterlms.com/course/how-to-build-a-learning-management-system-with-lifterlms/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) now. ### Scaling LifterLMS LifterLMS is incredibly flexible, customizable, and scalable. Use it for a simple one course website. Use it as a course marketplace or multi-instructor online school. LifterLMS is lightweight enough to handle small niche sites, while also powering huge universities and employee training in Fortune 500 corporations. We've even worked with a site that has 4,470,829 course enrollments. Unlike hosted LMS software where you would pay increasing monthly fees for access and growth, LifterLMS does not charge you more per course, per instructor, per student, or based on your revenue. Whether you are going big or keeping it small, LifterLMS scales to meet your needs. ### LifterLMS in Action + [Success Stories](https://lifterlms.com/success/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) — Discover these amazing stories and accomplishments from our community of course creators. + [Showcase](https://lifterlms.com/showcase/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale) — Check out these websites using LifterLMS ### What Others Are Saying About LifterLMS > _"I've used many LMS platforms over the years. And they were all fine… right up to the day when they weren't. The trouble is, they all want you to package and manage your course the way THEY think you should do it. THEIR feature set. THEIR way to do it. **Now I host all my courses on LifterLMS. TOTALLY different experience. I'm free to do things MY way. I've never yet hit a wall where LifterLMS didn't enable me to do things the way I wanted.** Love it! Great support and community too."_ > _**Nick Usborne**, Teacher, Entrepreneur_ *** > _"As a former School Teacher, professional User Experience Designer, and current online course creator – I can honestly attribute much of our success to LifterLMS and it’s consideration for multiple learning modalities, the LMS UI/UX out of the box, and natural student Engagement opportunities. **In less than 10 months we’ve gone from $0 to $300K in revenue with LifterLMS** playing a huge part in that!!"_ > _**Sarah Lorenzen**, Teacher, Entrepreneur_ *** ### Join Our Growing Community When you download LifterLMS, you **join a thriving community** of education entrepreneurs, course creators, developers, LMS professionals, and WordPress enthusiasts. We’re a fast growing open source eLearning community, and everyone seeking to build a sustainable online course business is welcome. Join the [LifterLMS VIP Facebook group](https://www.facebook.com/groups/lifterlmsvip/) to: + check out what other LifterLMS users are creating + ask questions and support fellow course creators Join the [LifterLMS Slack community](https://join.slack.com/t/lifterlms/shared_invite/enQtMzk3ODczNjc4Mjc3LTBlMmEzMWYyOTIwMDU3NDc2MmRhNGIxNGE0Nzc1OWIxZjg1OGVhM2E5YTkwYzZmMmM1ZTU4MDQxYjVlZDYyZTE) if you’d prefer to connect in Slack. ### Contribute Are you a developer interested in contributing to LifterLMS? Visit the [LifterLMS GitHub Repository](https://github.com/gocodebox/lifterlms/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) to find out how to support this open source WordPress LMS software. Want to add a new language to LifterLMS? Contribute language translations at [translate.wordpress.org](https://translate.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). ### What Should You Do Next? ** Install the free LifterLMS plugin on your website **, then ... **[Try out all the premium add-ons for $1 by signing up >>HERE<<](https://lifterlms.com/try/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale)** 🚀 ================================================ FILE: .wordpress-org/readme/10-installation.md ================================================ == Installation == #### Minimum System Requirements LifterLMS Requires + PHP 7.4 or later + WordPress 5.6 or later + MySQL 5.6 or later Visit our [full system requirements](https://lifterlms.com/docs/minimum-system-requirements-lifterlms/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) for additional information. #### Automatic Installation The simplest way to install LifterLMS is through your existing WordPress site’s admin. Let WordPress handle file transfers for you - you’ll never need to leave the web browser or admin panel. 1. Log in to your WordPress dashboard 2. Navigate to Plugins -> Add New 3. In the search field, type "LifterLMS" and click "Search Plugins" 4. Once you've located LifterLMS, click "Install Now" 5. Once installation is complete, click "Activate" #### Manual Installation To manually install LifterLMS, you'll need to download the zip file using the "Download" link on this screen. Then, use FTP to manually upload the unzipped plugin folder to the proper plugins directory on your webserver. Please see this [WordPress Codex document](https://wordpress.org/documentation/article/manage-plugins/#manual-plugin-installation-1) for full instructions on Manual Plugin Installation. #### Setup Wizard After installation, LifterLMS launches a friendly (and super quick) Setup Wizard. This wizard helps you configure LifterLMS so you can get to the fun stuff - like creating your courses - as quickly as possible. The wizard includes a few sample courses you can import if you want to see some examples before you start creating your own content. You can return to the setup wizard at any time by following [these steps](https://lifterlms.com/docs/rerun-lifterlms-setup-wizard/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). ================================================ FILE: .wordpress-org/readme/15-faqs.md ================================================ == Frequently Asked Questions == #### Where do I buy add-ons or bundles for my LifterLMS eLearning Website? You can explore the individual learning management system add-ons [here](https://lifterlms.com/store/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) or save BIG with a [bundle](https://lifterlms.com/product-category/bundles/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) #### How do I troubleshoot issues with my LMS website? First, make sure that you're running the latest version of LifterLMS. And if you've got any other LifterLMS plugins active on your site, make sure those are running the most current version as well. The most common issues we see are either plugin conflicts, theme conflicts, or outdated servers. You can test if a plugin or theme is conflicting by manually deactivating other plugins until just LifterLMS is running on your site. If the issue persists from there, revert to the default Twenty Fifteen theme. If the issue is resolved after deactivating a specific plugin or your theme, you'll know that is the source of the conflict. If it is a hosting issue, contact your web host and make sure they’re running the most current version of PHP. Also be sure to check out the official LifterLMS [Knowledge Base](https://lifterlms.com/docs/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). #### How do I ask a question about my online course website? Users of the free LifterLMS should post their questions here in our WordPress.org support area. If you find you're not getting support in as timely a fashion as you wish, you might want to consider [purchasing a product from LifterLMS](https://lifterlms.com/pricing/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) so you can access the LifterLMS support team. If you're already a LifterLMS customer, you can simply log into your account and contact the support team directly on the [LifterLMS website](https://lifterlms.com/my-account/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). We can provide a deeper level of support in there and address your needs on a daily basis during the work week. Generally, except in times of increased support loads, we reply to all comments within 12 business hours. #### LifterLMS is awesome! Can you set up my online course site for me? LifterLMS offers technical support, but we do not offer custom website development services. However, we do recommend third party LifterLMS Experts who can help with web design, web development, instructional design or marketing for a fee. Click here to visit the [LifterLMS Experts page](https://lifterlms.com/experts/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). #### I'm interested in purchasing add-ons for my WordPress LMS website, but I have a few questions first. If you're not finding your questions answered here or on our website, you can ask your presales questions through this [contact form](https://lifterlms.com/contact/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). You can also connect live with a member of our team [here](https://lifterlms.com/contact/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). #### What add-ons are available for LifterLMS, and where can I read more about them? You can find a full list of official LifterLMS Add-ons [here](https://lifterlms.com/store/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale) #### I have a feature idea. What's the best way to tell you about it? We care about your feature ideas and what you have to say. You can [request a feature](https://lifterlms.com/contact/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale), [vote on existing feature requests](?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale), and checkout the [product roadmap](https://lifterlms.com/roadmap/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). #### Do you have any training for building an online course website? Be sure you’ve taken the free tutorial training video course: [How to Create an Online Course with LifterLMS](https://academy.lifterlms.com/course/how-to-build-a-learning-management-system-with-lifterlms/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale). We also encourage you to get to know us by signing up for a $1 temporary _30 Day_ website on our servers which comes with the core LifterLMS plugin all our add-ons intalled. This demo allows you to test drive all the add-ons before you invest. Check it out here: **[Try LifterLMS for $1](https://lifterlms.com/try/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale)**. #### I'm interested in contributing to LifterLMS, how can I start? LifterLMS is an open source project. We manage our team, developers, issues, and code on [GitHub](https://github.com/gocodebox/lifterlms/). We welcome contributions of all kinds, anyone can contribute even if you don't write code! Check out our [Contributor's Guidelines](https://github.com/gocodebox/lifterlms/blob/master/.github/CONTRIBUTING.md) to get started. #### I found a security vulnerability or issue, how can I report it to the team? The LifterLMS team takes security issues and vulnerabilities very seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. Please contact team@lifterlms.com to report a security vulnerability. You can review our full security policy at [https://lifterlms.com/security-policy](https://lifterlms.com/security-policy). ================================================ FILE: .wordpress-org/readme/20-screenshots.md ================================================ == Screenshots == 1. Infinitely customizable course catalog layouts: shown with course title, featured image, and instructor information. 2. View a single course with customizable content including access plans, difficulty, instructor, and lesson syllabus. 3. Edit courses in the WordPress block editor to add pricing tables, progress, outline, and more content. 4. Use the interactive Course Builder to structure your course, sections, lessons, quizzes, assignments and more. 5. Dashboard for course creators in the WordPress admin: an overview of recent statistics and quick links to common admin screens. 6. Advanced reporting for every learner so admins can track an individual students's course progress, membership, engagements, and achievements. 7. Clean and organized plugin settings to help you quickly and easily set up your course or membership site. 8. Detailed sales and enrollment reporting with built-in time periods or custom fields to filter by term, student, course, and membership. 9. Setup Wizard to help you install and configure your new online course website with LifterLMS in 5 simple steps. ================================================ FILE: .wordpress-org/readme/25-changelog.md ================================================ == Changelog == {{__CHANGELOG_ENTRIES__}} [Read the full changelog]({{__READ_MORE_LINK__}}) ================================================ FILE: CHANGELOG.md ================================================ LifterLMS Changelog =================== v10.0.0 - 2026-05-01 -------------------- ##### New Features + Lesson content can be edited within the Course Builder for new lessons, or existing lessons with no existing content. + Adding tab for Events. + Added an explicit 'Any' trigger option for engagements so one engagement can apply to all matching courses, memberships, lessons, quizzes, sections, access plans, or tracks. [#3109](https://github.com/gocodebox/lifterlms/issues/3109) + Adding new "focus mode" when viewing lessons and quizzes in a course. + Added [lifterlms_lesson_navigation] shortcode. ##### Updates and Enhancements + Adding order note when changing the access expiration date. + Add additional check for course capacity on the checkout page. [#3086](https://github.com/gocodebox/lifterlms/issues/3086) + Allow admin to mark lesson complete with unpublished quiz. [#3127](https://github.com/gocodebox/lifterlms/issues/3127) + Scroll to the top of the quiz UI area when a quiz question is loaded. + Various course builder fixes, with quizzes set to published by default. [#3033](https://github.com/gocodebox/lifterlms/issues/3033), [#3056](https://github.com/gocodebox/lifterlms/issues/3056), [#3097](https://github.com/gocodebox/lifterlms/issues/3097), [#2938](https://github.com/gocodebox/lifterlms/issues/2938), [#3030](https://github.com/gocodebox/lifterlms/issues/3030) + Using standard WP nonce check functions instead of llms_verify_nonce. + Removing use of SQL_CALC_FOUND_ROWS due to depreciation in MySQL and observed unreliability of count results. + Updating helper and rest libraries, which switch to using standard WP nonce check functions. ##### Bug Fixes + Show "Mark Complete" button when quiz requirements are already met. Thanks [@faisalahammad](https://github.com/faisalahammad)! [#3058](https://github.com/gocodebox/lifterlms/issues/3058) + Strip formatting when pasting into Course Builder title fields. Thanks [@faisalahammad](https://github.com/faisalahammad)! [#3057](https://github.com/gocodebox/lifterlms/issues/3057) + Avoid "block not found" error in the theme template editor. + Avoid error protecting media image when multiple thumbnail of same size exist, or registered thumbnail size is missing. [#3129](https://github.com/gocodebox/lifterlms/issues/3129) + Close lesson settings panel when lesson has been trashed. + Fix lifterlms_loop_columns filter styling to change the number of columns in a loop (ie. Course Catalog). [#3101](https://github.com/gocodebox/lifterlms/issues/3101) + Fix pagination for My Courses when using Plain style permalinks. [#3134](https://github.com/gocodebox/lifterlms/issues/3134) + Avoids PHP warning for passing null to exit() when using llms_exit(). + Avoid "Launch Course Builder" showing on orphaned lessons. [#2943](https://github.com/gocodebox/lifterlms/issues/2943) ##### Deprecations + Removing unused LLMS_Update class. [#1981](https://github.com/gocodebox/lifterlms/issues/1981) ##### Developer Notes + Adding actions for add-ons to insert additional blocks when a post is migrated to the block editor. + Filter for modifying the field for a Media attachement. ##### Updated Templates + [templates/course/outline-list-small.php](https://github.com/gocodebox/lifterlms/blob/10.0.0/templates/course/outline-list-small.php) + [templates/loop/pagination.php](https://github.com/gocodebox/lifterlms/blob/10.0.0/templates/loop/pagination.php) + [templates/single-lesson-focus.php](https://github.com/gocodebox/lifterlms/blob/10.0.0/templates/single-lesson-focus.php) v9.2.3 - 2026-04-07 ------------------- ##### Security Fixes + Additional permission checks when performing certain admin actions. Thanks [@nobody090909](https://github.com/nobody090909)! v9.2.2 - 2026-03-31 ------------------- ##### Updates and Enhancements + Various escaping and consistency changes. ##### Bug Fixes + Removes use of deprecated mb_convert_encoding(). [#2672](https://github.com/gocodebox/lifterlms/issues/2672) ##### Security Fixes + Validation of the order param for the quiz Students Without Attempts table. ##### Updated Templates + [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/9.2.2/templates/course/lesson-preview.php) + [templates/myaccount/my-grades-single-table.php](https://github.com/gocodebox/lifterlms/blob/9.2.2/templates/myaccount/my-grades-single-table.php) + [templates/quiz/questions/content-choice.php](https://github.com/gocodebox/lifterlms/blob/9.2.2/templates/quiz/questions/content-choice.php) + [templates/quiz/questions/content-picture_choice.php](https://github.com/gocodebox/lifterlms/blob/9.2.2/templates/quiz/questions/content-picture_choice.php) v9.2.1 - 2026-02-02 ------------------- ##### Bug Fixes + Fix course data calculation not ending since 9.2.0. [#3087](https://github.com/gocodebox/lifterlms/issues/3087) v9.2.0 - 2026-01-15 ------------------- ##### New Features + Adding "Order (High to Low)" sorting option for the Course and Membership Catalog. [#3074](https://github.com/gocodebox/lifterlms/issues/3074) + New global and course-level option to specify a page to redirect to upon course completion. + Ability to edit pricing for future charges of a recurring Order. ##### Updates and Enhancements + Renaming "Basic" notification to "Popup" for clarity. + Avoid showing license key on error. ##### Bug Fixes + Additional verifications when checking for an Elementor post to avoid fatal errors in some cases. [#3065](https://github.com/gocodebox/lifterlms/issues/3065) + Allow selection of all categories in the Courses block when there are more than 10 categories. [#3078](https://github.com/gocodebox/lifterlms/issues/3078) + Fixing aria label output for course favorites. Thanks [@DAnn2012](https://github.com/DAnn2012)! + Avoid fatal error when importing a course with an empty picture choice question. [#3070](https://github.com/gocodebox/lifterlms/issues/3070) + Fix protected images not loading on WPEngine hosting. [#3048](https://github.com/gocodebox/lifterlms/issues/3048) + Fix count of currently enrolled students in the Course overview reporting for certain hosts and number of students. [#3073](https://github.com/gocodebox/lifterlms/issues/3073) + Handle possible array of arrays in admin settings. ##### Updated Templates + [templates/course/favorite.php](https://github.com/gocodebox/lifterlms/blob/9.2.0/templates/course/favorite.php) v9.1.2 - 2025-11-20 ------------------- ##### Updates and Enhancements + Changed options for a new Access Plan to include gifts, and removing the Free Trial option. ##### Bug Fixes + Avoid warning when creating the first access plan on a course/membership. [#3046](https://github.com/gocodebox/lifterlms/issues/3046) ##### Developer Notes + Filters for displaying already enrolled message during checkout. + Filter to avoid sending a Purchase Receipt under certain conditions. + Filter to prevent automatic enrollment in a product after purchase completed. v9.1.1 - 2025-11-11 ------------------- ##### Security Fixes + Fixes security issue where student and instructor REST APIs can be used to modify roles incorrectly. Thanks [@shark3y](https://github.com/shark3y)! v9.1.0 - 2025-11-03 ------------------- ##### New Features + New tabs to view students who have not yet attempted a quiz, and listing of all quiz attempts for a student. + Option to allow unlimited time for a time-limited quiz to certain users. ##### Updates and Enhancements + Apply filters to save any additional fields added to LifterLMS metaboxes. + Adjusting syllabus styling for clarity on what can be clicked to navigate to a lesson. [#3041](https://github.com/gocodebox/lifterlms/issues/3041) + Template changes for improved accessibility when taking a quiz when using a keyboard or screen reader. + Re-label "Exit Quiz" button for clarity on resumable quizzes. [#3025](https://github.com/gocodebox/lifterlms/issues/3025) + Show order summary for free enrolments. + Removing "Estimated Completion Time" option from the Course Information block. [#3016](https://github.com/gocodebox/lifterlms/issues/3016) + Show warning and avoid generating invalid checkout URLs if no Checkout Page is configured. [#2984](https://github.com/gocodebox/lifterlms/issues/2984) + Making default password strength "weak" and changing strength requirements to minimize friction during checkout. [#2848](https://github.com/gocodebox/lifterlms/issues/2848) ##### Bug Fixes + Fix wording for adding a featured video on memberships. [#3034](https://github.com/gocodebox/lifterlms/issues/3034) + Fixing "user email required" warning when editing a LifterLMS form and changing a pattern. [#2644](https://github.com/gocodebox/lifterlms/issues/2644) ##### Developer Notes + Additional filter to change available merge codes for certificates. + Adds llms_embed_shortcode_output filter. + Filter to control whether a question choice is marked as correct. ##### Updated Templates + [templates/admin/reporting/tabs/quizzes/non-attempts.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/admin/reporting/tabs/quizzes/non-attempts.php) + [templates/admin/reporting/tabs/students/quiz_attempts.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/admin/reporting/tabs/students/quiz_attempts.php) + [templates/admin/reporting/tabs/students/student.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/admin/reporting/tabs/students/student.php) + [templates/checkout/form-checkout.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/checkout/form-checkout.php) + [templates/quiz/meta-information.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/quiz/meta-information.php) + [templates/quiz/questions/content-choice.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/quiz/questions/content-choice.php) + [templates/quiz/questions/content-picture_choice.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/quiz/questions/content-picture_choice.php) + [templates/quiz/results.php](https://github.com/gocodebox/lifterlms/blob/9.1.0/templates/quiz/results.php) v9.0.7 - 2025-09-16 ------------------- ##### Bug Fixes + Additional check to avoid conflict with certain plugins alongside the Classic Editor. [#3012](https://github.com/gocodebox/lifterlms/issues/3012) + Fixing checkout for countries that have no states/provinces/regions listed. v9.0.6 - 2025-08-28 ------------------- ##### Updates and Enhancements + Upgrades select2 library to latest release. ##### Bug Fixes + Avoid loading the media protection attachment scripts when not needed. [#3004](https://github.com/gocodebox/lifterlms/issues/3004) + Fix for "only recurring access plan" coupons. [#3002](https://github.com/gocodebox/lifterlms/issues/3002) v9.0.5 - 2025-08-25 ------------------- ##### Bug Fixes + Fix to allow checkout with UK and several other countries with no states/provinces/regions/areas. [#2997](https://github.com/gocodebox/lifterlms/issues/2997) v9.0.4 - 2025-08-19 ------------------- ##### Bug Fixes + Avoid fatal error if another plugin has loaded the Banner Notifications library. v9.0.3 - 2025-08-19 ------------------- ##### Bug Fixes + Additional checks for valid courses during the setup wizard. [#2992](https://github.com/gocodebox/lifterlms/issues/2992) v9.0.2 - 2025-08-19 ------------------- ##### Bug Fixes + Avoid fatal error during setup wizard if list of courses to import cannot be fetched. [#2992](https://github.com/gocodebox/lifterlms/issues/2992) + Avoid i18n translation warning on brand new site when scheduling cron. [#2990](https://github.com/gocodebox/lifterlms/issues/2990) v9.0.1 - 2025-08-18 ------------------- ##### Bug Fixes + Fix "unsaved changes" warning when navigating away from a course/membeship with instructors block in it. [#2986](https://github.com/gocodebox/lifterlms/issues/2986) v9.0.0 - 2025-08-18 ------------------- ##### New Features + Adding Mailhawk back to the email provider services. + Ability to protect media files for those enrolled in a specified Course or Membership. + Adding banner notifications. + Option for automatically blocking checkout spam. + Support for Turnstile, reCAPTCHA v3 and Akismet with checkout and registration forms. + Link to detach a Lesson from the course and section in the Lessons listing. [#2944](https://github.com/gocodebox/lifterlms/issues/2944) + Featured video and audio options for Memberships. + Mobile navigation for the Student Dashboard. [#2907](https://github.com/gocodebox/lifterlms/issues/2907) ##### Updates and Enhancements + Avoid showing hidden courses or memberships in a theme's next/previous links. [#2910](https://github.com/gocodebox/lifterlms/issues/2910) + Additional payment gateway information notices. + Avoid rendering LifterLMS blocks hidden in Text Editor blocks when using Elementor. [#2886](https://github.com/gocodebox/lifterlms/issues/2886) + Filter to change the method used to fetch environment variables on certain hosting configurations. [#2383](https://github.com/gocodebox/lifterlms/issues/2383) + Improved formatting of the individual order page. + Moving instructors and Estimated Length from the sidebar to the main metabox options area in Courses and Memberships. + Changes button text when updating a payment method,depending on whether it's a payment gateway with an external payment page. [#2957](https://github.com/gocodebox/lifterlms/issues/2957) + Updating countries and states/countries/provinces. [#2151](https://github.com/gocodebox/lifterlms/issues/2151) ##### Bug Fixes + Can select an access plan with the Access Plan Button block when more than 10 access plans exist on the site. [#2526](https://github.com/gocodebox/lifterlms/issues/2526) + Schedule course data recalculation throttles in the future, with new tool to clear incorrectly locked courses. [#2916](https://github.com/gocodebox/lifterlms/issues/2916) + Now able to clear the value from date fields. [#2977](https://github.com/gocodebox/lifterlms/issues/2977) + Avoid fatal error if a user who enrolled a student has been deleted, when viewing the course edit page. [#2979](https://github.com/gocodebox/lifterlms/issues/2979) + Avoid breaking the layout on student dashboard pages with a form (ie. Edit Account, Redeem a Voucher). [#2946](https://github.com/gocodebox/lifterlms/issues/2946) + Avoid console error when saving access plans when a free plan is included. [#2925](https://github.com/gocodebox/lifterlms/issues/2925) + Avoid duplicated buttons when changing the Engagement Type when editing an engagement. [#2962](https://github.com/gocodebox/lifterlms/issues/2962) + Fix link beside selected engagement when editing an engagement. [#2961](https://github.com/gocodebox/lifterlms/issues/2961) + Resolves warning when first visiting the Logs tab. [#2947](https://github.com/gocodebox/lifterlms/issues/2947) + Improved styling for course catalog and other grid layouts, including fix for course/membership featured video display. + Allow clearing membership restrictions without switching plan availability. [#2931](https://github.com/gocodebox/lifterlms/issues/2931) ##### Developer Notes + Adding hookable filter for notification sending. ##### Updated Templates + [templates/checkout/form-switch-source.php](https://github.com/gocodebox/lifterlms/blob/9.0.0/templates/checkout/form-switch-source.php) + [templates/loop/featured-image.php](https://github.com/gocodebox/lifterlms/blob/9.0.0/templates/loop/featured-image.php) + [templates/membership/audio.php](https://github.com/gocodebox/lifterlms/blob/9.0.0/templates/membership/audio.php) + [templates/membership/video.php](https://github.com/gocodebox/lifterlms/blob/9.0.0/templates/membership/video.php) + [templates/myaccount/my-orders.php](https://github.com/gocodebox/lifterlms/blob/9.0.0/templates/myaccount/my-orders.php) + [templates/myaccount/navigation.php](https://github.com/gocodebox/lifterlms/blob/9.0.0/templates/myaccount/navigation.php) v8.0.7 - 2025-06-11 ------------------- ##### Security Fixes + Additional sanitation of the voucher field. v8.0.6 - 2025-04-21 ------------------- ##### Bug Fixes + Fix error when editing a lesson with a drip setting of a specific date. [#2926](https://github.com/gocodebox/lifterlms/issues/2926) v8.0.5 - 2025-04-17 ------------------- ##### Updates and Enhancements + Modifies the allowed HTML for a form, in case the allowed post values in WP have been filtered. [#2922](https://github.com/gocodebox/lifterlms/issues/2922) v8.0.4 - 2025-04-11 ------------------- ##### Bug Fixes + Avoid warning and possible error when serving protected files. [#2912](https://github.com/gocodebox/lifterlms/issues/2912) v8.0.3 - 2025-04-07 ------------------- ##### New Features + Initial support for the Bricks theme. + New "# of transactions" sales reporting widget. ##### Updates and Enhancements + Change default date display format of lifterlms_course_info used in settings like Enrollment Start and End Date to match the site date format. [#2903](https://github.com/gocodebox/lifterlms/issues/2903) + Display date pickers in the site date format, but save the data in the previous format. [#2447](https://github.com/gocodebox/lifterlms/issues/2447) + Update Last Activity Date label to accurately reflect the data value. [#2898](https://github.com/gocodebox/lifterlms/issues/2898) ##### Bug Fixes + Updating postal code (eircode) display for Ireland. [#2891](https://github.com/gocodebox/lifterlms/issues/2891) + Net Sales reporting includes partially refunded transactions, and transactions from orders regardless of status. [#2860](https://github.com/gocodebox/lifterlms/issues/2860), [#2861](https://github.com/gocodebox/lifterlms/issues/2861) + On-hold, pending cancellation, cancelled and expired orders now included in "# of Sales" widget. [#2860](https://github.com/gocodebox/lifterlms/issues/2860) + Fixes sales reporting for transactions or orders that happened between 23:23:59 and midnight. [#2858](https://github.com/gocodebox/lifterlms/issues/2858) + Password reset email is now in the user's language. [#2879](https://github.com/gocodebox/lifterlms/issues/2879) ##### Developer Notes + Adds a new action so Turnstile or other captchas can be added without editing the free-enroll-form.php template directly. ##### Updated Templates + [templates/admin/reporting/tabs/students/courses-course.php](https://github.com/gocodebox/lifterlms/blob/8.0.3/templates/admin/reporting/tabs/students/courses-course.php) + [templates/product/free-enroll-form.php](https://github.com/gocodebox/lifterlms/blob/8.0.3/templates/product/free-enroll-form.php) v8.0.2 - 2025-03-17 ------------------- ##### Bug Fixes + Avoid escaping the selected attribute of a form field select dropdown incorrectly. + Adds additional verifications on permission for bulk enrolls, and REST API access for instructors. + Updates helper library to remove depreciated notice when adding a license key. ##### Security Fixes + Additional checks for managing LifterLMS data. Thanks [@mikemyers](https://github.com/mikemyers)! ##### Updated Templates + [templates/course/favorite.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/course/favorite.php) + [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/course/lesson-preview.php) + [templates/global/form-login.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/global/form-login.php) + [templates/global/form-registration.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/global/form-registration.php) + [templates/loop/featured-pricing.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/loop/featured-pricing.php) + [templates/myaccount/form-edit-account.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/myaccount/form-edit-account.php) + [templates/myaccount/form-redeem-voucher.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/myaccount/form-redeem-voucher.php) + [templates/myaccount/my-grades-single.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/myaccount/my-grades-single.php) + [templates/notifications/basic.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/notifications/basic.php) + [templates/product/access-plan-button.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/product/access-plan-button.php) + [templates/product/free-enroll-form.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/product/free-enroll-form.php) + [templates/quiz/questions/description.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/quiz/questions/description.php) + [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/8.0.2/templates/quiz/results-attempt-questions-list.php) v8.0.1 - 2025-02-06 ------------------- ##### New Features + Setting to increase the frequency user tracked events are saved. ##### Bug Fixes + Additional escaping for form permalinks. + Allow quiz question to be retrieved even if attempt limit reached when resuming a quiz. [#2865](https://github.com/gocodebox/lifterlms/issues/2865) + Avoid grades table wrapping in the My Grades section of the student dashboard. [#2869](https://github.com/gocodebox/lifterlms/issues/2869) + Open the lesson panel after adding a new lesson in the Course Builder. [#2855](https://github.com/gocodebox/lifterlms/issues/2855) + Fixed PHP >= 8.3 warning when using WP CLI. Thanks [@jv-mtrz](https://github.com/jv-mtrz)! ##### Deprecations + Fixed issues with viewing quiz attempts when questions were deleted. ##### Updated Templates + [templates/myaccount/my-grades-single.php](https://github.com/gocodebox/lifterlms/blob/8.0.1/templates/myaccount/my-grades-single.php) + [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/8.0.1/templates/quiz/results-attempt-questions-list.php) v8.0.0 - 2025-01-20 ------------------- ##### New Features + New popup when adding an Access Plan with templates to help set options quickly. + Adds support for Beaver Builder for Courses, Memberships and Lessons. [#2761](https://github.com/gocodebox/lifterlms/issues/2761) + Ability to show typed password for verification on the Student Dashboard login form. + Adds new "Featured Pricing Information" setting for Courses and Memberships. + Showing 'Has Quiz' or 'Has Assignment' in the Course Syllabus. ##### Updates and Enhancements + Improved accessibility of various front-end and back-end UIs including the Access Plans metaboxes to use proper labels and screen reader text where needed. + Allow lesson access based on enrollment drip setting with Course Start Date set. [#2843](https://github.com/gocodebox/lifterlms/issues/2843) + Course Information header is now h2 instead of h3 by default, for accessibility in heading order. + Adding purchase checkout link to the access plan header as an icon. [#2793](https://github.com/gocodebox/lifterlms/issues/2793) + Accessibility updates for lesson favorite and write a review forms. [#2852](https://github.com/gocodebox/lifterlms/issues/2852) ##### Bug Fixes + Allow additional shortcodes like [audio] within the description (content) of a quiz question. + Can now deactivate the Confirmation field for blocks like E-mail address and Password in forms. [#2646](https://github.com/gocodebox/lifterlms/issues/2646) + Fix SendWP connect button. [#2792](https://github.com/gocodebox/lifterlms/issues/2792) + Avoid unloading the textdomain for core translations in case the lifterlms textdomain is used before init (WP 6.7). [#2807](https://github.com/gocodebox/lifterlms/issues/2807) + Avoid wrapping of the text of buttons. [#2820](https://github.com/gocodebox/lifterlms/issues/2820) ##### Developer Notes + Improved llmsPostsSelect2 method when called on multiple elements at once, each with different options. [#2805](https://github.com/gocodebox/lifterlms/issues/2805) ##### Updated Templates + [templates/course/favorite.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/course/favorite.php) + [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/course/lesson-preview.php) + [templates/global/form-login.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/global/form-login.php) + [templates/global/form-registration.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/global/form-registration.php) + [templates/loop/featured-pricing.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/loop/featured-pricing.php) + [templates/myaccount/form-edit-account.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/myaccount/form-edit-account.php) + [templates/myaccount/form-redeem-voucher.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/myaccount/form-redeem-voucher.php) + [templates/notifications/basic.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/notifications/basic.php) + [templates/product/access-plan-button.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/product/access-plan-button.php) + [templates/product/free-enroll-form.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/product/free-enroll-form.php) + [templates/quiz/questions/description.php](https://github.com/gocodebox/lifterlms/blob/8.0.0/templates/quiz/questions/description.php) v7.8.7 - 2024-12-17 ------------------- ##### Bug Fixes + Fix translation error during the setup wizard. [#2835](https://github.com/gocodebox/lifterlms/issues/2835) + Fixes Pagespeed notice regarding deprecated Javascript event usage. [#2620](https://github.com/gocodebox/lifterlms/issues/2620) v7.8.6 - 2024-12-16 ------------------- ##### Bug Fixes + Adds additional check for valid quiz attempt key when ending or exiting a quiz. [#2824](https://github.com/gocodebox/lifterlms/issues/2824) + Fix for daylight savings and leap years when scheduling engagements. [#2799](https://github.com/gocodebox/lifterlms/issues/2799) + Avoid showing course opens message if no Course Start Date has been set. [#2810](https://github.com/gocodebox/lifterlms/issues/2810) + Improved accessibility of the lessons listing on a course page, when a lesson is restricted. [#2827](https://github.com/gocodebox/lifterlms/issues/2827) ##### Security Fixes + Adding additional checks before the deletion of a certificate. Thanks Lucio Sá! ##### Updated Templates + [templates/content-single-course-before.php](https://github.com/gocodebox/lifterlms/blob/7.8.6/templates/content-single-course-before.php) + [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/7.8.6/templates/course/lesson-preview.php) v7.8.5 - 2024-12-03 ------------------- ##### Updates and Enhancements + Now allows copying of text in input and textarea elements, even if copy protection is enabled. ##### Security Fixes + Fix to avoid saving password confirmation in user meta if Password block has been edited. [#2821](https://github.com/gocodebox/lifterlms/issues/2821) v7.8.4 - 2024-11-18 ------------------- ##### Bug Fixes + Fix translations not loading for LifterLMS in WordPress 6.7. [#2807](https://github.com/gocodebox/lifterlms/issues/2807) v7.8.3 - 2024-11-04 ------------------- ##### Updates and Enhancements + Switches new access plans to Paid by default in the new access plan UI. [#2794](https://github.com/gocodebox/lifterlms/issues/2794) v7.8.2 - 2024-10-31 ------------------- ##### Updates and Enhancements + Additional styling of the new Access Plan UI. ##### Bug Fixes + Renaming front-end javascript translation file not required, as some security scans appear to be deleting it incorrectly. [#2787](https://github.com/gocodebox/lifterlms/issues/2787) v7.8.1 - 2024-10-29 ------------------- ##### Bug Fixes + Fixing migration to allow SKUs to be entered in access plans if one already exists. v7.8.0 - 2024-10-29 ------------------- ##### New Features + Added attribute 'layout' to My Account block and shortcode to display content as columns or stacked. + Changes styling in the Course Syllabus block for the current lesson, when used on a single lesson page. [#2777](https://github.com/gocodebox/lifterlms/issues/2777) + Added new feature: Quiz Resume. [#2783](https://github.com/gocodebox/lifterlms/issues/2783) ##### Updates and Enhancements + Improved UI of the Access Plans UI for better usability. + Improved accessibility of the Access Plans metaboxes to use proper labels and screen reader text where needed. + Added Launch Course Builder to the WP Admin Bar when viewing a course. + Added Launch Course Builder button when using the Classic Editor, beside “Add Course” button. + Added “Clear Reporting Cache” button on admin reporting page. + Improved help messaging on the Course Builder, and the Account and Checkout tabs of the LifterLMS settings. + Added support for image upload in Result Clarifications box for quizzes. + Removes spacing before or after answers for conditional quiz questions. ##### Bug Fixes + Fixed reference in `LLMS_Ajax_Handler::quiz_start()` to `LLMS_Quiz_Attempt::get_status()` method removed since LifterLMS 4.0.0. + Fix for notifications no longer auto-dismissing. [#2772](https://github.com/gocodebox/lifterlms/issues/2772) + Fix for the lifterlms_registration shortcode not working on certain themes on a separate page. [#2779](https://github.com/gocodebox/lifterlms/issues/2779) + Using a more reliable method of keeping LifterLMS notices dismissed. [#2767](https://github.com/gocodebox/lifterlms/issues/2767) ##### Breaking Changes + Hiding the Plan SKU field for access plans if not in use. Set the `llms_access_plans_allow_skus` option to get this field back. ##### Developer Notes + Adds current-lesson CSS class for the current Lesson in the Course Syllabus block. [#2777](https://github.com/gocodebox/lifterlms/issues/2777) + Adds new llms_before_registration_validation filter for 3rd party open registration validation. + Added filter `llms_quiz_attempt_resume_time_period` for updating quiz resume allowed time period. ##### Updated Templates + [templates/admin/reporting/tabs/quizzes/attempt.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/admin/reporting/tabs/quizzes/attempt.php) + [templates/checkout/form-checkout.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/checkout/form-checkout.php) + [templates/checkout/form-summary.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/checkout/form-summary.php) + [templates/content-single-question.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/content-single-question.php) + [templates/myaccount/form-redeem-voucher.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/myaccount/form-redeem-voucher.php) + [templates/myaccount/header.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/myaccount/header.php) + [templates/notifications/basic.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/notifications/basic.php) + [templates/quiz/questions/content-choice.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/quiz/questions/content-choice.php) + [templates/quiz/questions/content-picture_choice.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/quiz/questions/content-picture_choice.php) + [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/quiz/results-attempt-questions-list.php) + [templates/quiz/results-attempt.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/quiz/results-attempt.php) + [templates/quiz/results.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/quiz/results.php) + [templates/quiz/start-button.php](https://github.com/gocodebox/lifterlms/blob/7.8.0/templates/quiz/start-button.php) v7.7.8 - 2024-09-17 ------------------- ##### Bug Fixes + Update version of the Blocks library to avoid having an unsaved changes prompt appear after updating an access plan on a course. + Fix for pricing display with additional formatting. [#2762](https://github.com/gocodebox/lifterlms/issues/2762) v7.7.7 - 2024-09-12 ------------------- ##### Bug Fixes + Avoid modifying non-LifterLMS block component styling in the editor. [#2752](https://github.com/gocodebox/lifterlms/issues/2752) + Use student email for the student login merge code in notification emails if usernames are not used. [#2755](https://github.com/gocodebox/lifterlms/issues/2755) + Show video or audio embed URLs in lessons which are valid but contain special characters. [#2749](https://github.com/gocodebox/lifterlms/issues/2749) v7.7.6 - 2024-08-22 ------------------- ##### Bug Fixes + Avoid modifying the Lost Password link if no LifterLMS Dashboard page is set. [#2741](https://github.com/gocodebox/lifterlms/issues/2741) + Fixes placeholder label on the Dashboard Page selection dropdown. [#2708](https://github.com/gocodebox/lifterlms/issues/2708) + Avoid outputting lifterlms_membership_link content if the membership is not published. [#2724](https://github.com/gocodebox/lifterlms/issues/2724) + Fix display of quiz question when viewing the quiz results if it contains formatting. [#2734](https://github.com/gocodebox/lifterlms/issues/2734) + Fixes sanitization as reported by FKSEC. + Fixes warning when trying to get the contents of a media protection file that does not exist. [#2735](https://github.com/gocodebox/lifterlms/issues/2735) ##### Updated Templates + [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/7.7.6/templates/quiz/results-attempt-questions-list.php) v7.7.5 - 2024-08-15 ------------------- ##### Bug Fixes + Show video tiles for courses on the Dashboard and My Courses pages when enabled. [#2728](https://github.com/gocodebox/lifterlms/issues/2728) ##### Updated Templates + [templates/myaccount/dashboard-section.php](https://github.com/gocodebox/lifterlms/blob/7.7.5/templates/myaccount/dashboard-section.php) v7.7.4 - 2024-08-13 ------------------- ##### Bug Fixes + Reverts changes to restricting pages by membership functionality to avoid conflicts with certain themes and plugins. [#2714](https://github.com/gocodebox/lifterlms/issues/2714) v7.7.3 - 2024-08-12 ------------------- ##### Bug Fixes + Fixes revenue display in the Orders table. [#2719](https://github.com/gocodebox/lifterlms/issues/2719) v7.7.2 - 2024-08-12 ------------------- ##### Bug Fixes + Fixes fatal error when updating from an old version. Thanks [@verygoodplugins](https://github.com/verygoodplugins)! [#2716](https://github.com/gocodebox/lifterlms/issues/2716) + Avoid errors on pages restricted by one or more memberships. [#2714](https://github.com/gocodebox/lifterlms/issues/2714) v7.7.1 - 2024-08-09 ------------------- ##### Updates and Enhancements + Removes placeholder image functionality with protected media files. Modify cache value for wordpress.com hosting. ##### Bug Fixes + Fixing the Award Certificate button appearing at the top of the Reporting > Students, Certificate tab. [#2709](https://github.com/gocodebox/lifterlms/issues/2709) + Fixed warnings from running `wp_kses_post()` on empty `paginate_links()` calls. ##### Updated Templates + [templates/myaccount/my-notifications.php](https://github.com/gocodebox/lifterlms/blob/7.7.1/templates/myaccount/my-notifications.php) v7.7.0 - 2024-07-19 ------------------- ##### New Features + Adding read-only input for easier sharing of a certificate. Thanks [@imknight](https://github.com/imknight)! [#1379](https://github.com/gocodebox/lifterlms/issues/1379) + Adds additional protection for media files uploaded to quiz questions in the Course Builder. + Adds native Elementor support for Courses, with a default Course template and several basic widgets. ##### Updates and Enhancements + Removes the Visibility setting for Vouchers and Coupons. [#2640](https://github.com/gocodebox/lifterlms/issues/2640) + Updating internal libraries to their latest versions. + Added support for mutliple membership restriction warning. [#2523](https://github.com/gocodebox/lifterlms/issues/2523) ##### Bug Fixes + Prevent backslashes from being removed from Result Clarifications. [#2675](https://github.com/gocodebox/lifterlms/issues/2675) + Avoids JS error on the front-end. [#2678](https://github.com/gocodebox/lifterlms/issues/2678) + Exclude hidden courses when toggled off in the Courses block. [#2690](https://github.com/gocodebox/lifterlms/issues/2690) + Avoids saving review meta information for non-courses. Thanks [@bsetiawan88](https://github.com/bsetiawan88)! [#887](https://github.com/gocodebox/lifterlms/issues/887) + Improvements to the frontend styling of LifterLMS screens for design, accessibility, and better compatibility with dark mode themes. + Allow private VideoPress videos to play when the URL is pasted on Video Embed URL. [#2533](https://github.com/gocodebox/lifterlms/issues/2533) + Fixes the Certificate Title block when creating a new certificate template. [#2696] (https://github.com/gocodebox/lifterlms/issues/2696) ##### Security Fixes + Adds various security improvements, e.g. better escaping of output, as suggested by the Plugin Checker Plugin. ##### Performance Improvements + Caching get_transaction_total queries to improve performance of the orders table in the admin dashboard. ##### Updated Templates + [templates/achievements/loop.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/achievements/loop.php) + [templates/achievements/template.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/achievements/template.php) + [templates/admin/analytics/analytics.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/analytics/analytics.php) + [templates/admin/notices/staging.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/notices/staging.php) + [templates/admin/post-types/order-transactions.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/post-types/order-transactions.php) + [templates/admin/post-types/students.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/post-types/students.php) + [templates/admin/reporting/nav-filters.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/nav-filters.php) + [templates/admin/reporting/reporting.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/reporting.php) + [templates/admin/reporting/tabs/courses/course.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/courses/course.php) + [templates/admin/reporting/tabs/courses/overview.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/courses/overview.php) + [templates/admin/reporting/tabs/courses/students.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/courses/students.php) + [templates/admin/reporting/tabs/memberships/membership.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/memberships/membership.php) + [templates/admin/reporting/tabs/memberships/overview.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/memberships/overview.php) + [templates/admin/reporting/tabs/memberships/students.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/memberships/students.php) + [templates/admin/reporting/tabs/quizzes/attempt.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/quizzes/attempt.php) + [templates/admin/reporting/tabs/quizzes/attempts.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/quizzes/attempts.php) + [templates/admin/reporting/tabs/quizzes/overview.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/quizzes/overview.php) + [templates/admin/reporting/tabs/quizzes/quiz.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/quizzes/quiz.php) + [templates/admin/reporting/tabs/students/achievements.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/achievements.php) + [templates/admin/reporting/tabs/students/certificates.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/certificates.php) + [templates/admin/reporting/tabs/students/courses-course.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/courses-course.php) + [templates/admin/reporting/tabs/students/courses.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/courses.php) + [templates/admin/reporting/tabs/students/information.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/information.php) + [templates/admin/reporting/tabs/students/memberships.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/memberships.php) + [templates/admin/reporting/tabs/students/student.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/student.php) + [templates/admin/reporting/tabs/students/students.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/reporting/tabs/students/students.php) + [templates/admin/user-edit.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/admin/user-edit.php) + [templates/certificates/actions.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/actions.php) + [templates/certificates/content-legacy.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/content-legacy.php) + [templates/certificates/content.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/content.php) + [templates/certificates/dynamic-styles.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/dynamic-styles.php) + [templates/certificates/header.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/header.php) + [templates/certificates/loop.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/loop.php) + [templates/certificates/preview.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/preview.php) + [templates/certificates/template.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/certificates/template.php) + [templates/checkout/form-checkout.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/checkout/form-checkout.php) + [templates/checkout/form-confirm-payment.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/checkout/form-confirm-payment.php) + [templates/checkout/form-coupon.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/checkout/form-coupon.php) + [templates/checkout/form-gateways.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/checkout/form-gateways.php) + [templates/checkout/form-summary.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/checkout/form-summary.php) + [templates/checkout/form-switch-source.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/checkout/form-switch-source.php) + [templates/content-single-question.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/content-single-question.php) + [templates/course/audio.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/audio.php) + [templates/course/categories.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/categories.php) + [templates/course/complete-lesson-link.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/complete-lesson-link.php) + [templates/course/difficulty.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/difficulty.php) + [templates/course/favorite.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/favorite.php) + [templates/course/full-description.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/full-description.php) + [templates/course/length.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/length.php) + [templates/course/lesson-count.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/lesson-count.php) + [templates/course/lesson-navigation.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/lesson-navigation.php) + [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/lesson-preview.php) + [templates/course/meta-wrapper-start.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/meta-wrapper-start.php) + [templates/course/outline-list-small.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/outline-list-small.php) + [templates/course/parent-course.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/parent-course.php) + [templates/course/short-description.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/short-description.php) + [templates/course/syllabus.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/syllabus.php) + [templates/course/tags.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/tags.php) + [templates/course/tracks.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/tracks.php) + [templates/course/video.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/course/video.php) + [templates/emails/footer.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/emails/footer.php) + [templates/emails/header.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/emails/header.php) + [templates/emails/reset-password.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/emails/reset-password.php) + [templates/global/form-login.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/global/form-login.php) + [templates/global/form-registration.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/global/form-registration.php) + [templates/lesson/audio.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/lesson/audio.php) + [templates/lesson/video.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/lesson/video.php) + [templates/loop/author.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/loop/author.php) + [templates/loop/enroll-date.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/loop/enroll-date.php) + [templates/loop/enroll-status.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/loop/enroll-status.php) + [templates/loop/featured-image.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/loop/featured-image.php) + [templates/loop/loop-start.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/loop/loop-start.php) + [templates/loop/none-found.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/loop/none-found.php) + [templates/loop/pagination.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/loop/pagination.php) + [templates/membership/full-description.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/membership/full-description.php) + [templates/membership/price.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/membership/price.php) + [templates/myaccount/dashboard-section.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/dashboard-section.php) + [templates/myaccount/form-edit-account.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/form-edit-account.php) + [templates/myaccount/form-redeem-voucher.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/form-redeem-voucher.php) + [templates/myaccount/my-favorites.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/my-favorites.php) + [templates/myaccount/my-grades-single-table.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/my-grades-single-table.php) + [templates/myaccount/my-grades-single.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/my-grades-single.php) + [templates/myaccount/my-grades.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/my-grades.php) + [templates/myaccount/my-notifications.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/my-notifications.php) + [templates/myaccount/my-orders.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/my-orders.php) + [templates/myaccount/navigation.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/navigation.php) + [templates/myaccount/view-order-actions.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/view-order-actions.php) + [templates/myaccount/view-order-information.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/view-order-information.php) + [templates/myaccount/view-order-transactions.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/view-order-transactions.php) + [templates/myaccount/view-order.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/myaccount/view-order.php) + [templates/notifications/basic.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/notifications/basic.php) + [templates/product/access-plan-button.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan-button.php) + [templates/product/access-plan-description.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan-description.php) + [templates/product/access-plan-feature.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan-feature.php) + [templates/product/access-plan-pricing.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan-pricing.php) + [templates/product/access-plan-restrictions.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan-restrictions.php) + [templates/product/access-plan-title.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan-title.php) + [templates/product/access-plan-trial.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan-trial.php) + [templates/product/access-plan.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/access-plan.php) + [templates/product/free-enroll-form.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/free-enroll-form.php) + [templates/product/pricing-table.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/product/pricing-table.php) + [templates/quiz/meta-information.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/meta-information.php) + [templates/quiz/questions/content-choice.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/questions/content-choice.php) + [templates/quiz/questions/content-picture_choice.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/questions/content-picture_choice.php) + [templates/quiz/questions/description.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/questions/description.php) + [templates/quiz/questions/video.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/questions/video.php) + [templates/quiz/questions/wrapper-start.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/questions/wrapper-start.php) + [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/results-attempt-questions-list.php) + [templates/quiz/results-attempt.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/results-attempt.php) + [templates/quiz/results.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/results.php) + [templates/quiz/return-to-lesson.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/return-to-lesson.php) + [templates/quiz/start-button.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/quiz/start-button.php) + [templates/shared/instructors.php](https://github.com/gocodebox/lifterlms/blob/7.7.0/templates/shared/instructors.php) v7.6.3 - 2024-05-31 ------------------- ##### Bug Fixes + Adds additional filtering when using the lifterlms_favorites shortcode. Thanks, Peter Thaleikis. ##### Updated Templates + [templates/admin/reporting/nav-filters.php](https://github.com/gocodebox/lifterlms/blob/7.6.3/templates/admin/reporting/nav-filters.php) v7.6.2 - 2024-05-28 ------------------- ##### New Features + Added functionality to disable quiz retake after a passed attempt. ##### Updates and Enhancements + Adds ability to search by an order ID number in the Orders table. Thanks [@bsetiawan88](https://github.com/bsetiawan88)! [#1583](https://github.com/gocodebox/lifterlms/issues/1583) + Added support for showing Private, Drafts and Pending Courses/Memberships in Reporting > Sales Page. [#2490](https://github.com/gocodebox/lifterlms/issues/2490) ##### Bug Fixes + Fixes issue of not being able to save an imported or cloned course using Divi or the Classic Editor plugin. [#2649](https://github.com/gocodebox/lifterlms/issues/2649) + Fixes broken View link after creating a new lesson using the Course Builder. [#2662](https://github.com/gocodebox/lifterlms/issues/2662) + Upgrading Quill text editor version. [#2655](https://github.com/gocodebox/lifterlms/issues/2655) ##### Developer Notes + Added logic to delete vouchers data from table when vouchers are deleted. Thanks [@bsetiawan88](https://github.com/bsetiawan88)! [#1087](https://github.com/gocodebox/lifterlms/issues/1087) ##### Updated Templates + [templates/admin/reporting/nav-filters.php](https://github.com/gocodebox/lifterlms/blob/7.6.2/templates/admin/reporting/nav-filters.php) v7.6.1 - 2024-05-02 ------------------- ##### Bug Fixes + Fix error when trying to add a new lesson outside the course builder. [#2636](https://github.com/gocodebox/lifterlms/issues/2636) + Show correct course title when launching Course Builder immediately after creating a new course. [#2606](https://github.com/gocodebox/lifterlms/issues/2606) + Updating lifter blocks version for the Launch Course Builder button to appear on the Course edit page. v7.6.0 - 2024-04-18 ------------------- ##### New Features + Adds course-level lesson drip settings. + Loads translation files later for compatibility with plugins like Loco Translate. [#2429](https://github.com/gocodebox/lifterlms/issues/2429), [#2525](https://github.com/gocodebox/lifterlms/issues/2525) + Adds settings in the Permalinks page to edit the custom post type and taxonomy slugs. Slugs are saved in the site language on install on update. + Adds `llms_switch_to_site_locale` and `llms_restore_locale` to help LifterLMS add-ons switch to the site language when getting translation strings. ##### Updates and Enhancements + Improved the Course Builder UI. + Updating the Blocks and Helpers libraries to the latest version. ##### Bug Fixes + Allows the style tag when embedding content (iframe), in order to support more services. [#2610](https://github.com/gocodebox/lifterlms/issues/2610) + Removes non-working editing of course title in the Course Builder. [#2607](https://github.com/gocodebox/lifterlms/issues/2607) + Avoid issue with lost content when the course builder is launched immediately after creating a new course. [#2606](https://github.com/gocodebox/lifterlms/issues/2606) + LifterLMS block editor strings now appear in the user's language. [#2525](https://github.com/gocodebox/lifterlms/issues/2525) + Fixed user's language setting not honored on backend. [#2324](https://github.com/gocodebox/lifterlms/issues/2324) + Fixes XSS, sanitization, and other security issues reported by Signal Labs. + Fixes typo with CHF currency. ##### Updated Templates + [templates/myaccount/my-orders.php](https://github.com/gocodebox/lifterlms/blob/7.6.0/templates/myaccount/my-orders.php) v7.5.3 - 2024-02-22 ------------------- ##### Bug Fixes + Fix fatal error when rendering single course page with reviews enabled. [#2604](https://github.com/gocodebox/lifterlms/issues/2604) v7.5.2 - 2024-02-16 ------------------- ##### Updates and Enhancements + Added product images for Aircraft and Memberlite. + Updates LifterLMS Rest to [v1.0.0](https://make.lifterlms.com/2024/01/22/lifterlms-rest-api-version-1-0-0/). ##### Bug Fixes + Adds error handling when taking a quiz in case of temporary server error or internet issue. ##### Security Fixes + Reviews handler now checks nonces and user limits. Thanks, Francesco Carlucci at Wordfence. ##### Updated Templates + [templates/emails/footer.php](https://github.com/gocodebox/lifterlms/blob/7.5.2/templates/emails/footer.php) v7.5.1 - 2024-01-24 ------------------- ##### Updates and Enhancements + Added action and description links to the plugins page. ##### Bug Fixes + Style updates for buttons in editor. + Fixed logic to validate that the terms page exists before adding to email footer. + Removed .clear styles since WordPress already sets them by default. [#2573](https://github.com/gocodebox/lifterlms/issues/2573) + Improved image appearance in quiz multiple choice and image choice question types. [#2588](https://github.com/gocodebox/lifterlms/issues/2588) ##### Security Fixes + Added nonce for course clone link. Thanks, Dhabaleshwar Das. ##### Updated Templates + [templates/emails/footer.php](https://github.com/gocodebox/lifterlms/blob/7.5.1/templates/emails/footer.php) v7.5.0 - 2023-11-05 ------------------- ##### New Features + Added `LLMS_Add_On::get_image()` method to get the addon and author image. [#2511](https://github.com/gocodebox/lifterlms/issues/2511) + Added a paragraph to show Number of lessons in a course at Course Catalog and My Courses. [#2434](https://github.com/gocodebox/lifterlms/issues/2434) ##### Updates and Enhancements + Updates LifterLMS Blocks to [v2.5.2](https://make.lifterlms.com/2023/11/01/lifterlms-blocks-version-2-5-2/). + Bundled Add-ons & More Banners/Author Images in Core LifterLMS. [#2511](https://github.com/gocodebox/lifterlms/issues/2511) + Updates LifterLMS Rest to [v1.0.0-beta.29](https://make.lifterlms.com/2023/10/24/lifterlms-rest-api-version-1-0-0-beta-29/). + Update Action Scheduler to version 3.5.4. To improve compatibility with PHP 8.2. ##### Bug Fixes + Fixed checking for the wrong function name when defining the pluggable function `lifterlms_student_dashboard`. [#2550](https://github.com/gocodebox/lifterlms/issues/2550) + Only show LifterLMS-authored Addons in All section. + Improved compatibility with WordPress 6.4 by using `traverse_and_serialize_blocks` in place of the deprecated `_inject_theme_attribute_in_block_template_content`. + PHP 8.2 compatibility fix: Fixed creation of dynamic property `LLMS_Meta_Box_Access::$_saved`. ##### Developer Notes + Added `LLMS_Payment_Gateway::can_process_access_plan()` method to determine if an access plan can be processed by the gateway. Also added the filter hook `llms_can_gateway_process_access_plan` to filter its result. + Added a check on whether the gateway can process a specific plan when purchasing a plan, or switching the payment gateway of a recurring payment. + Added action hook `llms_checkout_form_gateway_cant_process_plan` fired on the checkout form gateways section, when a gateway cannot process a specific plan. + Added new filter hook `llms_unschedule_recurring_payment_on_access_pan_expiration` to control whether or not the recurring payments fo an order need to be unscheduled when the related access plan expires (`true` by default). + Added 'favorites' in User postmeta for getting all user's favorites. + Added filter `llms_course_syllabus_lesson_favorite_visibility` for disabling favorites in syllabus view. + Added filter `llms_is_$object_type_favorite` to change object's (lesson, student, course) favorite boolean value. + Added `llms_lesson_preview_before_title` and `llms_lesson_preview_after_title` action hooks. + Added function `llms_template_syllabus_favorite_lesson_preview`. + Added filter `llms_favorites_enabled` to enable/disable Favorites feature. + Removed references to the unused quiz's property `random_answers`. Thanks [@AlexVCS](https://github.com/AlexVCS)! [#2552](https://github.com/gocodebox/lifterlms/issues/2552) + Improved some unit tests compatibility with PHP 8.2. ##### Security Fixes + Improved security when exporting a reporting table: make sure to avoid path traversals. Thanks [Huseyin Tintas (stif)](https://linkedin.com/in/huseyintintas)! ##### Updated Templates + [templates/checkout/form-gateways.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/checkout/form-gateways.php) + [templates/checkout/form-switch-source.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/checkout/form-switch-source.php) + [templates/content-single-lesson-before.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/content-single-lesson-before.php) + [templates/course/favorite.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/course/favorite.php) + [templates/course/length.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/course/length.php) + [templates/course/lesson-count.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/course/lesson-count.php) + [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/course/lesson-preview.php) + [templates/loop/content.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/loop/content.php) + [templates/myaccount/dashboard.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/myaccount/dashboard.php) + [templates/myaccount/my-favorites.php](https://github.com/gocodebox/lifterlms/blob/7.5.0/templates/myaccount/my-favorites.php) v7.4.2 - 2023-10-06 ------------------- ##### Developer Notes + Fixing issues in the 7.4.1 release. v7.4.1 - 2023-10-06 ------------------- ##### New Features + Added new admin Resources page. ##### Bug Fixes + Fixed possible issues when cloning a course containing a quiz built with the Advanced Quizzes addon, after disabling it. ##### Developer Notes + Moved attempt randomization logic into the new static method `LLMS_Quiz_Attempt::randomize_attempt_questions()`. + Added filter hook `llms_quiz_attempt_questions_array` to allow filtering the quiz attempt's question arrays. v7.4.0 - 2023-10-03 ------------------- ##### New Features + Added method `LLMS_Quiz::get_questions_count()` for getting count of questions. + Added support for the upcoming "Question Bank" feature of the LifterLMS Advanced Quizzes add-on. ##### Updates and Enhancements + Added `nocache_headers()` to prevent browser caching for temporary redirects. ##### Bug Fixes + Added "Chaiyaphum" province for the Thailand. [#2527](https://github.com/gocodebox/lifterlms/issues/2527) ##### Developer Notes + Course Builder: Correctly get/set (and track changes of) Backbone's model properties which are objects. + Added filter hook `llms_admin_show_header` to allow 3rd parties filtering whether or not to show the branded header in the admin. + Added filter `llms_generator_new_post_data`, to allow third parties to filter the data used when creating a new post while cloning/exporting a course or lesson. + Abstracted the `LLMS_Admin_Setup_Wizard` class, added the class `LLMS_Abstract_Admin_Wizard`. + Added filter `llms_quiz_attempt_questions_randomize` to enable/disable questions randomize. + Added filter `llms_quiz_attempt_questions` to modify the questions array for the quiz. + Added filter `llms_quiz_questions_count` to filter the quiz's question count. ##### Updated Templates + [templates/quiz/meta-information.php](https://github.com/gocodebox/lifterlms/blob/7.4.0/templates/quiz/meta-information.php) v7.3.0 - 2023-08-08 ------------------- ##### Updates and Enhancements + When a notice is shown for an access plan on the course edit screen (e.g. When using the WooCommerce integration and no product has been associated to the access plan.) Also display a warning icon next to the access plan title. + Made sure only who can `view_others_lifterlms_reports` will be able to see the analytics widget content in the WordPress admin. + Better rounding of float values on some reporting screens. + Avoid creating a post revision when cloning a course/lesson. + When creating pages via `llms_create_pages()`: strip all tags from the page title and slash the page data prior to inserting the page in the db via `wp_insert_post()` to prevent slashes from being stripped from the page title. + Updated the WordPress tested version up to 6.3. + Improved compatibility with the Divi theme by fixing an issue with the quiz attempt result clarifications not being visible when the Divi option `Defer jQuery And jQuery Migrate` was enabled. [#2470](https://github.com/gocodebox/lifterlms/issues/2470) ##### Bug Fixes + Fix spacer block when creating new certificate templates in WP 6.3. + Fixed PHP Warning when no course/membership catalog page was set or if the selected page doesn't exist anymore. [#2496](https://github.com/gocodebox/lifterlms/issues/2496) + Don't include WordPress default sidebar.php template when using a block theme. [#2488](https://github.com/gocodebox/lifterlms/issues/2488) + Updated Kazakhstani Tenge's currency symbol. [#2475](https://github.com/gocodebox/lifterlms/issues/2475) + Make the dashboard widget visible only if the current user has LMS Manager capabilities. [#2500](https://github.com/gocodebox/lifterlms/issues/2500) + Fixed issue with LifterLMS Navigation Link block and block visibility settings. [#2474](https://github.com/gocodebox/lifterlms/issues/2474) + Use student dashboard as default value for navigation link block. [#2465](https://github.com/gocodebox/lifterlms/issues/2465) + Fixed typo in a function name that could potentially produce a fatal. Thanks [@kamalahmed](https://github.com/kamalahmed)! ##### Developer Notes + Added the parameter `$tab` (ID/slug of the tab) to the `lifterlms_reporting_tab_cap` filter hook. Thanks [@sapayth](https://github.com/sapayth)! [#2468](https://github.com/gocodebox/lifterlms/issues/2468) + Added new filter hook `llms_can_analytics_widget_be_processed` that will allow to filter whether or not an analytics widget can be processed/displayed. + Added new filter `llms_install_get_pages`. + Added new public static method `LLMS_Admin_Dashboard_Widget::get_dashboard_widget_data()`. + Added `llms_dashboard_checklist` and `llms_dashboard_widget_data` filters to adjust dashboard content. [#2491](https://github.com/gocodebox/lifterlms/issues/2491) ##### Updated Templates + [templates/admin/reporting/tabs/widgets.php](https://github.com/gocodebox/lifterlms/blob/7.3.0/templates/admin/reporting/tabs/widgets.php) + [templates/global/sidebar.php](https://github.com/gocodebox/lifterlms/blob/7.3.0/templates/global/sidebar.php) + [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/7.3.0/templates/quiz/results-attempt-questions-list.php) v7.2.1 - 2023-06-13 ------------------- ##### Updates and Enhancements + Updated LifterLMS Blocks to [2.5.1](https://make.lifterlms.com/2023/06/13/lifterlms-blocks-version-2-5-1/). [#2461](https://github.com/gocodebox/lifterlms/issues/2461) v7.2.0 - 2023-06-07 ------------------- ##### New Features + Added `LLMS_ASSETS_VERSION` constant for cache busting. + Add course builder explainer video and lesson IDs. + Add new dashboard widget. + Added query to remove order comments on plugin uninstall when the constant `LLMS_REMOVE_ALL_DATA` is set to `true`. [#2322](https://github.com/gocodebox/lifterlms/issues/2322) + Added support for showing multiple difficulties when using Gutenberg Editor. [#2433](https://github.com/gocodebox/lifterlms/issues/2433) + Add shortcode wrapper blocks. + Added new navigation link block. + Added `llms_is_editor_block_rendering` helper function. + Added `llms_is_block_editor` helper function. ##### Updates and Enhancements + Adjusted `llms_modify_dashboard_pagination_links_disable` filter to return false only on Dashboard page. + Updates LifterLMS REST to [v1.0.0-beta.27](https://make.lifterlms.com/2023/05/31/lifterlms-rest-api-version-1-0-0-beta-27). + Raised the minimum support WordPress core version to 5.9. + Updates LifterLMS Blocks to [2.5.0](https://make.lifterlms.com/2023/06/06/lifterlms-blocks-version-2-5-0/). ##### Bug Fixes + Fixed LifterLMS specific block templates not correctly working on Windows file system. + Added `function_exists` check for `llms_blocks_is_post_migrated()`. + Update so dismissed notifications don't remain on viewport top layer. + Made sure to always enqueue iziModal assets when rendering achievements cards. ##### Developer Notes + Added new filter hook `llms_builder_settings` to filter the settings passed to the course builder. ##### Updated Templates + [templates/admin/reporting/tabs/widgets.php](https://github.com/gocodebox/lifterlms/blob/7.2.0/templates/admin/reporting/tabs/widgets.php) + [templates/course/syllabus.php](https://github.com/gocodebox/lifterlms/blob/7.2.0/templates/course/syllabus.php) v7.1.4 - 2023-04-28 ------------------- ##### Bug Fixes + Fixed an issue that prevented the correct saving of the course length when using the block editor. [#2426](https://github.com/gocodebox/lifterlms/issues/2426) ##### Developer Notes + Fixed an issue running unit tests on PHP 7.4 and WordPress 6.2 expecting `render_block()` returning a string while we were applying a filter that returned the boolean `true`. v7.1.3 - 2023-04-25 ------------------- ##### Updates and Enhancements + Wrapped some elements in HTML for better styling. + In Course and Lesson settings, replaced outdated URLs to WordPress' documentation about the list of sites you can embed from. + Updated few Italian province names. [#2256](https://github.com/gocodebox/lifterlms/issues/2256) + Avoid use of inline styles in course reviews. [#410](https://github.com/gocodebox/lifterlms/issues/410) ##### Bug Fixes + Fixed "Unsaved Data" warning when adding vouchers. [#2394](https://github.com/gocodebox/lifterlms/issues/2394) + Fixed "Course Length" and "Difficulty" fields visible in the Block Editor which is meant for Classic Editor. [#2174](https://github.com/gocodebox/lifterlms/issues/2174) + Added missing `$post_id` parameter to the `the_title` filter hook when retrieving a form title. [#2332](https://github.com/gocodebox/lifterlms/issues/2332) + Added missing Armed Forces options to the US States dropdown in the Billing information form. [#2325](https://github.com/gocodebox/lifterlms/issues/2325) + Using `strpos()` instead of `str_starts_with()` for compatibility. [#2415](https://github.com/gocodebox/lifterlms/issues/2415) ##### Developer Notes + Added helper function `llms_get_floats_rounding_precision()` to return precision for rounding off floating values and filter hook `lifterlms_floats_rounding_precision` to filter precision value in reporting. [#2237](https://github.com/gocodebox/lifterlms/issues/2237) + Added `lifterlms_dashboard_memberships_not_enrolled_text` filter hook to allow altering the message displaying on the student dashboard when the current user is not enrolled in any memberships. [#2396](https://github.com/gocodebox/lifterlms/issues/2396) + Added `lifterlms_dashboard_courses_not_enrolled_text` filter hook to allow altering the message displaying on the student dashboard when the current user is not enrolled in any courses. [#2396](https://github.com/gocodebox/lifterlms/issues/2396) ##### Updated Templates + [templates/course/syllabus.php](https://github.com/gocodebox/lifterlms/blob/7.1.3/templates/course/syllabus.php) v7.1.2 - 2023-03-27 ------------------- ##### Updates and Enhancements + Making the LifterLMS logo link to the LifterLMS.com site. ##### Bug Fixes + Fix bug in `llms_featured_img` function when featured image file is not available. [#2381](https://github.com/gocodebox/lifterlms/issues/2381) + Fixed manual certificates awarding broken when using the block editor. [#2386](https://github.com/gocodebox/lifterlms/issues/2386) v7.1.1 - 2023-03-13 ------------------- ##### Bug Fixes + Fixed notice display on WooCommerce dashboard pages. + Fixed View button URL when using WP in subdirectory. + Fixed blank System Report's copy for Support. v7.1.0 - 2023-03-02 ------------------- ##### New Features + Added lessons count column on the Courses post list table. + Added a new Dashboard page under the LifterLMS menu in the admin, whicih includes recent activity widgets and links to useful resources. + Added link to the course builder for each lesson on the Lessons post list table. Also added a link to either edit or add a quiz. ##### Updates and Enhancements + Updates LifterLMS Helper to [v3.5.0](https://make.lifterlms.com/2023/02/28/lifterlms-helper-version-3-5-0/). + Make the LifterLMS menu meta box initially available on Appearance -> Menus. + Updates LifterLMS REST to [v1.0.0-beta.26](https://make.lifterlms.com/2023/02/28/lifterlms-rest-api-version-1-0-0-beta-26/). ##### Bug Fixes + Catch possible fatal when trying to display a "broken" basic notification and set its status to 'error' so that it'll be excluded from the next fetches. + Catch possible fatal when sending notification emails and in that case remove from the queue the item that produced it. + Fix cloned course retaining original course's ID in some restriction messages. + Fixed possible admin notices duplication when activating/deactivating or installing add-ons from the page Add-ons & more. + Avoided setting the `llms-tracking` cookie when there are no events to track. + Updated styles across the entire plugin. + Updated Add-ons & more list to hide old (uncategorized) products. ##### Deprecations + Deprecated methods `LLMS_Admin_Notices_Core::sidebar_support()` and `LLMS_Admin_Notices_Core::clear_sidebar_notice()`. + Removed notice for theme sidebar support. ##### Developer Notes + The function `llms_is_user_enrolled()` will always return `false` for non existing users. While, before, it could return `true` if a now removed user was enrolled into a the given course or membership. + Added new `LLMS_Course::get_lessons_count()` method. It can be used in place of `count( LLMS_Course::get_lessons() )` to improve performance. + Fixed compatibility with PHP 8.1 by using an empty string as menu parent page for the course builder submenu page in place of NULL. + Avoid passing null values to `urlencode()` and `urldecode()` that would produce PHP warnings on PHP 8.1+. + Added `$autoload` parameter to the function `llms_get_student`. ##### Performance Improvements + Improve performance when querying notifications via the LLMS_Notifications_Query and there's no need to count the total notifications found, or for pagination information. + Immediately return false when running `llms_is_user_enrolled()` on logged out or no longer existing users, avoiding running additional DB queries e.g. when displaying course or membership catalogs for visitors. + Skip counting the total transactions found when retrieving the last or the first transaction for an order. ##### Updated Templates + templates/admin/reporting/nav-filters.php + templates/admin/reporting/reporting.php + templates/admin/reporting/tabs/courses/course.php + templates/admin/reporting/tabs/memberships/membership.php + templates/admin/reporting/tabs/quizzes/quiz.php + templates/admin/reporting/tabs/students/student.php + templates/admin/reporting/tabs/widgets.php + templates/checkout/form-confirm-payment.php v7.0.1 - 2022-11-14 ------------------- ##### Bug Fixes + Fixed a fatal error encountered on the payment confirmation screen when attempting to confirm a non-existent order. [#2093](https://github.com/gocodebox/lifterlms/issues/2093) + Use `sanitize_file_name()` in favor of `sanitize_title()` for generating the file name of reporting table export files. [#1540](https://github.com/gocodebox/lifterlms/issues/1540) + Resolved conflict encountered on post edit screens when using LifterLMS, Yoast SEO, and the Classic Editor plugin. [#2298](https://github.com/gocodebox/lifterlms/issues/2298) ##### Developer Notes + A stub method, `get_title()` has been added to the `LLMS_Abstract_Exportable_Admin_Table` abstract class. This method should be defined by any extending classes and will throw a `_doing_it_wrong()` error when undefined. + Added new filter to allow customizing which user roles are affected by the `LLMS_Admin_Menus::instructor_menu_hack` function. v7.0.0 - 2022-10-04 ------------------- ##### New Features + Added handling for admin settings options that store their option values in a nested array. + Added new AJAX checkout and payment source switching endpoints for payment gateways to utilize instead of the preexisting synchronous form submission methods. + On purchase completed retrieve the redirection URL from the INPUT_POST 'redirect' variable, if no 'redirect' variable is passed via INPUT_GET. The INPUT_POST 'redirect' variable comes from the new checkout form's hidden field 'redirect' populated with LLMS_Access_Plan::get_redirection_url(). [#2229](https://github.com/gocodebox/lifterlms/issues/2229) ##### Updates and Enhancements + Full Site Editing: **[BREAKING]** The wrappers in the custom header and footer templates have been changed to the semantic HTML tags `
` and `