diff --git a/.config/travis/add-on.yml b/.config/travis/add-on.yml
deleted file mode 100644
index 74e475dd46..0000000000
--- a/.config/travis/add-on.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# This travis config file is intended to be used by LifterLMS Add-ons.
-#
-# Example usage in .travis.yml:
-#
-# import:
-# - gocodebox/lifterlms:.config/travis/add-on.yml
-#
-
-# Import main configs.
-import:
- - gocodebox/lifterlms:.config/travis/main.yml
-
-# If $LLMS_BRANCH is specified, install the plugin from git.
-install:
- - |
- if [ ! -z "$LLMS_BRANCH" ]; then
- ./vendor/bin/llms-tests plugin https://github.com/gocodebox/lifterlms.git@${LLMS_BRANCH}
- fi
-
-# Test against the "nightly" dev branch of the the LifterLMS core.
-jobs:
- include:
- - php: "8.0"
- env: LLMS_BRANCH=dev WP_VERSION=latest
diff --git a/.config/travis/e2e.yml b/.config/travis/e2e.yml
deleted file mode 100644
index 39e269b8cb..0000000000
--- a/.config/travis/e2e.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-addons:
- artifacts:
- paths:
- - ./tmp/e2e-screenshots
-
-services:
- - xvfb
- - docker
-
-jobs:
- allow_failures:
- - php: "8.0"
- env: WP_VERSION=nightly LLMS_TRAVIS_TESTS=E2E
-
- include:
- - php: "8.0"
- env: WP_VERSION=latest LLMS_TRAVIS_TESTS=E2E
- - php: "8.0"
- env: WP_VERSION=nightly LLMS_TRAVIS_TESTS=E2E
-
diff --git a/.config/travis/eslint.yml b/.config/travis/eslint.yml
deleted file mode 100644
index 1fbeaf66da..0000000000
--- a/.config/travis/eslint.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# TravisCI config file partial for running an eslint job
-#
-# This partial is intended to be used alongside the main.yml config found within this same directory.
-#
-# Example usage in .travis.yml:
-#
-# import:
-# - gocodebox/lifterlms:.config/travis/main.yml
-# - gocodebox/lifterlms:.config/travis/eslint.yml
-#
-
-jobs:
- include:
- - env: ESLINT=1
- language: node_js
- node_js: lts/*
- before_install:
- install:
- - npm ci
- script:
- - npm run lint:js
- after_script:
diff --git a/.config/travis/main.yml b/.config/travis/main.yml
deleted file mode 100644
index 55acdeae12..0000000000
--- a/.config/travis/main.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-os: linux
-dist: bionic
-language: php
-
-services:
- - mysql
-
-cache:
- directories:
- - node_modules
- - vendor
- - $HOME/.composer/cache
-
-env:
- global:
- - TESTS_DB_HOST=localhost
- - TESTS_DB_NAME=llms_tests
- - TESTS_DB_PASS=""
- jobs:
- - WP_VERSION=latest # 5.8
- - WP_VERSION="5.7"
- - WP_VERSION="5.6"
- - WP_VERSION="5.5"
- - WP_VERSION="5.4"
-
-php:
- - "8.0"
- - "7.4"
- - "7.3"
-
-jobs:
- fast_finish: true
-
- allow_failures:
- - env: WP_VERSION=nightly
- - env: WP_VERSION=latest RUN_CODE_COVERAGE=1
- - php: nightly
-
- exclude:
- # These WP Versions don't work on PHP 8.0
- - php: "8.0"
- env: WP_VERSION="5.5"
- - php: "8.0"
- env: WP_VERSION="5.4"
-
- include:
- - php: "8.0"
- env: PHPCS=1
- - php: nightly
- env: WP_VERSION=latest
- - php: "8.0"
- env: WP_VERSION=nightly
- - php: "7.4"
- env: WP_VERSION=latest RUN_CODE_COVERAGE=1
- before_script:
- # Download CodeClimate Test Reporter
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
- - chmod +x ./cc-test-reporter
- script:
- - ./cc-test-reporter before-build
- - composer run-script tests-run -- --coverage-clover clover.xml
- after_script:
- - ./cc-test-reporter after-build --coverage-input-type clover --exit-code $TRAVIS_TEST_RESULT
-
-before_install:
- # Disable xDebug for faster builds
- - |
- if [ "1" != $RUN_CODE_COVERAGE ] && [ -f ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini ]; then
- phpenv config-rm xdebug.ini
- fi
- # Raise PHP memory limit to 2048MB
- - echo 'memory_limit = 2048M' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
- # Install composer deps.
- - |
- if [ "8" != $( php -r "echo PHP_MAJOR_VERSION;" ) ]; then
- composer install
- else
- composer run install-php8
- fi
-
-install:
- - |
- if [ "E2E" = "$LLMS_TRAVIS_TESTS" ]; then
- sudo rm /usr/local/bin/docker-compose
- curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > docker-compose
- chmod +x docker-compose
- sudo mv docker-compose /usr/local/bin
- nvm install --lts
- npm ci
- [[ -n $DOCKER_USERNAME ]] && [[ -n $DOCKER_PASSWORD ]] && echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- composer run env up
- composer run env:setup
- if [ "latest" != $WP_VERSION ]; then
- ./vendor/bin/llms-env version $WP_VERSION
- fi;
- WP_VERSION_REAL=$( ./vendor/bin/llms-env wp core version )
- echo $WP_VERSION_REAL
- elif [ "1" = "$PHPCS" ]; then
- echo "Nothing to install"
- else
- composer run tests-install
- fi
-
-script:
- - |
- if [ "E2E" = "$LLMS_TRAVIS_TESTS" ]; then
- WP_VERSION=$WP_VERSION_REAL npm run test
- elif [ "1" = "$PHPCS" ]; then
- if [ "trunk" = "$TRAVIS_BRANCH" ]; then
- composer run-script check-cs-errors
- else
- composer run-script check-cs-errors -- $( git diff --name-only --diff-filter=ACMR $TRAVIS_COMMIT_RANGE )
- fi
- else
- composer run-script tests-run
- fi
-
-after_script:
- - |
- if [ "E2E" = "$LLMS_TRAVIS_TESTS" ]; then
- ./vendor/bin/llms-env down
- fi
-
-notifications:
- slack:
- on_success: change
- on_failure: always
- rooms:
- - secure: VzwXDPjuNCrKed9ACY7dwzyIjcnt6G1iC1LnKAOIx9fyPZ7TARLIf5bSa9M7P5w4uQHK7kpm5yFNtPHKGwaazZnCZxH8jcDMc4M8y3w6j9uNlbidOgfrCpp07lY6kpd8ViR7ANZ4V5Noz+ts8/gSA0yUib6vGP87s6RKHTyVTfNuFmHui7t6vF3S1VCXm4JmOrqmZbY9DlN+8JcyE0Ao3KOk/UDSCZICqo7cYnMci2oHGfb+2VRu49B61tASnV0r/dRu7gjEQTtqwElIJfuP0hGeAYc6bee5vFLA4EIdz2TMgr/Fm1El5eIg+1ZB4bOVEHzUlonLLGaUlqcYfKtmmYiV8BBnte1xBlEflLxYj92ethTUtTvkicVmtK50IlyL8kpb4WBwhXMEjSoKGLmdfaeNGKZ0vS/BnyDA0eWmt4EQ5ZVQL50ukhvmOAXhMB5T+K6Bg6T3yJzXIxej0MrSSNVygpeIwl5RqleXOKJJtJe3TsrsQfdqidXVrKAGSrwlwDRSMLC7JN3l99+5PEXzgb106TE0TBgrMOEClTVyH4gAjplqQ70diw9SAp0rnU518dTDj9HMvZ7KcGQgnAzKI82iB1LaWsWrMjqHtPbn/h+2vRDQNRnx8umnCmC8ezRr4l+xZ8Cb9KgrhvJW+bed3pQFmD/LerSuW6ZgHFsN/KI=
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 0238efc766..0000000000
--- a/.editorconfig
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file is for unifying the coding style for different editors and IDEs
-# editorconfig.org
-
-# WordPress Coding Standards
-# http://make.wordpress.org/core/handbook/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
-
-[*.txt]
-trim_trailing_whitespace = false
-
-[*.{md,json,yml,yml.template}]
-indent_style = space
-indent_size = 2
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index ea03403438..0000000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * ESlint config
- *
- * @package LifterLMS/Scripts/Dev
- *
- * @since [version]
- * @version [version]
- */
-
-const config = require( '@lifterlms/scripts/config/.eslintrc.js' );
-
-module.exports = config;
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
deleted file mode 100644
index ff7716d08f..0000000000
--- a/.github/CONTRIBUTING.md
+++ /dev/null
@@ -1,67 +0,0 @@
-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 submit an application at [translate.lifterlms.com](https://translate.lifterlms.com/become-a-translator/).
-
-
-### 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 Contributor's Events Calendar](https://make.lifterlms.com/calendar/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)
diff --git a/.github/ISSUE_TEMPLATE/Bug_Report.md b/.github/ISSUE_TEMPLATE/Bug_Report.md
deleted file mode 100644
index d4e16ce6f4..0000000000
--- a/.github/ISSUE_TEMPLATE/Bug_Report.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-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)
diff --git a/.github/ISSUE_TEMPLATE/Feature_Request.md b/.github/ISSUE_TEMPLATE/Feature_Request.md
deleted file mode 100644
index 747c6694f2..0000000000
--- a/.github/ISSUE_TEMPLATE/Feature_Request.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-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.
diff --git a/.github/ISSUE_TEMPLATE/Question.md b/.github/ISSUE_TEMPLATE/Question.md
deleted file mode 100644
index 364675a501..0000000000
--- a/.github/ISSUE_TEMPLATE/Question.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-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.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index a10d16eb82..0000000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-## Description
-
-
-Fixes #
-
-## How has this been tested?
-
-
-
-
-## Screenshots
-
-## Types of changes
-
-
-
-
-
-## Checklist:
-- [ ] My code has been tested.
-- [ ] My code passes all existing automated tests.
-- [ ] My code follows the LifterLMS Coding & Documentation Standards.
-
diff --git a/.github/SECURITY.md b/.github/SECURITY.md
deleted file mode 100644
index 3d180165c4..0000000000
--- a/.github/SECURITY.md
+++ /dev/null
@@ -1,20 +0,0 @@
-Security Policy
----------------
-
-## Supported Versions
-
-LifterLMS 3.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.
-
-| Version | Supported |
-| ------- | ------------------ |
-| 4.x | :white_check_mark: |
-| 3.x | :x: |
-| 2.x | :x: |
-| 1.x | :x: |
-
-
-## 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/
diff --git a/.github/lifterlms-logo.png b/.github/lifterlms-logo.png
deleted file mode 100644
index c5e921a77a..0000000000
Binary files a/.github/lifterlms-logo.png and /dev/null differ
diff --git a/.github/sponsors/browserstack-logo.png b/.github/sponsors/browserstack-logo.png
deleted file mode 100644
index d420b92984..0000000000
Binary files a/.github/sponsors/browserstack-logo.png and /dev/null differ
diff --git a/.github/workflow-matrix.yml b/.github/workflow-matrix.yml
deleted file mode 100644
index 21816f162b..0000000000
--- a/.github/workflow-matrix.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-###
-#
-# 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[2]
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
deleted file mode 100644
index 719d869e56..0000000000
--- a/.github/workflows/codeql-analysis.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-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
diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml
deleted file mode 100644
index f3302244ec..0000000000
--- a/.github/workflows/coding-standards.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-###
-#
-# 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/coding-standards.yml}
-#
-###
-name: Coding Standards
-
-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:
- phpcs:
- name: Check Coding Standards
-
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout
- uses: actions/checkout@v2
-
- - name: Set up PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: '8.0'
- coverage: none
- tools: composer, cs2pr
-
- # Composer Install.
- - name: Get composer cache directory
- id: composer-cache
- run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- - name: Cache dependencies
- uses: actions/cache@v2
- with:
- path: ${{ steps.composer-cache.outputs.dir }}
- key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
- restore-keys: ${{ runner.os }}-composer-
- - name: Install Composer dependencies
- run: composer update
-
- # Check Coding Standards.
- - name: Run PHPCS
- run: composer run check-cs-errors -- --report-full --report-checkstyle=./phpcs-report.xml
-
- - name: Show PHPCS results in PR
- run: cs2pr ./phpcs-report.xml
diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml
deleted file mode 100644
index a0c7b29559..0000000000
--- a/.github/workflows/contributors.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-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: '14'
- 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
diff --git a/.github/workflows/issue-triage.yml b/.github/workflows/issue-triage.yml
deleted file mode 100644
index 690cb1fbc8..0000000000
--- a/.github/workflows/issue-triage.yml
+++ /dev/null
@@ -1,64 +0,0 @@
-###
-#
-# 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/workflows/issue-triage.yml}
-#
-###
-name: New Issue Triage and Assignment
-
-on:
- issues:
- types: [ opened ]
-
-jobs:
- handle-new-issue:
- runs-on: ubuntu-latest
- env:
- PRIMARY_CODEOWNER: '@thomasplevy'
- steps:
- - name: Checkout
- uses: actions/checkout@v2
-
- # Add to project.
- #################
- - name: Add to "Triage" project
- uses: alex-page/github-project-automation-plus@v0.8.1
- with:
- project: Triage
- column: Awaiting Triage
- repo-token: ${{ secrets.ORG_WORKFLOWS }}
-
- # Assign to the project's CODEOWNER.
- ####################################
- - name: Check CODEOWNERS file existence
- id: codeowners_file_exists
- uses: andstor/file-existence-action@v1
- 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 }}
\ No newline at end of file
diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml
deleted file mode 100644
index bda391ca3c..0000000000
--- a/.github/workflows/lint-js.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-###
-#
-# 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: '14'
- cache: 'npm'
-
- - name: Install npm dependencies
- run: npm ci
-
- - name: Run linter
- continue-on-error: true
- run: npm run lint:js
-
- - name: Save linter output
- continue-on-error: true
- run: npm run lint:js -- --output-file eslint-report.json --format json
-
- - name: Create annotations
- uses: ataylorme/eslint-annotate-action@1.2.0
- with:
- repo-token: "${{ secrets.GITHUB_TOKEN }}"
- report-json: "eslint-report.json"
diff --git a/.github/workflows/ossar-analysis.yml b/.github/workflows/ossar-analysis.yml
deleted file mode 100644
index 3676b8d673..0000000000
--- a/.github/workflows/ossar-analysis.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-# 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:
- # OSSAR runs on windows-latest.
- # ubuntu-latest and macos-latest support coming soon
- runs-on: windows-latest
-
- steps:
- # Checkout your code repository to scan
- - 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' }}
-
- # Install dotnet, used by OSSAR
- - name: Install .NET
- uses: actions/setup-dotnet@v1
- with:
- dotnet-version: '3.1.201'
-
- # Run open source static analysis tools
- - name: Run OSSAR
- uses: github/ossar-action@v1
- id: ossar
-
- # Upload results to the Security tab
- - name: Upload OSSAR results
- uses: github/codeql-action/upload-sarif@v1
- with:
- sarif_file: ${{ steps.ossar.outputs.sarifFile }}
diff --git a/.github/workflows/packages-test-and-lint.yml b/.github/workflows/packages-test-and-lint.yml
deleted file mode 100644
index c22d7007c2..0000000000
--- a/.github/workflows/packages-test-and-lint.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-name: Packages Lint & Test
-
-on:
- workflow_dispatch:
- pull_request:
- paths:
- - 'packages/**'
-
-concurrency:
- group: ${{ github.workflow }}-${{ 'pull_request' == github.event_name && github.head_ref || github.sha }}
- cancel-in-progress: true
-
-jobs:
-
- lint:
- name: Lint
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v2
-
- - name: Setup Node
- uses: actions/setup-node@v2
- with:
- node-version: '14'
-
- - name: Cache node_modules
- uses: actions/cache@v2
- id: npm-cache
- with:
- path: node_modules
- key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
-
- - name: Install NPM Dependencies
- if: steps.npm-cache.outputs.cache-hit != 'true'
- run: npm ci
-
- - name: Run linter
- continue-on-error: true
- run: npm run pkg:lint:js
-
- - name: Save linter output
- continue-on-error: true
- run: npm run pkg:lint:js -- --output-file eslint-report.json --format json
-
- - name: Create annotations
- uses: ataylorme/eslint-annotate-action@1.2.0
- with:
- repo-token: "${{ secrets.GITHUB_TOKEN }}"
- report-json: "eslint-report.json"
-
- test:
- name: Test
- runs-on: ubuntu-latest
- steps:
-
- - name: Checkout
- uses: actions/checkout@v2
-
- - name: Setup Node
- uses: actions/setup-node@v2
- with:
- node-version: '14'
-
- - name: Cache node_modules
- uses: actions/cache@v2
- id: npm-cache
- with:
- path: node_modules
- key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
-
- - name: Install NPM Dependencies
- if: steps.npm-cache.outputs.cache-hit != 'true'
- run: npm ci
-
- - name: Run test suite
- # uses: artiomtr/jest-coverage-report-action@v2.0-rc.6
- uses: gocodebox/jest-coverage-report-action@master
- with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
- skip-step: install
- threshold: 50
- test-script: npm run pkg:test -- --coverageReporters="text" --coverageReporters="text-summary"
diff --git a/.github/workflows/php-test-coverage.yml b/.github/workflows/php-test-coverage.yml
deleted file mode 100644
index 434382681c..0000000000
--- a/.github/workflows/php-test-coverage.yml
+++ /dev/null
@@ -1,68 +0,0 @@
-###
-#
-# 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/php-test-coverage.yml}
-#
-###
-name: PHP Code Coverage Report
-
-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:
-
- check-secret:
- name: "Check for required secret"
- runs-on: ubuntu-latest
- outputs:
- has-secret: ${{ steps.check-secret.outputs.has-secret }}
- steps:
- - name: Test secret
- id: check-secret
- run: |
- if [ ! -z "${{ secrets.CC_TEST_REPORTER_ID }}" ]; then
- echo "::set-output name=has-secret::true"
- fi
-
- test:
- name: "PHP Test Coverage"
- runs-on: ubuntu-latest
-
- needs: check-secret
-
- if: ${{ 'true' == needs.check-secret.outputs.has-secret }}
-
- steps:
-
- - name: Checkout
- uses: actions/checkout@v2
-
- - name: Setup Environment
- uses: gocodebox/.github/.github/actions/setup-phpunit@trunk
- with:
- php-version: "8.0"
- wp-version: "5.8"
- coverage: "xdebug"
- env-file: ".github/.env.php-test-coverage"
- secrets: ${{ toJSON( secrets ) }}
-
- - name: Run Tests with Coverage & Upload Coverage Report
- uses: paambaati/codeclimate-action@v2.7.5
- env:
- CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
- with:
- coverageCommand: composer run tests -- --coverage-clover clover.xml
diff --git a/.github/workflows/pr-ready.yml b/.github/workflows/pr-ready.yml
deleted file mode 100644
index ff275fdfa3..0000000000
--- a/.github/workflows/pr-ready.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-###
-#
-# 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/workflows/pr-ready.yml}
-#
-###
-name: PR Ready for Review
-
-on:
- pull_request_target:
- types: [ ready_for_review, review_requested ]
-
-jobs:
- add-to-project:
- runs-on: ubuntu-latest
- steps:
- - uses: alex-page/github-project-automation-plus@v0.8.1
- with:
- project: Active
- column: Ready for Review
- repo-token: ${{ secrets.ORG_WORKFLOWS }}
diff --git a/.github/workflows/sync-branches.yml b/.github/workflows/sync-branches.yml
deleted file mode 100644
index 2a7ad7be03..0000000000
--- a/.github/workflows/sync-branches.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-###
-#
-# 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
diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
deleted file mode 100644
index c3104e373b..0000000000
--- a/.github/workflows/test-e2e.yml
+++ /dev/null
@@ -1,97 +0,0 @@
-###
-#
-# 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 }}
-
- - name: Run test suite
- run: npm run test -- --verbose
-
- - name: Upload artifacts
- uses: actions/upload-artifact@v2
- if: failure()
- with:
- name: error-artifacts
- path: tmp/e2e-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
diff --git a/.github/workflows/test-phpunit.yml b/.github/workflows/test-phpunit.yml
deleted file mode 100644
index e0988a5f0b..0000000000
--- a/.github/workflows/test-phpunit.yml
+++ /dev/null
@@ -1,94 +0,0 @@
-###
-#
-# 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:
- 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 }} 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"
- secrets: ${{ toJSON( secrets ) }}
-
- - 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
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 8ee30b2117..0000000000
--- a/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# 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 composer-installed libs.
-/libraries/*
-!/libraries/index.php
-!/libraries/README.md
-
-# Misc.
-*.log
-.DS_Store
-
-# Release distribution directory.
-/dist/
-/tmp/
-
-# Non-distributable configs.
-phpunit.xml
-.llmsenv
diff --git a/.llmsconfig b/.llmsconfig
deleted file mode 100644
index 3cf445d10f..0000000000
--- a/.llmsconfig
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "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.js.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/**/*.min.js",
- "!assets/js/llms-builder*.js",
- "!assets/js/app/**/*.js",
- "!assets/js/builder/**/*.js",
- "!assets/js/partials/**/*.js",
- "!assets/js/private/**/*.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"
- ]
- }
- }
-}
diff --git a/.llmsdev.yml b/.llmsdev.yml
deleted file mode 100644
index c1076aad17..0000000000
--- a/.llmsdev.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-pot:
- dir: languages
diff --git a/.llmsdevrc b/.llmsdevrc
deleted file mode 100644
index 5b45e52bda..0000000000
--- a/.llmsdevrc
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "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/"
- }
-}
diff --git a/.llmsenv.dist b/.llmsenv.dist
deleted file mode 100644
index 9a229cc9ba..0000000000
--- a/.llmsenv.dist
+++ /dev/null
@@ -1,2 +0,0 @@
-WORDPRESS_PORT=8080
-WORDPRESS_TITLE=LifterLMS Core e2e
diff --git a/.wordpress-org/assets/banner-1544x500.png b/.wordpress-org/assets/banner-1544x500.png
deleted file mode 100644
index dba6fb91c6..0000000000
Binary files a/.wordpress-org/assets/banner-1544x500.png and /dev/null differ
diff --git a/.wordpress-org/assets/banner-772x250.png b/.wordpress-org/assets/banner-772x250.png
deleted file mode 100644
index ea4f22189d..0000000000
Binary files a/.wordpress-org/assets/banner-772x250.png and /dev/null differ
diff --git a/.wordpress-org/assets/icon-128x128.png b/.wordpress-org/assets/icon-128x128.png
deleted file mode 100644
index 2d2345e018..0000000000
Binary files a/.wordpress-org/assets/icon-128x128.png and /dev/null differ
diff --git a/.wordpress-org/assets/icon-256x256.png b/.wordpress-org/assets/icon-256x256.png
deleted file mode 100644
index 5f43e48053..0000000000
Binary files a/.wordpress-org/assets/icon-256x256.png and /dev/null differ
diff --git a/.wordpress-org/assets/icon.svg b/.wordpress-org/assets/icon.svg
deleted file mode 100755
index a6a0a9be5e..0000000000
--- a/.wordpress-org/assets/icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/.wordpress-org/assets/screenshot-1.png b/.wordpress-org/assets/screenshot-1.png
deleted file mode 100644
index 8506328ad4..0000000000
Binary files a/.wordpress-org/assets/screenshot-1.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-10.png b/.wordpress-org/assets/screenshot-10.png
deleted file mode 100644
index 2efc664184..0000000000
Binary files a/.wordpress-org/assets/screenshot-10.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-11.png b/.wordpress-org/assets/screenshot-11.png
deleted file mode 100644
index b013a42947..0000000000
Binary files a/.wordpress-org/assets/screenshot-11.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-12.png b/.wordpress-org/assets/screenshot-12.png
deleted file mode 100644
index ba68382290..0000000000
Binary files a/.wordpress-org/assets/screenshot-12.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-13.png b/.wordpress-org/assets/screenshot-13.png
deleted file mode 100644
index cc1f43ff4f..0000000000
Binary files a/.wordpress-org/assets/screenshot-13.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-14.jpg b/.wordpress-org/assets/screenshot-14.jpg
deleted file mode 100644
index abbe7282ea..0000000000
Binary files a/.wordpress-org/assets/screenshot-14.jpg and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-15.png b/.wordpress-org/assets/screenshot-15.png
deleted file mode 100644
index e50fe3d91f..0000000000
Binary files a/.wordpress-org/assets/screenshot-15.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-16.png b/.wordpress-org/assets/screenshot-16.png
deleted file mode 100644
index 30910ab358..0000000000
Binary files a/.wordpress-org/assets/screenshot-16.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-17.png b/.wordpress-org/assets/screenshot-17.png
deleted file mode 100644
index 8d7f03eb42..0000000000
Binary files a/.wordpress-org/assets/screenshot-17.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-18.png b/.wordpress-org/assets/screenshot-18.png
deleted file mode 100644
index d1246d607e..0000000000
Binary files a/.wordpress-org/assets/screenshot-18.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-19.png b/.wordpress-org/assets/screenshot-19.png
deleted file mode 100644
index 76f403fb60..0000000000
Binary files a/.wordpress-org/assets/screenshot-19.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-2.png b/.wordpress-org/assets/screenshot-2.png
deleted file mode 100644
index 1fa8a7011d..0000000000
Binary files a/.wordpress-org/assets/screenshot-2.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-20.png b/.wordpress-org/assets/screenshot-20.png
deleted file mode 100644
index 7521b8c172..0000000000
Binary files a/.wordpress-org/assets/screenshot-20.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-21.jpg b/.wordpress-org/assets/screenshot-21.jpg
deleted file mode 100644
index 90367b68fb..0000000000
Binary files a/.wordpress-org/assets/screenshot-21.jpg and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-22.png b/.wordpress-org/assets/screenshot-22.png
deleted file mode 100644
index 3edb6d4ed2..0000000000
Binary files a/.wordpress-org/assets/screenshot-22.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-23.png b/.wordpress-org/assets/screenshot-23.png
deleted file mode 100644
index 53a400098c..0000000000
Binary files a/.wordpress-org/assets/screenshot-23.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-24.png b/.wordpress-org/assets/screenshot-24.png
deleted file mode 100644
index 954925ae05..0000000000
Binary files a/.wordpress-org/assets/screenshot-24.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-3.png b/.wordpress-org/assets/screenshot-3.png
deleted file mode 100644
index 0270880ff1..0000000000
Binary files a/.wordpress-org/assets/screenshot-3.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-4.png b/.wordpress-org/assets/screenshot-4.png
deleted file mode 100644
index bced64a01c..0000000000
Binary files a/.wordpress-org/assets/screenshot-4.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-5.png b/.wordpress-org/assets/screenshot-5.png
deleted file mode 100644
index 02b251e4b9..0000000000
Binary files a/.wordpress-org/assets/screenshot-5.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-6.png b/.wordpress-org/assets/screenshot-6.png
deleted file mode 100644
index 79fd87e6f0..0000000000
Binary files a/.wordpress-org/assets/screenshot-6.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-7.png b/.wordpress-org/assets/screenshot-7.png
deleted file mode 100644
index d1baf75df3..0000000000
Binary files a/.wordpress-org/assets/screenshot-7.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-8.png b/.wordpress-org/assets/screenshot-8.png
deleted file mode 100644
index db72b5a00b..0000000000
Binary files a/.wordpress-org/assets/screenshot-8.png and /dev/null differ
diff --git a/.wordpress-org/assets/screenshot-9.png b/.wordpress-org/assets/screenshot-9.png
deleted file mode 100644
index 1cdceec55f..0000000000
Binary files a/.wordpress-org/assets/screenshot-9.png and /dev/null differ
diff --git a/.wordpress-org/readme/01-header.md b/.wordpress-org/readme/01-header.md
deleted file mode 100644
index 68551b2516..0000000000
--- a/.wordpress-org/readme/01-header.md
+++ /dev/null
@@ -1,12 +0,0 @@
-=== LifterLMS - WordPress LMS Plugin ===
-Contributors: thomasplevy, chrisbadgett, d4z_c0nf, lifterlms, codeboxllc
-Donate link: https://lifterlms.com
-Tags: learning management system, LMS, membership, elearning, online courses, quizzes, sell courses, badges, gamification, learning, Lifter, LifterLMS
-License: GPLv3
-License URI: https://www.gnu.org/licenses/gpl-3.0.html
-Requires at least: 5.4
-Tested up to: 5.8
-Requires PHP: 7.3
-Stable tag: {{__VERSION__}}
-
-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.
diff --git a/.wordpress-org/readme/05-description.md b/.wordpress-org/readme/05-description.md
deleted file mode 100644
index b65970539b..0000000000
--- a/.wordpress-org/readme/05-description.md
+++ /dev/null
@@ -1,394 +0,0 @@
-== Description ==
-[WordPress LMS plugin][home] - **LifterLMS is a powerful WordPress LMS plugin for WordPress that makes it easy to create, sell, and protect engaging online courses and training based membership websites.** LifterLMS is a complete WordPress LMS plugin, course building and LMS solution that works with any well-coded WordPress theme, modern WordPress blocks, and all the popular WordPress page builders (like Elementor, Beaver Builder, Divi, Gutenberg, etc.). As an engaged WordPress community member, LifterLMS actively encourages and helps other great plugins integrate with LifterLMS like Affiliate WP, Monster Insights, WP Fusion, the most popular form plugins, GamiPress, Astra Pro, the Course Scheduler, and many more. You can also connect your WordPress LMS website to 1,500+ other apps via Zapier. LifterLMS is one of only 11 WordPress plugins listed in the Zapier app directory.
-
-As an innovative self-hosted WordPress LMS platfom solution LifterLMS strikes a beautiful balance in being an **all-in-one WordPress LMS solution** while also integrating with other best of breed technologies relevant to course creators and membership site owners.
-
-https://www.youtube.com/watch?v=jDVvkipF_pg
-
-> **Similar to WooCommerce and WordPress**, As a WordPress LMS plugin, LifterLMS gives back to the open source WordPress community by contributing the core LifterLMS plugin for FREE for the world to benefit from. The core LMS incredibly powerful and customizable by itself with it's course building, membership, gamification system, and more. We believe in free distributed learning for all, and our core free open source WordPress LMS plugin helps further tha vision **LifterLMS exists to democratize education in the digital classroom.**
-
-> **At it's core LifterLMS exists to lift up others through education.**
-
-You do NOT need a separate ecommerce or membership plugin made by a different company to use LifterLMS! All that and more is included with LifterLMS so you can **avoid the "Software Frankenstein" problem** (too many plugins made by different companies that don't work well together have different levels of support). LifterLMS combines LMS features, course building, membership features, ecommerce feautures, and engagement features into one powerful LMS platform tool.
-
-LifterLMS is also known for having a thriving well supported LMS user community through active listening, social engagement, a course library and robust documentation. As a feature complete LMS solution, LifterLMS invests heavily in support and it's industry leading customer success program. LifterLMS doesn't just provide LMS software. LifterLMS builds community and invest heavily in supporting the community of LMS site builders.
-
-LifterLMS uses it's own product to create a helpful course library to help the course building community learn. A company should use it's own software beyond simple demos. Course creation software made by course builders!
-
-***
-
-> We encourage you to get to know the team of online course building experts behind the WordPress LMS plugin by signing up for a **[$1 temporary _30 Day_ website][try]** on our servers with the core LifterLMS plugin AND all the premium LMS add-ons installed. This LMS demo site allows you to test drive the core LMS & all the add-ons before you invest. You can practice creating an online course with LifterLMS's industry leading course builder. Or simply take a course yourself on your demo site to test the course experience out for yourself. You can even add your other favorite plugins & themes to your demo site so you can see them in action together with the LMS.
-
-> Are you ready to **[Try LifterLMS for $1][try]?** 🚀
-
-***
-
-You'll see why so many people like you are starting with or switching from another WordPress LMS or hosted platform to [LifterLMS][Home] for online course creation, membership sites, and remote schools.
-
-# **Who Uses LifterLMS?**
-
-+ **WordPress Freelancers**
-+ **WordPress Agencies**
-+ **WordPress Educators** like Shawn Hesketh at [WP101](https://www.wp101.com)
-+ IT Departments
-+ Marketing Agencies
-+ Entrepreneurs
-+ CEU Publishers
-+ Schools
-+ Organizations
-+ Governments
-+ Enterprise Companies
-+ DIY (Do It Yourself course creators, coaches, and entrepreneurs)
-+ Instructional Designers
-+ WordPress LMS Industry professionals
-
-https://www.youtube.com/watch?v=RnZflrWG5YQ
-
-# **What Types of People Use LifterLMS for their WordPress LMS?**
-
-#### **1) Builders**
-The WordPress developers, designers & IT pros who build LMS websites and training portals for clients, employers & themselves
-
-#### **2) Starters**
-Do-it-yourself innovators who are looking to create high value online courses, coaching or training based membership websites with a WordPress LMS
-
-#### **3) Switchers**
-People who have outgrown a hosted LMS platform or an incomplete WordPress LMS stack looking for more power, control and better support
-
-# **Who Makes The Best WordPress LMS Plugin LifterLMS?**
-The LifterLMS team is a **diverse group of talented course creators, developers, designers, marketers and entrepreneurs**. Before developing the LifterLMS product we consulted and built custom WWordPress LMS style training based membership sites for clients all over the world. It was through many years experience building high end custom WordPress LMS websites for the expert industry, that the LifterLMS project was born.
-
-Because 5 years ago we couldn't find a WordPress LMS plugin that provided a rock solid _all-in-one_ foundation for online course based LMS style training based membership websites, we decided to build LifterLMS and **contribute the core plugin to you and the WordPress community**.
-
-> LifterLMS is WordPress LMS, course & membership creation software built by course creators and a talented technical team. We understand WordPress, ecommerce, eLearning, course creation, engagement, gamification, conversion optimization, the website building industry, the LMS industry, and the needs of the online teacher coach, and training professional.
-
-You can learn more about **[the people behind LifterLMS here][team]**.
-
-# **LifterLMS WordPress LMS By The Numbers ...**
-
-+ 4,348,041 Course Enrollments powered by LifterLMS
-+ 6,570,731 Course and lesson completions powered by LifterLMS
-+ 86,807 Achievement badges awarded by LifterLMS
-+ 120,728 Certificates awarded by LifterLMS
-+ Over 10,000 active installs of the WordPress LMS plugin
-+ [181 5 star reviews](https://wordpress.org/support/plugin/lifterlms/reviews/?filter=5)
-
-# **[LifterLMS Features][features]**
-
-> _Start with our core free WordPress LMS plugin and [scale-up][price] as your business grows!_
-
-#### **Make Money Building an Education-Based Business**
-_LifterLMS plus one payment gateway like [Stripe][stripe] or [PayPal][pp] is powerful enough to get you started on your LMS website journey!_
-
-+ 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
-+ Course builder
-+ Drip Content
-+ Course and lesson pre-requisites
-+ Course tracks
-+ Course assignments
-+ Quiz time limits
-+ Student dashboard
-+ 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][lift]
-+ [Live office hours][oh]
-+ [Free training courses][aca]
-+ [Free training webinars][webinar]
-+ Setup wizard
-+ [Detailed documentation][docs]
-+ Dynamic resources
-+ Demo course
-+ System analyzer
-+ User community
-+ [REST API](https://developer.lifterlms.com/rest-api/)
-+ [Developer ecosystem][devblog]
-+ [Recommended Resources][resources] for course creators
-
-#### **Further WordPress LMS Reading**
-
-+ The [LifterLMS Official Homepage][home]
-+ The [LifterLMS Knowledge base][docs]
-+ The [LifterLMS Blog][blog]
-+ The [LifterLMS Podcast][podcast]
-+ The [LifterLMS Academy][aca]
-+ The [LifterLMS Developer Blog][devblog]
-
-
-# **Extend and Enhance Your LMS with LifterLMS Add-ons**
-
-#### **Advanced**
-
-_Increase your LMS website and it's training program's value with these engagement add-ons_
-
-+ [LifterLMS Advanced Quizzes][aq]
-+ [LifterLMS Assignments][ass]
-+ [LifterLMS Private Areas][pa]
-+ [LifterLMS Social Learning][sl]
-+ [LifterLMS Advanced Video][av]
-+ [LifterLMS Custom Fields][cf]
-+ [LifterLMS Groups][gr]
-+ [LifterLMS PDFs][pdf]
-
-#### **Integrations**
-
-_Integrate your LMS with the third-party tools you know and love_
-
-+ [LifterLMS Stripe][stripe]
-+ [LifterLMS PayPal][pp]
-+ [LifterLMS Authorize.Net][anet]
-+ [LifterLMS WooCommerce][wc]
-+ [LifterLMS ConvertKit][ck]
-+ [LifterLMS MailChimp][mc]
-
-#### **LMS Website and User Experience Design Tools**
-
-_Make your online course creations and WordPress LMS platform beautiful_
-
-+ [LifterLMS Powerpack][pro]
-+ [LifterLMS LaunchPad Theme][lp]
-
-
-#### **Support**
-
-_**Our world-class LMS software support has your back** and all of our paid products include priority private support with the LifterLMS support team_
-
-+ LifterLMS Support Ticket System, ready for any question you have about your LMS
-+ Liftoff Sessions access with live screensharing to help you get started with the LMS software
-+ [LifterLMS Office Hours][oh] is weekly Mastermind group hosted by LifterLMS CEO Chris Badgett and special guests
-
-#### **Save Big on your WordPress LMS with a Bundle**
-
-_Save money while unlocking the full potential of your course building and LMS platform_
-
-+ Level up your online course LMS website with our ecommerce, design, marketing technology, and automation tools with the [Universe Bundle][universe]
-+ Add even 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][infinity]
-
-
-# **Give The Best WordPress LMS Plugin LifterLMS a Try**
-
-_There are many ways to take LifterLMS for a test drive before commiting to the WordPress LMS_
-
-+ Go ahead and install the free core LifterLMS plugin right now. The free core WordPress LMS plugin is very powerful and customizable.
-+ 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. You can also practice creating an online course from scratch and test out the learner experience by enrolling yourself in a course on your demo site. You can even add your other favorite plugins & themes, but this demo site is not something you get to keep after the 30 days are over. **[Try LifterLMS for $1][try]** now.
-+ Another way to test LifterLMS out is to see what the student experience is like. Take a **free** course on how to build a LifterLMS website in 20 minutes. [Take a Free Course][demo] now.
-
-# **Scaling LifterLMS From A Simple Online Course...**
-
-LifterLMS is incredibly flexible, customizable and scalable. It can be used for a simple one course website, and it can also be used as course marketplace or multi instructor online school. LifterLMS can handle small sites with low course enrollments, and it's also used in large universities and inside fortune 500 corporations for employee training.
-
-Unlike hosted LMS software where you would pay monthly for access and pay more as your platform grows, LifterLMS does not charge you more per course. LifterLMS also does not charge you more per instructor or per student or based on your revenue.
-
-Some LifterLMS websites are small in terms of course and membership enrollments by design. Some are quite large in the hundreds of thousand of course enrollments. The largest site we know about has 734,415 course enrollments.
-
-Wether you are going big or keeping it small, LifterLMS can scale to your needs for your online course, membership site, training portal, or remote school.
-
-# **What Others Are Saying About LifterLMS for Course Building, Membership Sites, and Remote Schools...**
-
-> _"I've used a number of course creation and delivery 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, because 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_
-
-***
-
-> _“**WP101.com serves more than 30,000 members**, so it’s no small challenge to migrate to a new membership plugin. **We spent more than a year carefully evaluating dozens of LMS and membership plugins before we finally discovered LifterLMS (a membership plugin and LMS plugin combined into one). It was the only plugin that checked all the boxes for our needs for course creation and membership functionality.** And the LifterLMS team also shares our passion for creating better online learning experiences. In particular, we deeply resonate with their goal of restoring the human touch to online learning—something that is absent from most online courses today.”_
-
-> _**Shawn Hesketh**, Owner, WP101_
-
-***
-
-> _"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!! I’m looking forward to everything that comes next from the creators of LifterLMS!!"_
-
-> _**Sarah Lorenzen**, Teacher, Entrepreneur_
-
-***
-
-> _"LifterLMS has been **the best decision we have made** towards the build out of our course library, online Learning Management System site, and community. The breadth and depth of what LifterLMS offers in a few WordPress plugins exceeds anything else we evaluated as it includes: easy course construction, integrated eCommerce, community capabilities, gamification and the support for delivery of 1-on-1 coaching collaboration services. Lifter also has pre-built integrations with other key WordPress technologies we wanted to use. LifterLMS has attracted a solid community and support network of leading experts to help guide anyone who wants to transform the world or their industry with online training. **Chris and the Lifter team are real people, and they care**."_
-
-> _**Michael Wolf**, CEO, emPowering NOW LLC (Golden XPR)_
-
-***
-
-> _"I bought/installed LifterLMS yesterday then spent the day having a blast! Two years ago I started writing a book, which morphed into wanting to present the material online in a more interactive way. I started my website from scratch in January and installing the WordPress LMS plugin was a milestone moment! A milestone moment that turned out to be one joy right after the other! I'm always amazed when something is made easy! The LifterLMS product is amazing!! Power to the people! **Really quite extraordinary to have something so helpful be able to be in the hands of regular folk**."_
-
-> _**Margot Worthy**, Author, Teacher_
-
-
-# **LifterLMS in Action**
-+ [Success Stories][case] — Discover these amazing stories and accomplishments from our community of WordPress LMS website builders.
-+ [Showcase][sho] — Check out these WordPress LMS websites using LifterLMS
-
-
-# **Join Our Growing Community of Course Builders, Membership Site Owners, and WordPress LMS Professionals**
-
-> When you download LifterLMS, you **join a thriving community** of education entrepreneurs, course creators, developers, LMS professionals, and WordPress enthusiasts. We’re one of the fastest growing open source eLearning communities online, and you are welcome here in our LMS community.
-
-If you’re interested in contributing to LifterLMS, head over to the [LifterLMS GitHub Repository][git] to find out how you can pitch in on the open source WordPress LMS software.
-
-Want to add a new language to LifterLMS? Swell! You can contribute language translations to the LMS at [translate.wordpress.org][translate].
-
-Also I'd like to invite you to the [LifterLMS VIP Facebook group][facebook] so you can check out what other LifterLMS users and course creators are up to and ask questions to the LMS website building community. We also have an engaged [LifterLMS Slack community][slack] with live developer office hours if you would like to connect in Slack.
-
-**The mission of LifterLMS is to democratize education in the digital classroom. Our vision is to lift up others through education.**
-
-We invite you to **let us guide you to a successful training platform** through our WordPress LMS technology, course library, and support systems. We want you to avoid the common online course & general LMS website building mistakes, avoid the Software Frankenstein problem, and NOT waste any time bringing your WordPress LMS website to life.
-
-> LifterLMS helps you **ACCELERATE**.
-
-# **Here's What I'd Like You To Do Next ...**
-
-Install the free LifterLMS plugin on your website from here on WordPress, then ...
-
-**[Try out all the premium WordPress LMS add-ons for $1 by signing up >>HERE<<][try]**
-
-🚀
-
-
-[home]: https://lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[price]: https://lifterlms.com/pricing/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[docs]: https://lifterlms.com/docs/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[blog]: http://blog.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[devblog]: https://make.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[podcast]: http://podcast.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[git]: https://github.com/gocodebox/lifterlms/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[demo]: https://demo.lifterlms.com/course/how-to-build-a-learning-management-system-with-lifterlms/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[translate]: https://translate.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[facebook]: https://www.facebook.com/groups/lifterlmsvip/
-[slack]: https://join.slack.com/t/lifterlms/shared_invite/enQtMzk3ODczNjc4Mjc3LTBlMmEzMWYyOTIwMDU3NDc2MmRhNGIxNGE0Nzc1OWIxZjg1OGVhM2E5YTkwYzZmMmM1ZTU4MDQxYjVlZDYyZTE
-[sho]: https://lifterlms.com/showcase/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[case]: https://lifterlms.com/success/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[lift]: https://blog.lifterlms.com/liftoff/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[aca]: https://academy.lifterlms.com/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[resources]: https://lifterlms.com/recommended-resources/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[team]: https://lifterlms.com/our-team/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[webinar]: https://lifterlms.com/lifterlms-webinars/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-
-
-[anet]: https://lifterlms.com/product/authorize-net/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[aq]: https://lifterlms.com/product/advanced-quizzes//?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[ass]: https://lifterlms.com/product/lifterlms-assignments//?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[av]: https://lifterlms.com/product/advanced-video/?utm_source=LifterLMS%20Plugin&utm_medium=Readme&utm_campaign=Readme%20to%20Sale
-[dfy]: https://lifterlms.com/dfy/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[cf]: https://lifterlms.com/product/custom-fields/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[ck]: https://lifterlms.com/product/lifterlms-convertkit/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[gr]: https://lifterlms.com/product/groups/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[infinity]: https://lifterlms.com/product/infinity-bundle/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[lp]: https://lifterlms.com/product/launchpad/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[mc]: https://lifterlms.com/product/mailchimp-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[oh]: https://lifterlms.com/product/office-hours/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[pa]: https://lifterlms.com/product/private-areas/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[pdf]: https://lifterlms.com/product/lifterlms-pdfs/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[pp]: https://lifterlms.com/product/paypal-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[pro]: https://lifterlms.com/product/lifterlms-pro/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[sl]: https://lifterlms.com/product/social-learning/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[stripe]: https://lifterlms.com/product/stripe-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[try]: https://lifterlms.com/product/try/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[universe]: https://lifterlms.com/product/universe-bundle/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[wc]: https://lifterlms.com/product/woocommerce-extension/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-
-[features]: https://lifterlms.com/features/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[feature-lms]: https://lifterlms.com/features/lms/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[feature-ecomm]: https://lifterlms.com/features/e-commerce/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[feature-membership]: https://lifterlms.com/features/membership/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-[feature-engagement]: https://lifterlms.com/features/engagement/?utm_source=LifterLMS%20Plugin&utm_medium=README&utm_campaign=Readme%20to%20Sale
-
-
diff --git a/.wordpress-org/readme/10-installation.md b/.wordpress-org/readme/10-installation.md
deleted file mode 100644
index 13e13fe10c..0000000000
--- a/.wordpress-org/readme/10-installation.md
+++ /dev/null
@@ -1,34 +0,0 @@
-== Installation ==
-
-#### Minimum System Requirements
-
-LifterLMS Requires
-
-+ PHP 7.2 or later
-+ MySQL 5.6 or later
-+ WordPress 4.0 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
-
-This is the simplest way to install LifterLMS as it utilizes WordPress to handle file transfers and you 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. You'll then need to use FTP to manually upload the files to the proper directory on your webserver.
-
-Please see this [WordPress Codex document](https://codex.wordpress.org/Managing_Plugins#Manual_Plugin_Installation) for full instruction on Manual Plugin Installation.
-
-
-#### Setup Wizard
-
-After installing LifterLMS for the first time you will be redirected to the Setup Wizard. This wizard will walk quickly configure LifterLMS so you can get to course creating as quickly as possible. At the conclusion you'll have the option to import a sample course.
-
-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).
diff --git a/.wordpress-org/readme/15-faqs.md b/.wordpress-org/readme/15-faqs.md
deleted file mode 100644
index a1ee19e71d..0000000000
--- a/.wordpress-org/readme/15-faqs.md
+++ /dev/null
@@ -1,62 +0,0 @@
-== Frequently Asked Questions ==
-
-#### Where do I buy LifterLMS add-ons or bundles?
-
-You can explore the individual 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)
-
-
-#### Are there any troubleshooting steps you'd suggest I try that might resolve my issue before I post a new thread?
-
-First, make sure that you're running the latest version of LifterLMS. And if you've got any other LifterLMS extensions or themes, 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).
-
-
-#### I'm still stuck. Where do I go to file a bug or ask a question?
-
-Users of the free LifterLMS should post their questions in the plugin's WordPress.org forum. 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 it all up 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 LifterLMS add-ons, but there are a few questions I've got before making the purchase. Can you help me get those addressed?
-
-Absolutely. If you're not finding your questions answered on the product pages, 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).
-
-
-#### I still have questions. Where can I find answers?
-
-Be sure you’ve taken the free tutorial training video course: [How to Create an Online Course with LifterLMS](http://demo.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/product/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).
diff --git a/.wordpress-org/readme/20-screenshots.md b/.wordpress-org/readme/20-screenshots.md
deleted file mode 100644
index aed6b60253..0000000000
--- a/.wordpress-org/readme/20-screenshots.md
+++ /dev/null
@@ -1,26 +0,0 @@
-== Screenshots ==
-
-1. LifterLMS Courses
-2. LifterLMS Pricing Tables
-3. LifterLMS Checkout
-4. LifterLMS Lessons
-5. LifterLMS Achievement Earned
-6. LifterLMS Achievement Badges
-7. LifterLMS Quiz Results
-8. LifterLMS Student Dashboard
-9. LifterLMS Certificates
-10. LifterLMS Sales Reporting
-11. LifterLMS Student Reporting
-12. LifterLMS Enrollment Reporting
-13. LifterLMS Sidebar Widgets
-14. LifterLMS Subscription Management
-15. LifterLMS Settings
-16. LifterLMS Course Builder
-17. LifterLMS Lesson Settings
-18. LifterLMS Engagements
-19. LifterLMS Email Engagements
-20. LifterLMS Course Access Plans
-21. LifterLMS Update Upcoming Order Details
-22. LifterLMS Lock Down Non LMS Content with Memberships
-23. LifterLMS Membership Course Bundles and Auto Enrollment
-24. LifterLMS Business to Business Bulk Enrollment Activations with Vouchers
diff --git a/.wordpress-org/readme/25-changelog.md b/.wordpress-org/readme/25-changelog.md
deleted file mode 100644
index d38283f06a..0000000000
--- a/.wordpress-org/readme/25-changelog.md
+++ /dev/null
@@ -1,6 +0,0 @@
-== Changelog ==
-
-{{__CHANGELOG_ENTRIES__}}
-
-
-[Read the full changelog]({{__READ_MORE_LINK__}})
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 9c1112d957..0000000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,6208 +0,0 @@
-LifterLMS Changelog
-===================
-
-v5.5.0 - 2021-11-05
--------------------
-
-##### New Features
-
-+ Includes the LLMS-CLI beta, a set of WP-CLI commands for LifterLMS and LifterLMS add-ons, as part of the core plugin:
- + To get started, run `wp llms --help` in your terminal or read the [online command documentation](https://developer.lifterlms.com/cli/commands/llms/).
- + Please note that the LLMS-CLI is included as a public beta feature. The command API is in a pre-release state and, as such, is subject to change without warning.
- + If you encounter any issues or wish to provide feedback on the LLMS-CLI please get in touch at [https://github.com/gocodebox/lifterlms-cli](https://github.com/gocodebox/lifterlms-cli).
-
-##### Bug Fixes
-
-+ Fix AJAX post search when using search queries containing quotes.
-
-##### Deprecations
-
-+ The `lifterlms_register_post_type_llms_engagement` is deprecated in favor of `lifterlms_register_post_type_engagement`.
-+ The `lifterlms_register_post_type_llms_achievement` is deprecated in favor of `lifterlms_register_post_type_achievement`.
-+ The `lifterlms_register_post_type_llms_certificate` is deprecated in favor of `lifterlms_register_post_type_certificate`.
-+ The `lifterlms_register_post_type_llms_my_certificate` is deprecated in favor of `lifterlms_register_post_type_my_certificate`.
-+ The `lifterlms_register_post_type_llms_email` is deprecated in favor of `lifterlms_register_post_type_email`.
-+ The `lifterlms_register_post_type_llms_coupon` is deprecated in favor of `lifterlms_register_post_type_coupon`.
-+ The `lifterlms_register_post_type_llms_voucher` is deprecated in favor of `lifterlms_register_post_type_voucher`.
-
-##### Developer Notes
-
-+ The `llms-addons` style asset no longer ships an unminified version.
-+ The `llms-admin-add-ons` style asset no longer ships an unminified version and the filename of the distributed file has changed.
-+ All the LifterLMS post types are now registered using the static method `LLMS_Post_Types::register_post_type()`.
-+ Upgraded woocommerce/action-scheduler to [v3.4.0](https://github.com/woocommerce/action-scheduler/releases/tag/3.4.0).
-
-
-v5.4.1 - 2021-10-26
--------------------
-
-##### Bug fixes
-
-+ Exclude internal-use-only properties (related to reporting caches and student counts) when exporting or cloning courses. [#1532](https://github.com/gocodebox/lifterlms/issues/1532)
-+ Don't sanitize input from user forms until validation has succeeded. [#1829](https://github.com/gocodebox/lifterlms/issues/1829.)
-+ Fixed an issue encountered when fields are removed from reusable blocks, causing some user forms from functioning as expected. [#1832](https://github.com/gocodebox/lifterlms/issues/1832)
-
-
-v5.4.0 - 2021-10-14
--------------------
-
-##### Updates
-
-+ Added logic to prevent the permanent deletion of courses or memberships with active subscriptions.
-+ When a subscription attempts to charge a recurring payment against a deleted course or membership the transaction will be cancelled and the order marked as failed.
-+ Updates LifterLMS Blocks to [v2.2.1](https://make.lifterlms.com/2021/09/29/lifterlms-blocks-version-2-2-1/).
-+ Updates LifterLMS REST to [v1.0.0-beta.20](https://make.lifterlms.com/2021/10/11/lifterlms-rest-api-version-1-0-0-beta-20/).
-
-##### Bug fixes
-
-+ Fixed issue encountered when cloning lessons with attached assignments.
-+ Fixed an error encountered when viewing an order for a deleted course or membership on the student dashboard.
-
-##### Templates Updated
-
-+ templates/myaccount/view-order.php
-
-
-v5.3.3 - 2021-10-05
--------------------
-
-##### Updates
-
-+ Update woocommerce/actions-scheduler to version 3.3.0.
-
-##### Bug fixes
-
-+ Fixed an issue causing the latest earned achievement to not display on the "My Grades" tab in certain scenarios.
-+ Fix issue causing a `waiting...` message to display on the JS dev console.
-+ Fix improper usage of `apply_filters_deprecated()` encountered when using deprecated theme settings filters in the course builder.
-+ Fixed missing text domain, thanks [chetansatasiya](https://github.com/chetansatasiya)!
-
-##### Developer notes
-
-+ Improved the `LLMS.waitFor()` runtime JS dependency loader to output improved debugging information.
-
-
-v5.3.2 - 2021-09-21
--------------------
-
-##### Updates
-
-+ Updated the SendWP integration account management URL.
-
-##### Bug fixes
-
-+ Fixed issue encountered with TinyMCE editor instances in repeater metabox groups.
-+ Fixed issue causing the latest achievement to not display when reviewing grades on the student dashboard.
-
-
-v5.3.1 - 2021-09-13
--------------------
-
-##### Bug fixes
-
-+ Fixed quote slashing for non-admin roles when editing content in the course builder.
-+ The LifterLMS admin icon now uses an encoded SVG to improve admin color scheme compatibility.
-+ Fixed an issue with empty admin notices.
-
-##### Dev updates
-
-+ The creation date of `llms_orders` is now determined by `llms_current_time()`.
-
-
-v5.3.0 - 2021-08-31
--------------------
-
-##### Updates
-
-+ Improved logic used to determine when a limited length subscription has completed its payment schedule.
-+ Improved accessibility of various icon buttons on the admin orders view/edit screen.
-+ Improved display of quiz attempts containing questions which have been deleted from the database.
-+ POT files from included library plugins (like LifterLMS REST) are now excluded from LifterLMS distributions.
-
-##### Development updates
-
-+ Introduced `LLMS_Trait_Singleton` to replace redundant singleton pattern definitions across classes in the codebase.
-+ Moveed the loading of the autoloader to the main `lifterlms.php` file.
-+ Updated the `LLMS_Payment_Gateway` abstract class to utilize `LLMS_Abstract_Options_Data` for accessing gateway options.
-+ Audio and video embed methods shared by `LLMS_Course` and `LLMS_Membership` have been relocated to `LLMS_Trait_Audio_Video_Embed`.
-+ Sales page methods shared by `LLMS_Course` and `LLMS_Membership` have been relocated to `LLMS_Trait_Sales_Page`.
-
-##### Bug Fixes
-
-+ Fixed a visual issue encountered on the payment confirmation screen on small screens / mobile devices.
-+ Fix untranslatable time period strings (day, week, month, and year) found on the admin orders view/edit screen.
-+ Fixed an error encountered when attempting to grade a quiz attempt containing deleted questions.
-
-##### Deprecations
-
-+ Removed usage and references to the `LLMS_Order` post meta property `date_billing_end`. To determine if a subscription has ended, use `LLMS_Order::get_remaining_payments()` instead.
-+ Removed private method `LLMS_Order::calculate_billing_end_date()`.
-+ Deprecated the class property `$_instance` from the following classes, use the public method `instance()` instead:
- + `LLMS_Achievements`
- + `LLMS_Certificates`
- + `LLMS_Emails`
- + `LLMS_Engagements`
- + `LLMS_Events`
- + `LLMS_Grades`
- + `LLMS_Integrations`
- + `LLMS_Notifications`
- + `LLMS_Payment_Gateways`
- + `LLMS_Processors`
- + `LLMS_Sessions`
-
-##### Templates Updated
-
-+ templates/checkout/form-confirm-payment.php
-+ templates/admin/reporting/tabs/quizzes/attempt.php
-+ templates/quiz/results-attempt-questions-list.php
-
-
-v5.2.1 - 2021-08-17
--------------------
-
-##### Updates
-
-+ [LifterLMS Helper Version 3.4.1](https://make.lifterlms.com/2021/08/17/lifterlms-helper-version-3-4-1/).
-+ Made minor development-related changes to the `LLMS_Order` class.
-
-##### Bug Fixes
-
-+ Fixed an issue encountered when a course or membership sales page redirect is enabled but no URL is saved.
-
-
-v5.2.0 - 2021-08-10
--------------------
-
-##### Upcoming Payment Reminder Notification
-
-+ A new notification, the "Upcoming Payment Reminder" notification has been added. This notification sends a reminder to students a configurable number of days before a payment is do for a recurring subscription.
-+ When upgrading to version 5.2.0, this notification will be automatically *disabled*, visit LifterLMS -> Settings -> Notifications and select the new notification to enable it after upgrading.
-+ Props to [@niluzok](https://github.com/niluzok) for doing the initial work required to build this notification!
-
-##### Updates
-
-+ Reworked the database upgrader script to allow for minor upgrades which don't require significant data migration to upgrade silently without requiring user consent to initiate.
-+ Improved internal methods used to generate tables in the body of email notifications.
-
-##### Bug Fixes
-
-+ Student registration date is now displayed in the site's timezone in favor of UTC time.
-+ Properly pass options `template_path` and `default_path` to the template handler when creating an admin notice using a template.
-+ Removed translation (and incorrect text domain) from a logging function encountered when a recurring payment errors as a result of the payment gateway having been deactivated.
-
-##### Deprecations
-
-+ `LLMS_Install::db_updates()` is deprecated, use ``LLMS_DB_Upgrader::enqueue_updates()` instead.
-+ `LLMS_Install::update_notice()` is deprecated with no replacement.
-+ Template `admin/notices/db-update.php` is deprecated in favor of `includes/admin/views/db-update.php`.
-+ Template `admin/notices/db-updating.php` is deprecated with no replacement.
-
-
-v5.1.3 - 2021-08-04
--------------------
-
-+ Bugfix: Fixed an issue where a white box would be output over the certificate background image.
-+ Bugfix: Fixed an issue in the course builder causing lessons to be orphaned from a course when moved into an unsaved section.
-+ [LifterLMS Helper Version 3.4.0](https://make.lifterlms.com/2021/08/04/lifterlms-helper-version-3-4-0/)
-
-
-v5.1.2 - 2021-07-28
--------------------
-
-+ Bugfix: Pass second parameter to the `get_the_excerpt` filter.
-+ Fix: Corrected typos in error messages encountered during password reset.
-
-
-v5.1.1 - 2021-07-26
--------------------
-
-+ Bugfix: Fixed a bug causing malformed character codes to be rendered in forms when installing forms with translated labels.
-+ [LifterLMS Helper version 3.3.1](https://make.lifterlms.com/2021/07/26/lifterlms-helper-version-3-3-1/)
-
-
-v5.1.0 - 2021-07-19
--------------------
-
-##### Updates
-
-+ **Raised the minimum required WordPress core version to 5.8!**
-+ Adds WordPress core 5.8 compatibility.
-+ Improved user information forms required field validation.
-+ Added functionality to ensure that user email and password fields are *always* displayed to logged out users on checkout and registration forms.
-+ Added functionality to ensure that user email and password fields are *always* displayed on the account edit form.
-+ [LifterLMS Blocks version 2.2.0](https://make.lifterlms.com/2021/07/19/lifterlms-blocks-version-2-2-0/)
-
-##### Bug fixes
-
-+ Fixed an issue preventing certain orphaned quizzes from being deleted.
-+ Prevent users from submitting a password change without submitting their current password.
-+ Allow logged in users to checkout when no form fields are set to display.
-
-
-v5.0.2 - 2021-07-08
--------------------
-
-##### LifterLMS Blocks
-
-+ Upgraded to [version 2.1.1](https://make.lifterlms.com/2021/07/08/lifterlms-blocks-version-2-1-1/).
-
-##### Bug Fixes
-
-+ Fixed issue with non-Latin characters in dashboard endpoint URL slugs.
-+ Fixed issue preventing address localization when using the [lifterlms_registration] shortcode.
-
-
-v5.0.1 - 2021-06-28
--------------------
-
-##### Updates
-
-+ Update to [LifterLMS Blocks v2.1.0](https://make.lifterlms.com/2021/06/28/lifterlms-blocks-version-2-1-0/).
-+ Added a new filter to allow programmatically alter required field validation results.
-
-##### Bugfixes
-
-+ Fixed an issue causing preventing form layout options from working when passed into shortcodes.
-+ Fixed an issue preventing custom radio, select, and dropdown fields from working during checkout.
-+ Fixed an accessibility issue encountered during password strength validation.
-
-
-v5.0.0 - 2021-06-22
--------------------
-
-##### User Information Form Builder
-
-+ Customize all user information collection forms using the block editor for drag and drop and WYSIWYG form building.
-+ Customize field labels, placeholders, descriptions and more with an easy point and click interface.
-+ Determine if fields are required or optional with a simple toggle switch.
-+ Update the form layout with the block editor. Reorder fields, add columns, and more with a simple drag and drop interface.
-+ Remove unwanted fields with the click of a button.
-
-##### User Location Information Form Fields
-
-+ During user account creation and updates the user location fields are now locale aware ensuring that the proper terminology is used and only locale-required fields are displayed for the selected locale.
-+ The "Country" field has been updated to be automatically populated with a list of countries. View the full list in the file at `languages/countries.php` and the filter `lifterlms_countries` can be used to modify the default list at runtime.
-+ The "State" field on user forms has been updated to be automatically populated with a list of states (provinces or regions) for the selected country. This list of states can be found in the file at `languages/states.php` and the filter `lifterlms_states` can be used to modify the default list at runtime.
-+ Both "Country" and "State" fields are now searchable dropdowns elements.
-+ The lists of countries and states will be automatically updated during future releases based on information provided by [GeoNames](https://www.geonames.org/) APIs.
-
-##### Mergecodes everywhere via new `[llms-user]` shortcode
-
-+ Allows merging most user information field data into any post or page, email, or notification (as well as widgets and more).
-
-##### Updates
-
-+ Email and password confirmation fields may now be made optional.
-+ "User Information Options" have been largely removed in favor of determining which fields are displayed via the forms UI
-+ The former "User Information Options" settings area has been renamed to "User Privacy Options".
-+ Removed email lookup logic since `wp_authenticate()` supports email addresses as `user_login` since WP 4.5.
-+ Custom user fields added via filters are now displayed on the admin panel at priority 11 instead of 10.
-+ Added shortcode processing in LifterLMS-generated emails.
-+ If a symbol cannot be found for the supplied currency code, return the code instead of an empty string.
-
-##### Bug Fixes
-
-+ Changed the filter on return of `LLMS_Person_Handler::get_password_reset_fields()` from `lifterlms_lost_password_fields` to `llms_password_reset_fields`.
-+ Fixed duplicate references to the `llms-select2` script.
-
-##### Development changes
-
-+ Added before and after actions hooks for admin tools.
-+ The filter `lifterlms_before_user_${action}` is now triggered by `do_action_ref_array()` instead of `do_action()` allowing modification of `$posted_data` and `$fields` via hooks.
-+ A number of action and filter hooks have been moved to new locations within the codebase. They will continue to function as expected (with some minor exceptions).
-+ Enqueue select2 on account and checkout pages for searchable dropdowns for country & state.
-+ Stop loading removed processor "table_to_csv".
-
-##### Library & Vendor Updates
-
-+ Updates LifterLMS Blocks to version 2.0.1.
-+ Updates woocommerce/actions-scheduler to version 3.2.1.
-+ Load core libraries from new location and load WP Background Processing lib.
-+ The vendor script dependency `topModal.js` has been removed.
-
-##### Templates Updated
-
-+ templates/checkout/form-checkout.php
-+ templates/checkout/form-confirm-payment.php
-+ templates/checkout/form-gateways.php
-+ templates/global/form-login.php
-+ templates/global/form-registration.php
-+ templates/myaccount/form-edit-account.php
-+ templates/product/free-enroll-form.php
-
-##### Deprecations
-
-The following have been deprecated and will be removed from LifterLMS in a major update following version 5.0.0.
-
-+ Class Method: `LLMS_Person_Handler::get_available_fields()` is deprecated in favor of `LLMS_Forms::get_form_fields()`.
-+ Class Method: `LLMS_Person_Handler::register()` is deprecated, in favor of `llms_register_user()`.
-+ Class Method: `LLMS_Person_Handler::sanitize_field()` (private method) is deprecated with no replacement.
-+ Class Method: `LLMS_Person_Handler::update()` is deprecated, in favor of `llms_update_user()`.
-+ Class Method: `LLMS_Person_Handler::validate_fields()` is deprecated with no replacement.
-+ Class Method: `LLMS_Person_Handler::voucher_toggle_script()` is deprecated with no replacement.
-+ Filter: `llms_usernames_blacklist` is deprecated, use `llms_usernames_blocklist` instead.
-+ Filter: `lifterlms_get_user_custom_fields` is deprecated with no replacement.
-+ Function: `llms_get_minimum_password_strength()` is deprecated with no replacement.
-+ Option: `lifterlms_registration_generate_username` is deprecated in favor of the new method `LLMS_Forms::are_usernames_enabled()`.
-
-##### Removed Items
-
-+ Private method `LLMS_Processors::includes()` has been removed.
-+ Private methods `LLMS_Person_Handler::fill_fields()` and `LLMS_Person_Handler::insert_data()` were removed.
-+ Previously deprecated class method `LLMS_Quiz::get_lessons()` has been removed.
-+ Previously deprecated class method `LLMS_Controller_Quizzes::take_quiz()` has been removed.
-+ Previously deprecated class `LLMS_Processor_Table_To_Csv` has been removed.
-
-
-v5.0.0-rc.2 - 2021-06-18
-------------------------
-
-+ Remove password description merge codes from reusable block schema.
-+ Explicitly define required field attributes on reusable block schema.
-+ Requires WP 5.7 or later to edit forms & show an upgrade nudge when requirements are not met.
-+ Add a link from the (now) legacy account settings area to help experienced users find the new form building area
-+ Add a (subtle) custom fields add-on upgrade nudge when viewing the forms list on the admin panel
-+ Update LifterLMS Blocks to 2.0.0-rc.2
-
-
-v5.0.0-rc.1 - 2021-06-15
-------------------------
-
-+ Updates Action Scheduler library to version 3.2.0
-+ Remove the {min_strength} and {min_length} merge codes from the User Password block description.
-+ Don't load removed files during OptimizePress compatibility.
-+ Add a 5.0.0 DB upgrade routine and welcome notice
-+ Add the LifterLMS Helper as an included library
-+ Add WordPress 5.8 compatibility on the Widgets and Customizer screens.
-+ Move form location definitions into a schema file
-+ Require WordPress 5.7+ to manage forms via the block editor
-+ Upgrades LifterLMS Blocks to 2.0.0-rc.1
-
-
-v5.0.0-beta.2 - 2021-06-01
----------------------------
-
-+ Updates LifterLMS Blocks to 2.0.0-beta.6.
-+ (Re-)introduces the user information shortcode as `[llms-user]`.
-+ Add Admins status tool to reinstall core forms & reusable blocks.
-+ Fixed issue causing data from conditionally disabled fields (like state) from being cleared during form submission
-+ Updated form post type labels and added missing labels
-+ Removed the previously deprecated class `LLMS_Frontend_Forms` and it's deprecated class methods `reset_password()` and `voucher_check()`.
-+ Removed the previously deprecated class `LLMS_Frontend_Password` and it's deprecated class methods: `retrieve_password()`, `check_password()`, and `reset_password()`.
-+ Updated country and state localization lists.
-
-
-v5.0.0-beta.1 - 2021-05-19
----------------------------
-
-+ LifterLMS Blocks 2.0.0-beta.5
-+ Added site-wide field name validation
-+ Reworked the output of user information fields on the admin panel to share a handler and APIs with frontend fields.
-+ Deprecated filter: `lifterlms_get_user_custom_fields` in favor of `llms_admin_profile_fields`
-+ Improved previewing of form posts using WP Core block editor UI elements
-+ Open Registration form can now always be previewed regardless of the open registration site setting
-
-
-v5.0.0-alpha.6 - 2021-05-07
----------------------------
-
-+ LifterLMS Blocks 2.0.0-beta.4
-+ Fix default reusable password field type from plain text to password
-+ Change the default reusable block post titles to reduce confusion when searching for blocks in the editor
-
-
-v5.0.0-alpha.5 - 2021-05-03
----------------------------
-
-+ Reorganized new files into subdirectories.
-+ Added serverside password minimum length validation.
-+ Fix duplicate password strength meter output.
-+ Fix the user password field type from text to password
-+ Fix the phone number field type from text to tel
-+ Fix user state select field
-+ Don't autoload field values from specified datastore when a "value" is explicitly passed to the field.
-+ Only load published reusable blocks on the frontend of the website
-+ Improved the UX for editing a users account by automatically "hiding" password and email fields and only requiring them to be submitted when users explicit request an update via the field's "change" toggle button.
-
-
-v5.0.0-alpha.4 - 2021-04-26
----------------------------
-
-+ Default form templates now use reusable blocks.
-+ Improved the user experience surrounding fields with a confirmation field (email address and password).
-+ Added the ability to define a field's column width instead of requiring the usage of WP column blocks.
-+ Added support for reusable blocks on form posts
-+ Upgraded LifterLMS Blocks to 2.0.0-beta.3.
-
-
-v5.0.0-alpha.3 - 2021-03-23
----------------------------
-
-+ Fixed issue preventing users from editing their email address and password on the dashboard account edit screens.
-+ Fixed issues with country names with the article "the" in their name, for example "The Netherlands" instead of "Netherlands The".
-+ Upgraded LifterLMS Blocks to version 2.0.0-beta.2.
-
-
-v5.0.0-alpha.2 - 2021-03-22
----------------------------
-
-##### Updates
-
-+ Updates LifterLMS Blocks to version 2.0.0-beta.1
-+ Adds functionality to force usage of the Block Editor for editing LifterLMS forms
-+ Updates localization functionality and methods to have more accurate information.
-+ Added a function for determining if open registration is enabled.
-+ Added a WP Admin Bar link below the "Edit Page" link to enable editing the form (if a form exists on the page).
-
-##### Bug Fixes
-
-+ Fixed an issue encountered when custom HTML fields exist on a form (backwards compatibility for pre 5.x fields API).
-
-
-v5.0.0-alpha.1 - 2021-01-07
----------------------------
-
-##### User Information Form Builder
-
-+ Customize all user information collection forms using the block editor for drag and drop and WYSIWYG form building.
-+ Customize field labels, placeholders, descriptions and more with an easy point and click interface.
-+ Determine if fields are required or optional with a simple toggle switch.
-+ Update the form layout with the block editor. Reorder fields, add columns, and more with a simple drag and drop interface.
-+ Remove unwanted fields with the click of a button.
-
-##### User Location Information Form Fields
-
-+ During user account creation and updates the user location fields are now locale aware ensuring that the proper terminology is used and only locale-required fields are displayed for the selected locale.
-+ The "Country" field has been updated to be automatically populated with a list of countries. View the full list in the file at `languages/countries.php` and the filter `lifterlms_countries` can be used to modify the default list at runtime.
-+ The "State" field on user forms has been updated to be automatically populated with a list of states (provinces or regions) for the selected country. This list of states can be found in the file at `languages/states.php` and the filter `lifterlms_states` can be used to modify the default list at runtime.
-+ Both "Country" and "State" fields are now searchable dropdowns elements.
-+ The lists of countries and states will be automatically updated during future releases based on information provided by [GeoNames](https://www.geonames.org/) APIs.
-
-##### Mergecodes everywhere via new `[user]` shortcode
-
-+ TODO.
-
-##### Updates
-
-+ Email and password confirmation fields may now be made optional.
-+ "User Information Options" have been largely removed in favor of determining which fields are displayed via the forms UI
-+ The former "User Information Options" settings area has been renamed to "User Privacy Options".
-
-##### Bug Fixes
-
-+ Changed the filter on return of `LLMS_Person_Handler::get_password_reset_fields()` from `lifterlms_lost_password_fields` to `llms_password_reset_fields`.
-
-##### Development changes
-
-+ The filter `lifterlms_before_user_${action}` is now triggered by `do_action_ref_array()` instead of `do_action()` allowing modification of `$posted_data` and `$fields` via hooks.
-+ A number of action and filter hooks have been moved to new locations within the codebase. They will continue to function as expected (with some minor exceptions).
-+ Enqueue select2 on account and checkout pages for searchable dropdowns for country & state.
-
-##### Library & Vendor Updates
-
-+ Load core libraries from new location and load WP Background Processing lib.
-+ The vendor script dependency `topModal.js` has been removed.
-
-##### Templates Updated
-
-+ templates/global/form-login.php
-+ templates/global/form-registration.php
-+ templates/product/free-enroll-form.php
-
-##### Deprecations
-
-The following have been deprecated and will be removed from LifterLMS in a major update following version 5.0.0.
-
-+ Class Method: `LLMS_Person_Handler::get_available_fields()` is deprecated in favor of `LLMS_Forms::get_form_fields()`.
-+ Class Method: `LLMS_Person_Handler::register()` is deprecated, in favor of `llms_register_user()`.
-+ Class Method: `LLMS_Person_Handler::sanitize_field()` (private method) is deprecated with no replacement.
-+ Class Method: `LLMS_Person_Handler::update()` is deprecated, in favor of `llms_update_user()`.
-+ Class Method: `LLMS_Person_Handler::validate_fields()` is deprecated with no replacement.
-+ Class Method: `LLMS_Person_Handler::voucher_toggle_script()` is deprecated with no replacement.
-+ Filter: `llms_usernames_blacklist` is deprecated, use `llms_usernames_blocklist` instead.
-+ Function: `llms_get_minimum_password_strength()` is deprecated with no replacement.
-+ Option: `lifterlms_registration_generate_username` is deprecated in favor of the new method `LLMS_Forms::are_usernames_enabled()`.
-
-##### Removed Items
-
-+ Private method `LLMS_Processors::includes()` has been removed.
-+ Private methods `LLMS_Person_Handler::fill_fields()` and `LLMS_Person_Handler::insert_data()` were removed.
-+ Previously deprecated class method `LLMS_Quiz::get_lessons()` has been removed.
-+ Previously deprecated class method `LLMS_Controller_Quizzes::take_quiz()` has been removed.
-+ Previously deprecated class `LLMS_Processor_Table_To_Csv` has been removed.
-
-
-v4.21.3 - 2021-05-31
---------------------
-
-##### Updates
-
-+ Increase 3rd party support for WP core hook `lostpassword_post` hook.
-
-##### Bug fixes
-
-+ Props to [Hemant Patidar](https://www.linkedin.com/in/hemantsolo/) for discovering an issue preventing rate limiting in various security plugins from working on the LifterLMS password recovery form.
-+ Fixed an issue encountered when updating LifterLMS premium add-ons via the LifterLMS Helper encountered when API errors are occur.
-+ Updated the failure error code from 'activation' to 'deactivation' in the `LLMS_Add_On` class.
-+ Updated the API connection error message returned when using the `LLMS_Abstract_API_Handler` class.
-
-##### Deprecations
-
-+ Class `LLMS_Frontend_Password` is deprecated, see deprecated methods and their replacments below:
-
- + `LLMS_Frontend_Password::retrieve_password()` is deprecated in favor of `LLMS_Controller_Account::lost_password()`.
- + `LLMS_Frontend_Password::check_password_reset_key()` is deprecated in favor of `check_password_reset_key()`.
- + `LLMS_Frontend_Password::reset_password()` is deprecated in favor of `reset_password()`.
-
-
-v4.21.2 - 2021-05-17
---------------------
-
-##### Security Update
-
-This releases fixes a security issue affecting LifterLMS versions 4.21.1 and earlier:
-
-+ Thank you to [Amirmohammad vakili](https://www.linkedin.com/in/amirmuhammad-vakili-65a7a11b3/) for reporting an insecure direct object reference issue.
-
-##### Updates
-
-+ Added the `view_grades` capability which is used to determine whether or not a user has the ability to view another user's grades on the website's frontend.
-
-##### Bug fixes
-
-+ Fixed an issue causing PHP errors when attempting to access a quiz attempt that doesn't exist.
-+ Fixed a localization issue encountered when entering transaction amounts on the admin panel.
-
-
-v4.21.1 - 2021-04-29
---------------------
-
-##### Security Update
-
-This releases fixes two security issues affecting LifterLMS versions 4.21.0 and earlier:
-
-+ Thank you to [Amirmohammad vakili](https://www.linkedin.com/in/amirmuhammad-vakili-65a7a11b3/) for reporting a way to store XSS.
-+ Thank you to Ashish Jha from [Bluefire Redteam](https://www.bluefire-redteam.com/) for reporting a reflected XSS issue on checkout screens.
-
-
-v4.21.0 - 2021-04-19
---------------------
-
-##### Updates
-
-+ Certificate exports will now automatically include (most) externally hosted images and stylesheets.
-+ Opt-in forward compatibility changes have been made to the `LLMS_Abstract_Options_Data` class.
-
-##### Bugfixes
-
-+ Fixed an issue causing one-time payment orders from being included in totals on some reporting screens.
-+ Fixed an issue causing student enrollment counts to be incorrect under some circumstances.
-+ Fixed issues resulting in unnecessary duplicated instances of course background data processing.
-+ Fixed an error encountered when a course is deleted prior to its background data being processed.
-+ Fixed an escaping issue causing passwords with a backslash character from being usable following a password reset.
-
-
-v4.20.0 - 2021-03-16
---------------------
-
-##### Bugfixes
-
-+ Fixed an issue causing a fatal error when attempting to access reports for deleted students. Thanks Thanks [@pondermatic](https://github.com/pondermatic)!
-+ Fixed an issue encountered on the builder causing the last section to be returned when retrieving the previous section for the first section.
-
-
-v4.19.0 - 2021-03-11
---------------------
-
-##### Supported Version Requirement Updates
-
-+ **The minimum supported PHP version has been raised to PHP 7.3. Please upgrade to a [supported PHP version](https://www.php.net/supported-versions).**
-+ **The minimum supported WordPress core version has been raised to version 5.3.**
-
-##### Bug fixes
-
-+ Fixed an issue causing TinyMCE editor instances to be unusable within metaboxes when using the block editor.
-
-
-v4.18.0 - 2021-03-04
---------------------
-
-**This is the last release of LifterLMS that will declare support for PHP 7.2. PHP 7.2 reached its official [end of life](https://www.php.net/eol.php) on November 30, 2020. With the next release of LifterLMS the minimum supported PHP version will be raised to 7.3. If you're currently using PHP 7.2 please contact your host and request an upgrade to a [supported PHP version](https://www.php.net/supported-versions) as soon as possible!**
-
-##### Updates
-
-+ Tested up to WordPress core version 5.7
-+ Updated several occurrences of `json_encode()` with preferred `wp_json_encode()`.
-
-##### Bug fixes
-
-+ Added a tie-breaker when there are multiple enrollment statuses with the same date & time. Thanks [@pondermatic](https://github.com/pondermatic)!
-+ On admin order pages and tables don't print links for deleted students.
-+ Fixed an issue on admin order pages when viewing an order for a deleted student.
-
-
-v4.17.0 - 2021-02-22
---------------------
-
-##### Updates
-
-+ The post type feature "llms-sales-page" has been added to course and membership post types, signifying they support custom sales pages.
-
-##### Bug fixes
-
-+ Fixed compatibility issues with Yoast SEO 15.8.
-+ Fixed duplicate action hook in `content-no-access-after.php` template.
-+ Added early returns to several templates to prevent undefined variables errors.
-+ Fixed an undefined variable encountered in course builder JS debug logging.
-
-##### Templates Updated
-
-+ content-no-access-after.php
-+ quiz/meta-information.php
-+ quiz/results.php
-+ quiz/start-button.php
-
-
-v4.16.0 - 2021-02-18
---------------------
-
-##### Updates
-
-+ Added preview management to the student dashboard to allow previewing of the dashboard as a site visitor.
-+ Added a new filter to allow customization of courses output by the [lifterlms_courses] shortcode. Thanks [@reedhewitt](https://github.com/reedhewitt)!
-+ Added compatibility code to reduce plugin conflicts encountered in the course builder. Resolves a conflict encountered when building quizzes with Yoast SEO installed.
-
-##### Bug fixes
-
-+ Fixed undefined variable error encountered when creating custom notification types. Thanks [@pondermatic](https://github.com/pondermatic)!
-+ Fixed incorrect variables passed to `sprintf()` in logging functions used by the course data background processor. Thanks [@pondermatic](https://github.com/pondermatic)!
-
-
-v4.15.0 - 2021-02-09
---------------------
-
-##### Updates
-
-+ Database migration: remove any "orphaned" access plans which were not properly cleaned up during deletion of parent course or membership.
-+ Improved performance of membership post association query methods.
-
-##### Bug fixes
-
-+ Access plans will now be automatically deleted when their parent course or membership is deleted.
-+ Fix an issue with donut charts/graphs on RTL sites.
-+ Fix an issue causing unpublished (draft/private) courses from being returned during queries for membership post associations.
-
-##### LifterLMS REST 1.0.0-beta.15
-
-###### Updates
-
-+ Added Access Plan resource and endpoint.
-+ Provide a more significant error message when trying to delete an item without permissions.
-+ Use `WP_Http` constants in favor of integers when referencing HTTP status codes.
-
-###### Bug fixes
-
-+ Fixes localization issues where a singular name was used in favor of the expected plural form.
-+ Fixed issues where an error object was not properly returned when expected
-+ Fixed call to undefined function `llms_bad_request_error()`, must be `llms_rest_bad_request_error()`.
-+ Fixed access plans resource link.
-+ Fixed wrong trigger retrieved when multiple trigger were present for the same user/post pair on Student Enrollment resources.
-
-
-v4.14.0 - 2021-02-04
---------------------
-
-##### Updates
-
-+ Added a user preference option allowing users to opt-out of the course builder's autosave functionality. [More information](https://lifterlms.com/docs/using-course-builder/#manual-saving).
-+ 5-star review request displayed at 30 enrollments instead of 50.
-
-##### Bug fixes
-
-+ Fixed an issue encountered when using shortcodes in the description of an access plan.
-+ Fixed an issue encountered when editing auto-draft courses on the course builder.
-
-##### Deprecations
-
-+ `LLMS_Controller_Quizzes::take_quiz()` is deprecated in favor of `LLMS_AJAX_Handler::quiz_start()`.
-+ Method `LLMS_Quiz::get_lessons()` is deprecated with no replacement.
-
-
-v4.13.0 - 2021-01-26
---------------------
-
-##### Updates
-
-+ **The minimum supported WordPress core version has been raised to 5.2.** For more information, please review the [LifterLMS Minimum System Requirements](https://lifterlms.com/docs/minimum-system-requirements-lifterlms/).
-+ When cloning courses and lessons the cloned post will be created as a draft.
-+ When cloning courses the suffix "(Clone)" will be appended to the title of the course to unify cloning behavior with lessons.
-+ Added information about LifterLMS specific constant values to the LifterLMS system report.
-+ Added a new constant `LLMS_IS_SITE_CLONE` which can be used to force the site's clone status.
-
-##### Bug fixes
-
-+ Reverts site clone detection check changes implemented in 4.12.0 to restore pre 4.12.0 functionality which only runs checks on the admin panel for logged in users with the `manage_lifterlms` capability.
-+ Restore reliance on `mb_convert_encoding()` when passing html strings into `DOMDocument` and use the alternate method introduced in version 4.8.0 as a fallback.
-+ Fixed an issue encountered when unexpected or malformed data is stored in the LifterLMS admin notices option.
-
-
-v4.12.0 - 2021-01-20
---------------------
-
-##### Updates
-
-+ Automatic site clone detection checks have been adjusted to always run in favor of only running on the admin panel.
-+ LifterLMS Site Features (like recurring payment status) can now be configured via constant values.
-+ Added `llms_load_admin_tools` action to allow 3rd parties to easily hook into our admin tools system.
-+ Made numerous performance improvements on the course data background processor.
-+ Course data background processing will now be automatically throttled for courses with 500 students or more as opposed to the old value of 2,500 or more.
-
-##### Bug fixes
-
-+ Fixed an incorrect HTML `for` attribute and added an `id` to the related input element on the student dashboard voucher redemption endpoint.
-+ Fixed a pagination error encountered when using course or membership list shortcodes on the static front page.
-+ Make sure `is_lifterlms()` exists before calling it in navigation menu-related classes.
-
-##### Deprecations
-
-+ `LLMS_Admin_Notices_Core::check_staging()` is deprecated in favor of `LLMS_Staging::notice()`.
-+ Unused property `LLMS_Course::$sections` is replaced by `LLMS_Course::get_sections()`.
-+ Unused property `LLMS_Course::$sku` is deprecated with no replacement.
-+ `LLMS_Frontend_Forms` is deprecated, functionality is available via `LLMS_Controller_Account`.
-+ `LLMS_Frontend_Forms::reset_password()` is deprecated in favor of `LLMS_Controller_Account::reset_password()`.
-
-##### Templates Updated
-
-+ templates/myaccount/form-redeem-voucher.php
-
-
-v4.11.0 - 2021-01-07
---------------------
-
-##### Updates
-
-+ Adds the ability to use the Instructors blocks on the membership post type. Thanks [@alaa-alshamy](https://github.com/alaa-alshamy)!
-+ Updated LifterLMS Blocks to [Version 1.11.1](https://make.lifterlms.com/2020/12/29/lifterlms-blocks-version-1-11-1/).
-
-##### Bug fixes
-
-+ Fixed a PHP Notice encountered when trying to retrieve next lesson from an empty section.
-
-##### Templates updated
-
-+ templates/course/author.php
-
-
-v4.10.2 - 2021-01-04
---------------------
-
-##### Updates
-
-+ Improveed performance of `llms_get_enrolled_students()`.
-+ Refactored lesson navigation query functions.
-
-##### Bug fixes
-
-+ Fixed sorting error when sorting student reports by name.
-
-
-v4.10.1 - 2020-12-10
---------------------
-
-##### Bug fixes
-
-+ Fixed visual issues encountered on the admin Add-Ons screen.
-+ Use `hr.wp-header-end` in favor of a second (hidden)
to "catch" admin notices on the Add-Ons screen.
-+ Replace incorrect usage of invalid ID `llms_shop` with `courses` during catalog template loader checks.
-+ Function `llms_get_post()` will now only allow instantiation of LifterLMS classes.
-+ Remove unneeded require autoloaded file `includes/class.llms.quiz.data.php`.
-
-
-v4.10.0 - 2020-12-01
---------------------
-
-##### Updates
-
-+ Adds native theme support for the WordPress default theme Twenty Twenty-One.
-+ Improved the `llms_archive_description()` function and releated filter.
-
-##### Bug fixes
-
-+ Fix issue encountered when using multiple role plugins to add the Instructor role to an Administrator user account. Thanks [@daniel-shuy](https://github.com/daniel-shuy)!
-+ Fixed an issue encountered when using non-latin characters in a course post URL slug. Thanks [@alaa-alshamy](https://github.com/alaa-alshamy)!
-
-##### Templates Updated
-
-+ templates/loop/pagination.php
-
-
-v4.9.0 - 2020-11-24
--------------------
-
-+ Tested up to WordPress core 5.6 (RC.1).
-+ Raised the minimum required WordPress core version to 5.1.
-+ Add new localization utilities for developers.
-+ Fixed various issues found on PHP 8.
-+ Added script localization for block editor scripts.
-+ Updated LifterLMS Rest to [Version 1.0.0-beta.17](https://make.lifterlms.com/2020/11/24/lifterlms-rest-api-version-1-0-0-beta-17/).
-+ Updated LifterLMS Blocks to [Version 1.10.0](https://make.lifterlms.com/2020/11/24/lifterlms-blocks-version-1-10-0/).
-
-
-v4.8.0 - 2020-11-16
--------------------
-
-##### Updates
-
-+ Added additional course imports and templates at the end of the setup wizard
-+ Added a cloud importer enabling 1-click importing of courses and course templates via the importer at LifterLMS -> Import
-+ Added strict comparisons in several places.
-+ Course "extra" data is only added to course arrays during exports to improve performance on the course builder.
-+ Improved template override loading performance on sites with no child theme.
-
-##### Bug fixes
-
-+ Fixed issues related to reliance on methods provided by the `mb_string` PHP module.
-
-##### Deprecations
-
-+ `LLMS_Admin_Setup_Wizard::generator_course_status()` is deprecated with no replacement.
-+ `LLMS_Admin_Setup_Wizard::watch_course_generation()` is deprecated with no replacement.
-
-
-v4.7.1 - 2020-11-05
--------------------
-
-##### Bug fixes
-
-+ During import generation set the post excerpt during the initial post insert instead of during metadata updates after creation.
-
-##### LifterLMS REST API 1.0.0-beta.16
-
-+ Improved performance of various database queries.
-
-
-v4.7.0 - 2020-11-02
--------------------
-
-##### Updates
-
-+ Major refractor of the `LLMS_Generator` class.
-+ Course export structure improved to include images and reusable blocks found in post content.
-+ When importing courses images will be automatically sideloaded into the media library as new attachment posts
-+ When importing courses reusable blocks will be imported
-+ Improved the success message displayed following a course import
-+ The class `LLMS_Admin_Reporting` is now always loaded on the admin panel.
-+ Performance improvements have been made to the `LLMS_Events_Query` to support using the `no_found_rows` query argument.
-+ When an order's billing plan "completes", a new meta property will be added to the order, `plan_ended`, which can be used to query orders with completed plans.
-+ Made improvements to the admin payment rescheduler tool to have more accurate reporting information.
-
-##### Bug fixes
-
-+ Replaced an instance of the LifterLMS (old) 1.0 rocket logo with the current rocket logo. Thanks [@imknight](https://github.com/imknight)!
-+ Ensure builder `switch-number` fields are set with the `number` type attribute. Thanks [@imknight](https://github.com/imknight)!
-+ Don't display a "View Post" link when updating post types that aren't publicly queryable. Thanks [@imknight](https://github.com/imknight)!
-+ Fixed the incorrect output of an achievment's title in a popover notification when using the {{ACHIEVEMENT_TITLE}} merge code. Thanks [@CadenG150](https://github.com/@CadenG150)!
-+ Fixed an error encountered when plugins utilize the `WP_Users_List_Table` class outside of the `users.php` screen.
-
-##### Deprecations
-
-+ `LLMS_Admin_Import::localize_stat()` is deprecated with no replacement.
-+ `LLMS_Admin_Users_Table::load_dependencies()` is deprecated with no replacement. The included class, `LLMS_Admin_Reporting` is now always loaded.
-+ `LLMS_Generator::add_custom_values()` is deprecated in favor of `LLMS_Generator_Courses::add_custom_values`.
-+ `LLMS_Generator::get_author_id_from_raw()` is deprecated in favor of `LLMS_Generator_Courses::get_author_id_from_raw()`.
-+ `LLMS_Generator::get_default_post_status()` is deprecated in favor of `LLMS_Generator_Courses::get_default_post_status()`.
-+ `LLMS_Generator::get_generated_posts()` is deprecated in favor of `LLMS_Generator::get_generated_content()`.
-+ `LLMS_Generator::format_date()` is deprecated in favor of `LLMS_Generator_Courses::format_date()`.
-+ `LLMS_Generator::increment()` is deprecated with no replacement.
-
-
-v4.6.0 - 2020-10-19
--------------------
-
-+ Added an admin tool to help automatically identify and schedule missed recurring payments
-+ Use `llms_deprecated_function()` in favor of `llms_log()`.
-+ Removed logging and use `apply_filters_deprecated()` in favor of `apply_filters()`.
-
-
-v4.5.1 - 2020-10-14
--------------------
-
-##### Updates
-
-+ Added logic in `LLMS_Database_Query` to reduce unnecessary DB reads when total results are not required.
-
-##### Bug fixes
-
-+ Removed the course "Excerpt" area in favor of utilization of the course sales page content.
-+ Show sales reporting currency symbol based on LifterLMS site options in favor of the browser's locale settings.
-+ Fixed an issue causing achievement-related JS DOM events to be bound unnecessarily. Thanks to [@imknight](https://github.com/imknight)!
-+ Fixed an issue causing site administrator capabilities to be removed during LifterLMS data removal.
-+ Fixed an issue causing an instructors course post count to display 0 on the admin panel courses post table. Thanks to [nhandl3](https://github.com/nhandl3)!
-+ Only display the admin bar "View Manager" to users who can bypass content restrictions.
-+ Updated jQuery code to stop using deprecated events and methods in preparation for jQuery upgrades in the WordPress core.
-+ Fixed PHP notice encountered on the admin panel when using Yoast SEO.
-
-
-v4.5.0 - 2020-10-06
--------------------
-
-##### Updates
-
-+ Students can now choose to make their certificates publicly accessible. Huge thanks to [@alaa-alshamy](https://github.com/alaa-alshamy) for contributing this awesome new feature!
-+ When accessing a certificate that does not have sharing enabled, a 404 will be served in favor of an error message.
-+ Admin payment gateway notices will no longer redisplay a week after being dismissed.
-+ Log files will be automatically split when a file is 5MB or larger, ensuring that log files never grow too large.
-+ During student registration, `wp_signon()` is used to login the newly created user.
-+ Improved slow background process database queries run during the automatic "closing" of idle user sessions.
-
-##### Bug fixes
-
-+ `LLMS_User_Certificate::get_related_post_id()` and `LLMS_User_Certificate::get_user_id()` will now always return an integer.
-+ Fixes issues related to account sign on/out and session start/end events being recorded incorrectly.
-
-##### Deprecations
-
-+ `llms_set_person_auth_cookie()` is deprecated in favor of WP core methods such as `wp_signon()`, `wp_set_current_user()`, and/or `wp_set_auth_cookie()`.
-
-
-v4.4.4 - 2020-09-21
--------------------
-
-##### Bug fixes
-
-+ Don't pass unsupported parameter `$use_cache` to the `calculate_grade()` method, thanks [@pondermatic](https://github.com/pondermatic)!
-+ Add an HTML title attribute to the admin setup wizard page.
-+ Fix issue causing notices to be logged during quiz attempt deletion on the admin panel.
-
-##### Deprecations
-
-+ Method `LLMS_Admin_Setup_Wizard::scripts()` & `LLMS_Admin_Setup_Wizard::output_step_html()` are deprecated with no replacements.
-
-##### LifterLMS REST API version 1.0.0-beta.15
-
-+ Bugfix: Created lessons will now have the derivative `course_id` property set according to the ID of the lesson's parent section.
-+ Bugfix: The `course_id` property of lessons is now properly marked as read-only.
-
-
-v4.4.3 - 2020-09-16
--------------------
-
-+ Bugfix: Fix engagement email duplicate check issue.
-+ Bugfix: Fix transposition issue found in engagement email dupcheck debug log message.
-
-
-v4.4.2 - 2020-09-08
--------------------
-
-+ Bugfix: Fix lesson navigation regression introduced in 4.4.0.
-
-
-v4.4.1 - 2020-09-04
--------------------
-
-+ Bugfix: Delayed engagement emails will not be sent to students who's enrollment is not active in the related course or membership which triggered the email.
-+ Bugfix: Fixed regression introduced in 4.4.0 preventing the `certificates.css` stylesheet from loading on certificate screens.
-+ Update: Engagement email related logs will be logged to a separate logfile, `engagement-emails` in favor of the main `llms` log.
-
-
-v4.4.0 - 2020-09-02
--------------------
-
-##### Updates
-
-+ Improved LifterLMS static asset registration, queuing, definitions, and management.
-+ Added strict comparators in various areas of the codebase.
-
-##### Changes to deprecated function logs and warnings
-
-+ The `llms_deprecated_function()` method now uses `_deprecated_function()` (from the WP core) under the hood.
-+ LifterLMS deprecation warnings are logged to the WP core `debug.log` file in favor of the LifterLMS log file.
-+ LifterLMS deprecation warnings will now trigger a `E_USER_DEPRECATED` error when `WP_DEBUG` is enabled.
-
-##### Bugfixes
-
-+ Fixed a lesson navigation issue encountered when sections contain unpublished lessons.
-+ Fixed an undefined variable notice encountered on the student dashboard.
-+ Fixed an issue encountered when the `wp_login_url()` function returns an empty string.
-+ Fixed a double slash found in an asset URI.
-
-##### Deprecations
-
-+ `LLMS_Frontend_Assets::is_inline_script_enqueued()` is deprecated in favor of `LLMS_Frontend_Assets::is_inline_enqueued()`.
-+ `LLMS_Ajax::register_script()` is deprecated with no replacement.
-+ `LLMS_Ajax::get_ajax_data()` is deprecated with no replacement.
-+ Javascript AJAX nonce variable is moved from `wp_ajax_data.nonce` to `window.llms.ajax-nonce`.
-
-##### Templates Updated
-
-+ templates/checkout/form-gateways.php
-+ templates/course/lesson-preview.php
-+ templates/course/syllabus.php
-
-
-v4.3.3 - 2020-08-17
--------------------
-
-+ Fixed an issue causing legends of reporting charts to be truncated and only readable after a mouse hover.
-+ Fixed an issue caused by passing `null` values to `wp_insert_post()`.
-+ Fixed a javascript error encountered on LifterLMS settings screens.
-
-
-v4.3.2 - 2020-08-10
--------------------
-
-+ WP 5.5 compatibility: Automatically deregister "protected" post types from wp-sitemap.xml.
-
-
-v4.3.1 - 2020-08-06
--------------------
-
-+ When resetting tracking data cookies, set a "secure" cookie where possible.
-+ Catch an unhandled error encountered when generating certificate exports.
-+ When an error is encountered during certificate export generation, display an error notice instead of a general notice.
-
-
-v4.3.0 - 2020-07-28
--------------------
-
-##### Security Fix
-
-+ Fixed an XSS issue on account edit and registration forms. Thanks to [Morningstar](https://twitter.com/0xMstar) for reporting this issue!
-
-##### Bug fixes
-
-+ Fixed an error encountered during customizer live theme preview encountered when Twenty-twenty is the current theme.
-+ The `$type` property of the `LLMS_Abstract_Database_Store` is now set to a default placeholder value (`_db_record_`) in favor of an empty string.
-+ Set the `$type` property of the `LLMS_Event` class to `event`.
-+ Set the `$type` property of the `LLMS_Quiz_Attempt` class to `quiz_attempt`.
-+ Set the `$type` property of the `LLMS_User_Post_Meta` class to `user_postmeta`.
-
-##### Updates
-
-+ Added a filter `llms_form_field_args` to allow extending form fields prior to HTML rendering.
-
-##### Deprecations
-
-The following filter hooks have been deprecated. These hooks were being called as the result of a bug (noted above) and should no longer be used. They will be removed in the next *major* version of LifterLMS.
-
-+ `llms__created` has been deprecated, use `llms_{$type}_created` where `{$type}` is the database record type defined by the class property.
-+ `llms__deleted` has been deprecated, use `llms_{$type}_deleted` where `{$type}` is the database record type defined by the class property.
-+ `llms__updated` has been deprecated, use `llms_{$type}_updated` where `{$type}` is the database record type defined by the class property.
-
-
-v4.2.0 - 2020-07-21
--------------------
-
-##### Updates
-
-+ Admins can now preview the checkout screen as visitors or students using the "View As" function from the WP Admin bar
-+ Javascript cookies now set cookies with `sameSite` set to `strict` as recommended by Firefox/Mozilla.
-+ Added filters to allow 3rd parties to use LifterLMS completion tracking APIs to "complete" external or non-LMS content.
-+ Added "deep" orphan checks when checking the relationship between a quiz and a lesson.
-+ Normalized the return structure in `LLMS_Post_Instructors::get_instructors()` when no instructor set, thanks [@nicolas-jaussaud](https://github.com/nicolas-jaussaud)!
-+ Update LifterLMS rocket icon used in the WP Admin Bar in the "View As" area.
-
-##### Bug fixes
-
-+ When deleting a quiz attempt the related lesson will now be automatically marked as "Incomplete" when appropriate.
-+ `LLMS_Abstract_User_Data::get_id()` now always returns an integer.
-+ Fixed a 404 error resulting from settings tooltips referencing a missing icon asset.
-+ Added logic to set the order status to 'cancelled' when an enrollment linked to an order is deleted.
-
-
-
-v4.1.0 - 2020-07-06
--------------------
-
-##### LifterLMS REST 1.0.0-beta.14
-
-+ **Breaking**: `LLMS_REST_Controller::prepare_links()` now requires a second parameter, the `WP_REST_Request` for the current request. Any classes extending and overwriting this method must adjust their method signature to accommodate this change.
-+ Bugfix: Fixed issue causing response objects to unintentionally include keys of remapped fields. This error occurs only when extending core controllers and attempting to exclude core fields.
-
-
-v4.0.0 - 2020-06-25
--------------------
-
-This is a *major* release. Many backwards incompatible changes have been made that may affect your site if you have custom code which rely on previously deprecated functions or methods. If you're not sure about your custom code, test the upgrade in a [staging site](https://lifterlms.com/docs/staging/).
-
-##### Bug Fixes
-
-+ Fixed an issue encountered during quiz grading.
-+ Add RTL language support for popover interfaces found throughout the course builder.
-+ Fixed issue encountered in MySQL 8.0 when using the bbPress integration.
-
-##### LifterLMS REST API 1.0.0-beta.13
-
-+ Bugfix: Fixed error response messages on the instructors endpoint.
-+ Bugfix: Fixed student progress deletion endpoint issues preventing progress from being fully removed.
-
-##### Action Scheduler Library
-
-Switches from prospress/action-scheduler to woocommerce/action-scheduler. The repository has been moved but it's the same library & upgrades to latest version (3.1.6).
-
-While this is a semantically major upgrade of the library there are no backwards incompatible changes to the public API.
-
-There have been several deprecated functions/classes. The LifterLMS core does not directly use any of these deprecated functions but 3rd parties might and should review the changelog of the library to see if they are affected by any deprecations: https://github.com/woocommerce/action-scheduler/releases.
-
-##### Deprecations
-
-+ Function `LLMS()` is deprecated in favor of `llms()`.
-
-##### Templates Modified
-
-+ templates/global/form-login.php
-+ templates/global/form-registration.php
-
-##### Miscellaneous Breaking Changes
-
-**WP Session Manager Library**
-
-Removes the bundled WP Session Manager plugin dependency, all public methods included with this plugin have been removed without direct replacements.
-
-**Removed JS dependencies**
-
-Removes bundled JS bootstrap 3 dependencies: "collapse" and "transition"
-
-**Removed CSS Classes**
-
-Removes classnames from student dashboard login and registration form wrapper elements which conflict with bootstrap causing visual issues.
-
-These classes are not used by the LifterLMS core or add-ons and are a legacy class that hasn't been removed for fear of creating backwards compatibility issues with any custom css, 3rd party themes, etc...
-
-+ templates/global/form-login.php: Removes `col-1` class from the `div.llms-person-login-form-wrapper` element.
-+ templates/global/form-registration.php: : Removes `col-2` class from the `div.llms-new-person-form-wrapper` element.
-
-**Removed SVG assets and functionality**
-
-+ LifterLMS no longer utilizes SVGs powered by the `LLMS_Svg` class. The class has been deprecated and removed (see below).
-+ The `assets/svg` directory (and all SVG assets contained within) has been removed.
-+ The constant `LLMS_SVG_DIR` has been removed.
-
-##### Previously deprecated classes (and files) that have been removed
-
-+ `LLMS_Admin_Analytics`: `includes/admin/class.llms.admin.analytics.php`
-+ `LLMS_Analytics`: `includes/class.llms.analytics.php`
-+ `LLMS_Analytics_Courses`: `includes/admin/analytics/class.llms.analytics.courses.php`
-+ `LLMS_Analytics_Memberships`: `includes/admin/analytics/class.llms.analytics.memberships.php`
-+ `LLMS_Analytics_Page`: `includes/admin/analytics/class.llms.analytics.page.php`
-+ `LLMS_Analytics_Sales`: `includes/admin/analytics/class.llms.analytics.sales.php`
-+ `LLMS_Course_Basic`: `includes/class.llms.course.basic.php`
-+ `LLMS_Course_Handler`: `includes/class.llms.course.handler.php`
-+ `LLMS_Course_Factory`: `includes/class.llms.course.factory.php`
-+ `LLMS_Lesson_Basic`: `includes/class.llms.lesson.basic.php`
-+ `LLMS_Meta_Box_Expiration`: `includes/admin/post-types/meta-boxes/class.llms.meta.box.expiration.php`
-+ `LLMS_Meta_Box_Video`: `includes/admin/post-types/meta-boxes/class.llms.meta.box.video.php`
-+ `LLMS_Number`: `includes/class.llms.number.php`
-+ `LLMS_Person`: `includes/class.llms.person.php`
-+ `LLMS_Quiz_Legacy`: `includes/class.llms.quiz.legacy.php`
-+ `LLMS_Svg`: `includes/class.llms.svg.php`
-+ `LLMS_Table_Questions`: `includes/admin/reporting/tables/llms.table.questions.php`
-+ `LLMS\Users\User`: `includes/Users/User.php`
-
-##### Previously deprecated class properties that have been removed
-
-+ `LifterLMS->person` (generally accessed via `LLMS()->person`).
-+ `LLMS_Analytics_Widget->date_end`
-+ `LLMS_Analytics_Widget->date_start`
-+ `LLMS_Analytics_Widget->output`
-+ `LLMS_Certificate->enabled`
-+ `LLMS_Course_Data->$course`
-+ `LLMS_Course_Data->$course_id`
-
-##### Previously deprecated class methods that have been removed:
-
-+ `LLMS_Admin_Table::queue_export()`
-+ `LLMS_AJAX::get_achievements()`
-+ `LLMS_AJAX::get_all_posts()`
-+ `LLMS_AJAX::get_associated_lessons()`
-+ `LLMS_AJAX::get_certificates()`
-+ `LLMS_AJAX::get_courses()`
-+ `LLMS_AJAX::get_course_tracks()`
-+ `LLMS_AJAX::get_emails()`
-+ `LLMS_AJAX::get_enrolled_students()`
-+ `LLMS_AJAX::get_enrolled_students_ids()`
-+ `LLMS_AJAX::get_lesson()`
-+ `LLMS_AJAX::get_lessons()`
-+ `LLMS_AJAX::get_lessons_alt()`
-+ `LLMS_AJAX::get_memberships()`
-+ `LLMS_AJAX::get_question()`
-+ `LLMS_AJAX::get_sections()`
-+ `LLMS_AJAX::get_sections_alt()`
-+ `LLMS_AJAX::get_students()`
-+ `LLMS_AJAX::update_syllabus()`
-+ `LLMS_Course::get_children_sections()`
-+ `LLMS_Course::get_children_lessons()`
-+ `LLMS_Course::get_author()`
-+ `LLMS_Course::get_author_id()`
-+ `LLMS_Course::get_author_name()`
-+ `LLMS_Course::get_sku()`
-+ `LLMS_Course::get_id()`
-+ `LLMS_Course::get_title()`
-+ `LLMS_Course::get_permalink()`
-+ `LLMS_Course::get_user_postmeta_data()`
-+ `LLMS_Course::get_user_postmetas_by_key()`
-+ `LLMS_Course::get_checkout_url()`
-+ `LLMS_Course::get_start_date()`
-+ `LLMS_Course::get_end_date()`
-+ `LLMS_Course::get_next_uncompleted_lesson()`
-+ `LLMS_Course::get_lesson_ids()`
-+ `LLMS_Course::get_syllabus_sections()`
-+ `LLMS_Course::get_short_description()`
-+ `LLMS_Course::get_syllabus()`
-+ `LLMS_Course::get_user_enroll_date()`
-+ `LLMS_Course::get_user_post_data()`
-+ `LLMS_Course::check_enrollment()`
-+ `LLMS_Course::is_user_enrolled()`
-+ `LLMS_Course::get_student_progress()`
-+ `LLMS_Course::get_membership_link()`
-+ `LLMS_Lesson::get_assigned_quiz()`
-+ `LLMS_Lesson::get_drip_days()`
-+ `LLMS_Lesson::mark_complete()`
-+ `LLMS_PlayNice::divi_fb_wc_product_tabs_after()`
-+ `LLMS_PlayNice::divi_fb_wc_product_tabs_before()`
-+ `LLMS_PlayNice::wc_is_account_page()`
-+ `LLMS_Post_Instructors::get_defaults()`
-+ `LLMS_Query::set_dashboard_pagination()`
-+ `LLMS_Query::add_query_vars()`
-+ `LLMS_Question::get_correct_option()`
-+ `LLMS_Question::get_correct_option_key()`
-+ `LLMS_Question::get_options()`
-+ `LLMS_Quiz::get_assoc_lesson()`
-+ `LLMS_Quiz::get_passing_percent()`
-+ `LLMS_Quiz::get_remaining_attempts_by_user()`
-+ `LLMS_Quiz::get_time_limit()`
-+ `LLMS_Quiz::get_total_allowed_attempts()`
-+ `LLMS_Quiz::get_total_attempts_by_user()`
-+ `LLMS_Quiz_Attempt::get_status()`
-+ `LLMS_Shortcode_My_Account::lost_password()`
-+ `LLMS_Section::count_children_lessons()`
-+ `LLMS_Section::delete()`
-+ `LLMS_Section::get_children_lessons()`
-+ `LLMS_Section::remove_all_child_lessons()`
-+ `LLMS_Section::remove_child_lesson()`
-+ `LLMS_Section::set_order()`
-+ `LLMS_Section::set_title()`
-+ `LLMS_Section::update()`
-+ `LLMS_Session::init()`
-+ `LLMS_Session::maybe_start_session()`
-+ `LLMS_Session::set_expiration_variant_time()`
-+ `LLMS_Session::set_expiration_time()`
-+ `LLMS_Session::use_php_sessions()`
-+ `LLMS_Student::delete_quiz_attempt()`
-+ `LLMS_Student::get_best_quiz_attempt()`
-+ `LLMS_Student::get_quiz_data()`
-+ `LLMS_Student::has_access()`
-+ `LLMS_Student_Dashboard::output_courses_content()`
-+ `LLMS_Student_Dashboard::output_dashboard_content()`
-+ `LLMS_Student_Dashboard::output_notifications_content()`
-+ `LLMS_Widget_Course_Progress::widget_contents()`
-
-##### Previously deprecated functions that have been removed
-
-+ `is_filtered()`
-+ `lifterlms_template_loop_view_link()`
-+ `llms_add_user_table_columns()`
-+ `llms_add_user_table_rows()`
-+ `llms_create_new_person()`
-+ `llms_get_question()`
-+ `llms_get_quiz()`
-+ `llms_set_user_password_rest_key()`
-+ `llms_setup_product_data()`
-+ `llms_setup_question_data()`
-+ `llms_verify_password_reset_key()`
-
-##### Previously deprecated hooks that have been removed
-
-+ Action: `lifterlms_before_memberships_loop_item_title`
-+ Action: `lifterlms_after_memberships_loop_item_title`
-+ Action: `lifterlms_after_memberships_loop_item_title`
-+ Filter: `lifterlms_completed_transaction_message`
-+ Filter: `lifterlms_is_filtered`
-+ Filter: `lifterlms_get_analytics_pages`
-+ Filter: `lifterlms_analytics_tabs_array`
-
-##### Previously deprecated shortcodes that have been removed
-
-+ `[courses]`
-+ `[lifterlms_user_statistics]`
-
-##### Previously deprecated templates that have been removed
-
-+ `templates/loop/view-link.php`
-
-##### Previously deprecated global variables that have been removed
-
-+ `$product`
-+ `$question`
-
-
-v3.41.1 - 2020-06-23
---------------------
-
-+ Apply restrictions to post content and excerpts during WP REST requests.
-
-
-v4.0.0-rc.1 - 2020-06-18
-------------------------
-
-View release notes at [https://make.lifterlms.com/2020/06/18/lifterlms-version-4-0-0-rc-1/](https://make.lifterlms.com/2020/06/18/lifterlms-version-4-0-0-rc-1/).
-
-
-v3.41.0 - 2020-06-12
---------------------
-
-##### Bug Fixes
-
-+ Fix issues encountered when a user role with the `edit_users` capability has multiple LifterLMS roles (like Student).
-
-##### LifterLMS 4.0.0 Release Preparation
-
-LifterLMS 4.0.0, our first major release in several years, is nearing the end of it's beta testing cycle. Many unused legacy functions, classes, and files are being removed in version 4.0.0 and well as many functions, classes, and files that were previously deprecated.
-
-The following is a list of items that have not been previously deprecated but will be removed from LifterLMS 4.0.0.
-
-For full details on the release, information on beta testing, and more, see our [blog post on the release](https://make.lifterlms.com/2020/06/01/preparing-for-lifterlms-4-0-0/).
-
-##### Deprecations
-
-The WP Session Manager plugin / library that is bundled into the LifterLMS core code base is deprecated from our code base and is being fully removed in favor of an internal session manager.
-
-The bundled Javascript Boostrap 3 modules, "collapse" and "transition" are deprecated from our codebase and are being removed.
-
-The following CSS classes are deprecated and will be removed:
-
-+ `templates/global/form-login.php`: The `col-1` class from the `div.llms-person-login-form-wrapper` element will be removed.
-+ `templates/global/form-registration.php`: : The `col-2` class from the `div.llms-new-person-form-wrapper` element will be removed.
-
-The following classes are deprecated:
-
-+ `LLMS_Number`: `includes/class.llms.number.php`
-+ `LLMS_Person`: `includes/class.llms.person.php`
-+ `LLMS_Table_Questions`: `includes/admin/reporting/tables/llms.table.questions.php`
-
-The following class methods are deprecated:
-
-+ `LLMS_PlayNice::divi_fb_wc_product_tabs_after()`
-+ `LLMS_PlayNice::divi_fb_wc_product_tabs_before()`
-+ `LLMS_Question::get_correct_option()`
-+ `LLMS_Question::get_correct_option_key()`
-+ `LLMS_Quiz::get_passing_percent()`, use `LLMS_Quiz::get( 'passing_percent' )` instead.
-+ `LLMS_Quiz::get_assoc_lesson()`, use `LLMS_Quiz::get( 'lesson_id' )` instead.
-+ `LLMS_Session::init()`
-+ `LLMS_Session::maybe_start_session()`
-+ `LLMS_Session::set_expiration_variant_time()`
-+ `LLMS_Session::set_expiration_time()`
-+ `LLMS_Session::use_php_sessions()`
-
-The following class properties are deprecated:
-
-+ `LifterLMS->person` (generally accessed via `LLMS()->person`).
-
-The following functions are deprecated:
-
-+ `lifterlms_template_loop_view_link()`
-+ `llms_add_user_table_columns()`
-+ `llms_add_user_table_rows()`
-+ `llms_get_question()`
-+ `llms_get_quiz()`
-+ `llms_setup_product_data()`
-+ `llms_setup_question_data()`
-
-The following global variables are deprecated:
-
-+ `$product`
-+ `$question`
-
-The following action hooks are deprecated:
-
-+ `lifterlms_before_memberships_loop_item_title`
-+ `lifterlms_after_memberships_loop_item_title`
-+ `lifterlms_after_memberships_loop_item_title`
-
-The following template file is deprecated:
-
-+ `templates/loop/view-link.php`
-
-
-v4.0.0-beta.3 - 2020-06-10
---------------------------
-
-View beta release notes at [https://make.lifterlms.com/2020/06/10/lifterlms-version-4-0-0-beta-3/](https://make.lifterlms.com/2020/06/10/lifterlms-version-4-0-0-beta-3/).
-
-
-v3.40.0 - 2020-06-09
---------------------
-
-##### Updates
-
-+ Adds a 1-click installation connector for the MailHawk email delivery plugin.
-
-##### Bugfixes
-
-+ Fixed an issue encountered during checkout when using a coupon against an access plan with a free trial.
-
-##### Deprecations
-
-+ `LLMS_SendWP::do_remote_install()` will be converted to a protected method and should no longer be called directly.
-+ `LLMS_Abstract_Email_Provider::output_css()`
-
-##### Templates updated
-
-+ templates/checkout/form-gateways.php
-
-
-v4.0.0-beta.2 - 2020-06-04
---------------------------
-
-View beta release notes at [https://make.lifterlms.com/2020/06/04/lifterlms-version-4-0-0-beta-2/](https://make.lifterlms.com/2020/06/04/lifterlms-version-4-0-0-beta-2/).
-
-
-v4.0.0-beta.1 - 2020-06-01
---------------------------
-
-View beta release notes at [https://make.lifterlms.com/2020/06/01/lifterlms-version-4-0-0-beta-1/](https://make.lifterlms.com/2020/06/01/lifterlms-version-4-0-0-beta-1/).
-
-
-v3.39.0 - 2020-05-28
---------------------
-
-+ Student Welcome notifications and user registered engagements now fire when users are created via the REST POST requests to the `/students` endpoint.
-+ Bugfix: Error encountered when printing full-page certificates on certain themes.
-
-##### LifterLMS REST 1.0.0-beta.12
-
-+ Feature: Added the ability to filter student and instructor collection list requests by various user information fields.
-+ Fix: Prevent infinite loops encountered when invalid API keys are utilized.
-+ Fix: Add an action used to fire LifterLMS core engagement and notification emails
-
-
-v3.38.2 - 2020-05-19
---------------------
-
-+ Added a default question type ("choice") to prevent malformed questions from being inadvertently stored in the database.
-+ When retrieving question data from the database, automatically fall back to the default question type value if no question type is saved.
-
-
-v3.38.1 - 2020-05-11
---------------------
-
-+ Update: Added methods for retrieving a list of posts associated with a membership.
-+ Bug fix: Fixed an issue causing certificate backgrounds to be cropped or cut in certain circumstances.
-+ Bug fix: Fixed an issue generating certificate downloads on servers where `mime_content_type()` does not exist.
-+ Bug fix: Fixed an issue which caused bbPress course forum restrictions to stop working.
-
-
-v3.38.0 - 2020-04-29
---------------------
-
-##### Updates
-
-+ The output of course restriction errors which may prevent enrollment is now displayed in it's own template in favor of the logic being included in the `product/pricing-table.php` template.
-+ The course progress bar shortcode will now only display the progress bar to enrolled users. An additional option has been added to the shortcode to allow showing a 0% progress bar to non-enrolled users. [Read more](https://lifterlms.com/docs/shortcodes/#lifterlms_course_progress).
-+ The "Course Progress" widget now has an option to optionally display the progress bar to non-enrolled users. By default it will display only to enrolled students.
-+ Updates LifterLMS Blocks to version 1.9.0
-
-##### Bug fixes
-
-+ Fixed an issue causing free access plans to bypass course enrollment restrictions like capacity and enrollment time periods.
-+ Fixed an issue causing custom checkout success redirects to fail when using gateways that require a payment confirmation step. This fixes an issue in the LifterLMS PayPal payment gateway.
-+ Fixed an issue causing deprecation theme-compatibility related deprecation notices to be incorrectly thrown.
-+ Fixed spelling error in variable passed to the `product/pricing-table.php` template. The misspelled variable is still being passed to the variable for backwards compatibility.
-+ Updated the way notification background processors are dispatched. This fixes an issue in the LifterLMS Twilio add-on.
-
-##### Deprecations
-
-+ `LLMS_Notifications::dispatch_processors()` is deprecated in favor of async dispatching via `LLMS_Notifications::schedule_processors_dispatch()`.
-
-##### Templates Updated
-
-+ templates/product/pricing-table.php
-
-##### LifterLMS Blocks
-
-+ Update: Improved script dependencies definitions.
-+ Update: Updated asset paths for consistency with other LifterLMS projects.
-+ Update: Updated various WP Core references that have been deprecated (maintains backwards compatibility).
-+ Update: The Lesson Progression block is no longer rendered server-side in the block editor (minor performance improvement).
-+ Update: Converted the course progress block into a dynamic block. Fixes an issue allowing the progress block to be visible to non-enrolled students.
-+ Update: Added a filter on the output of the Pricing Table block: `llms_blocks_render_pricing_table_block`.
-+ Bug fix: Fixed an issue encountered when using the WP Core "Table" block.
-+ Bug fix: Fixed a few areas where `class` was being used instead of `className` to define CSS classes on elements in the block editor.
-+ Bug fix: Fixed a user-experience issues encountered on the Course Information block when all possible information is disabled.
-+ Bug fix: Fixed an issue causing visibility attributes to render on blocks that don't support them.
-+ Bug fix: Fixed an issue preventing 3rd party blocks from modifying default block visibility settings.
-+ Bug fix: Fixed a spelling error visible inside the block editor.
-+ Bug fix: Fixed an issue causing the "Course Progress" block to be shown to non-enrolled students and visitors.
-+ Bug fix: Removed redundant CSS from frontend.
-+ Bug fix: Stop outputting editor CSS on the frontend.
-+ Bug fix: Dynamic blocks with no content to render will now only output their empty render messages inside the block editor, not on the frontend.
-+ Changes to the Classic Editor Block:
- + The classic editor block will no longer show block visibility settings because it is impossible to use those settings to filter the block on the frontend.
- + In order to apply visibility settings to the classic editor block, place the Classic Editor within a "Group" block and apply visibility settings to the Group.
-
-
-v3.37.19 - 2020-04-20
----------------------
-
-##### Updates
-
-+ Added a new debugging tool to clear pending batches created by background processors.
-+ Added a new method `LLMS_Abstract_Notification_View::get_object()` which can be used by notification views to override the loading of the post (or object) which triggered the notification.
-
-##### Bug Fixes
-
-+ Added localization to strings on the coupon admin screen. Thanks [parfilov](https://github.com/parfilov)!
-+ Fixed issue encountered in metaboxes when the `$post` global variable is not set.
-
-
-v3.37.18 - 2020-04-14
----------------------
-
-+ Fix regression introduced in version 3.34.0 which prevented checkout success redirection to external domains.
-+ Resolved a conflict with LifterLMS, Divi, and WooCommerce encountered when using the Divi frontend pagebuilder on courses and memberships.
-+ Fixed issue causing localization issues when creating access plans, thanks [@mcguffin](https://github.com/mcguffin)!
-
-
-v3.37.17 - 2020-04-10
----------------------
-
-##### Updates
-
-+ Updated the lost password and password reset form handlers for improved error handling and extendability by other plugins.
-
-##### Bug Fixes
-
-+ Fixed a conflict with WooCommerce resulting in password reset issues on the WooCommerce account dashboard.
-+ Fixed an issue allowing voucher codes from deleted vouchers to still be redeemed.
-+ Fixed an issue with pagination on the courses tab of a users BuddyPress profile.
-+ Fixed a typo in the `post_status` query arg when retrieving access plans for a course or membership.
-
-##### Deprecations
-
-+ `LLMS_PlayNice::wc_is_account_page()` is no longer required and is deprecated with no replacement
-+ WP core `get_password_reset_key()` should be used in favor of `llms_set_user_password_rest_key()`.
-+ WP core `check_password_reset_key()` should be used in favor of `llms_verify_password_reset_key()`.
-
-
-v3.37.16 - 2020-03-31
----------------------
-
-+ Bugfix: Fix issue causing student dashboard notification view to work incorrectly.
-
-
-v3.37.15 - 2020-03-27
----------------------
-
-##### Security Notice
-
-**This releases fixes a security issue. Please upgrade immediately!**
-
-Props to [Omri Herscovici and Sagi Tzadik from Check Point Research](https://www.checkpoint.com/) who found and disclosed the vulnerability resolved in this release.
-
-##### Updates & Bug Fixes
-
-+ Excluded `page.*` events in order to keep the events table small.
-+ Fixed error encountered when errors encountered validating custom fields. Thanks to [@wenchen](https://github.com/wenchen)!
-+ Fixed issue causing course pagination issues in certain scenarios.
-
-##### LifterLMS REST API Version 1.0.0-beta.11
-
-+ Bugfix: Correctly store user `billing_postcode` meta data.
-+ Bugfix: Fixed issue preventing course.created (and other post.created) webhooks from firing.
-
-
-v3.37.14 - 2020-03-25
----------------------
-
-+ Update: Added the ability to view the PHP error log file (as defined by `ini_get( 'error_log' )` ) on the LifterLMS -> Status -> Logs page.
-+ Update: Added strict comparisons for various condition checks.
-+ Bugfix: Fixed an issue where users might be redirected to the wrong course following a course import at the conclusion of the setup wizard.
-+ Bugfix: Fixed issue with tracking event data being lost due to cookie size limitations.
-+ Bugfix: Fixed issue potentially encountered when checking user capabilities for certificates and achievements.
-+ Bugfix: Fixed an issue preventing additional instances of the JS `LLMS.Storage` class from being instantiated.
-
-
-v3.37.13 - 2020-03-10
----------------------
-
-+ Remove usage of internal functions marked as deprecated.
-
-
-v3.37.12 - 2020-03-10
----------------------
-
-##### Updates
-
-+ Tested up to WordPress Core version 5.4.
-+ Added support for post revisions for course, lesson, and mebership post types.
-
-##### Developer updates
-
-+ Added strict comparisons for various condition checks.
-+ Added a new filter, `llms_builder_{$post_type}_force_delete` which allows control over whether a post is moved to the trash or immediately deleted when trashed via the course builder.
-
-##### Bugfixes
-
-+ Fixed the name of the "actions" column on the quiz reporting screen.
-+ Fixed PHP warnings resulting from functions used to exclude order notes from comment counts.
-+ Fixed issue causing order notes to be included in the count displayed on the admin comments list despite their exclusion from the table itself.
-+ Fixed PHP notice thrown on the WordPress menu editor interface encountered when student dashboard endpoints have been deleted or removed.
-+ Fixed issue causing quotes to be encoded in various email, achievement, and certificate fields.
-
-##### Deprecations
-
-The following have been deprecated with no replacements and will be removed in the next major update:
-
-+ `LLMS_Course_Factory::get_course()`
-+ `LLMS_Course_Factory::get_lesson()`
-+ `LLMS_Course_Factory::get_product()`
-+ `LLMS_Course_Factory::get_quiz()`
-+ `LLMS_Course_Factory::get_question()`
-+ `LLMS_Course_Handler::get_users_not_enrolled()`
-
-
-v3.37.11 - 2020-03-03
----------------------
-
-##### Updates
-
-+ Resolved a conflict with the "Starter Templates" plugin which made it impossible to edit quizzes while the plugin was enabled.
-
-##### Bugfixes
-
-+ Fixed an issue causing lesson post authors to be "lost" when adding an existing lesson to a course.
-+ Fixed an issue causing php notices to be generated during existing lesson addition on the course builder.
-+ Fixed an issue causing course bbPress forums to be lost when editing that course using the "Quick Edit" function from the courses table.
-
-##### LifterLMS REST v1.0.0-beta.10
-
-+ Added text domain to i18n functions that were missing the domain.
-+ Added a "trigger" parameter to enrollment-related endpoints.
-+ Added `llms_rest_enrollments_item_schema`, `llms_rest_prepare_enrollment_object_response`, `llms_rest_enrollment_links` filter hooks.
-+ Fixed setting roles instead of appending them when updating user, thanks [@pondermatic](https://github.com/pondermatic)!
-+ Fixed return when the enrollment to be deleted doesn't exist, returns `204` instead of `404`.
-+ Fixed 'context' query parameter schema, thanks [@pondermatic](https://github.com/pondermatic)!
-
-
-v3.37.10 - 2020-02-19
----------------------
-
-+ Update: Exclude the privacy policy page from the sitewide restriction.
-+ Update: Added filter `llms_enable_open_registration`.
-+ Fix: Notices are printed on pages configured as a membership restriction redirect page.
-+ Fix: Do not apply membership restrictions on the page set as membership's restriction redirect page.
-+ Fix: Added flag to print notices when landing on the redirected page.
-
-
-v3.37.9 - 2020-02-11
---------------------
-
-+ Updated CSS classes used in privacy policy text suggestions per changes in WordPress core 5.3. Thanks [@garretthyder](https://github.com/garretthyder)!
-+ Added privacy exported group descriptions. Thanks [@garretthyder](https://github.com/garretthyder)!
-+ Added filters `llms_user_enrollment_allowed_post_types` & `llms_user_enrollment_status_allowed_post_types` which allow 3rd parties to enroll users into additional post types via core enrollment methods.
-+ Added option for admin settings fields to show an asterisk for required fields.
-+ Added option for integration plugins can now add automatically generated "Settings" link to the plugins screen.
-+ Bugfix: Fixed an IE compatibility issue related to usage of `Object.assign()`.
-
-
-v3.37.8 - 2020-01-21
---------------------
-
-+ Fix: Student quiz attempts are now automatically deleted when a quiz is deleted.
-+ Fix: "Orphaned" quizzes (those with no parent course and/or lesson) can be deleted from the Quiz reporting table.
-+ Fix: Quiz IDs on the quiz reporting screen now link to the quiz within the course builder. If the quiz is an "orphan" there will be no link.
-
-
-v3.38.0-beta.2 - 2019-12-19
----------------------------
-
-+ Update LifterLMS Blocks to v1.7.3.
-
-
-v3.38.0-beta.1 - 2019-12-13
----------------------------
-
-##### Form Management Improvments
-
-+ Forms (registration, checkout, account) are now managed via a block editor interface.
-+ Customize field labels, description, and placeholders in a simple WYSIWYG interface.
-+ Mark fields as required with a toggle.
-+ Reorder fields with drag and drop.
-+ Customize layout using block editor columns.
-+ Use LifterLMS block-level visibility to conditionally display fields based on enrollment or logged in status.
-
-##### Form Localization
-
-+ Added default country and state/region lists (see the "languages" directory).
-+ Country and state forms are now searchable dropdowns that adjusted based on the currently selected country.
-+ Each country's locale information (such as what a "post code" is called and whether or not the country has states or post codes) will update automatically based on the selected country.
-+ Enqueue select2 on account and checkout pages for searchable dropdowns for country & state.
-
-##### Updates
-
-+ New shortcode `[user]` which is used to output user information in a merge code interface.
-+ Improved form field generation via `LLMS_Form_Field` class.
-+ LifterLMS Settings: renamed "User Information Options" to "User Privacy Options".
-+ Reorganized open registration setting.
-+ Use `LLMS.wait_for()` for dependency waiting.
-+ Moved checkout template variable declarations to the checkout shortcode controller.
-+ Removed field display settings in favor of form customization using the form editors.
-+ Organized function files. Some functions have been moved.
-+ Function `llms_get_minimum_password_strength_name()` now accepts a parameter to retrieve strength name by key.
-+ Use `LLMS.wait_for()` for dependency waiting.
-
-##### LifterLMS Blocks v1.6.0
-
-+ Feature: Added form field blocks for use on the Forms manager.
-+ Feature: Add logic for `logged_in` and `logged_out` block visibility options.
-+ Update: Added isDisabled property to Search component.
-+ Update: Adjusted priority of `render_block` filter to 20.
-+ Bug fix: Import `InspectorControls` from `wp.blockEditor` in favor of deprecated `wp.editor`
-+ Bug fix: Automatically store course/membership instructor with `post_author` data when the post is created.
-+ Bug fix: Pass style rules as camelCase.
-
-##### Removed unused Javascript assets
-
-+ Remove unused bootstrap transiton and collapse scripts.
-+ Remove topModal vendor dependency.
-+ Remove password strength inline enqueues.
-
-##### Bug fixes
-
-+ Only attempt to add a nonce to the datastore when a nonce exists in the settings object.
-
-##### Deprecations
-
-+ Deprecated `LLMS_Person_Handler::register()` method, use `llms_register_user()` instead.
-+ Deprecated `llms_get_minimum_password_strength()` with no replacement.
-
-##### Template Updates
-
-+ templates/checkout/form-checkout.php
-+ templates/checkout/form-gateways.php
-+ templates/global/form-registration.php
-
-v3.37.7 - 2020-01-08
---------------------
-
-+ Fix error resulting from undefined default value.
-+ Fix PHP 7.4 deprecation notice.
-
-
-v3.37.6 - 2019-12-12
---------------------
-
-+ New transaction creation date is now specified using `llms_current_time()`.
-+ Use the last successful transaction time to calculate from when the previously stored next payment date is in the future.
-+ Fixed an issue causing transaction post titles to be recorded with missing data due to invalid `strftime()` placeholders.
-
-
-v3.37.5 - 2019-12-09
---------------------
-
-+ Update LifterLMS Blocks to v1.7.2: fixes a bug causing the block editor to encounter a fatal error when accessing custom post types that don't support custom fields.
-
-
-v3.37.4 - 2019-12-06
---------------------
-
-##### Bug Fixes
-
-+ Fixed a bug causing certificate _template_ exports to export the site's homepage instead of the certificate preview.
-+ When exporting a certificate template, use the `post_author` to determine what user to use for merge code data.
-+ Revert Accounts settings tab page id to "account".
-
-##### LifterLMS Blocks v1.7.1
-
-+ Feature: Add logic for `logged_in` and `logged_out` block visibility options.
-+ Update: Added `isDisabled` property to Search component.
-+ Update: Adjusted priority of `render_block` filter to 20.
-+ Update: Added filter, `llms_block_supports_visibility` to allow modification of the return of the check.
-+ Update: Disabled block visibility on registration & account forms to prevent a potentially confusing form creation experience.
-+ Update: Added block editor rendering for password type fields.
-+ Update: Perform post migrations on `current_screen` instead of `admin_enqueue_scripts`.
-+ Update: Update various dependencies to use updated gutenberg packages.
-+ Bug fix: Fixed a WordPress 5.3 issues with JSON data affecting the ability to save course/membership instructors.
-+ Bug fix: Import `InspectorControls` from `wp.blockEditor` in favor of deprecated `wp.editor`
-+ Bug fix: Automatically store course/membership instructor with `post_author` data when the post is created.
-+ Bug fix: Pass style rules as camelCase.
-+ Bug fix: Fixed an issue causing "No HTML Returned" to be displayed in place of the Lesson Progression block on free lessons when viewed by a logged-out user.
-
-
-v3.37.3 - 2019-12-03
---------------------
-
-+ Added an action `llms_certificate_generate_export` to allow modification of certificate exports before being stored on the server.
-+ Don't unslash uploaded file `tmp_name`, thanks [@pondermatic](https://github.com/pondermatic)!
-+ TwentyTwenty Theme Support: Hide site header and footer, and set a white body background in single certificates.
-+ Renamed setting field IDs to be unique for open/close wrapper fields on the engagements and account settings pages.
-+ Removed redundant functions defined in the `LLMS_Settings_Page` class to reduce code redundancy in account and engagement setting page classes.
-+ The `LLMS_Settings_Page` base class now automatically defines actions to save and output settings content.
-
-
-v3.37.2 - 2019-11-22
---------------------
-
-+ LifterLMS notices will now be displayed on pages defined as a Course or Membership sales page.
-+ TwentyTwenty Theme: Updated to use `background-color` property instead of `background` shorthand when adding custom elements to style.
-+ Added filter `llms_sessions_end_idle_cron_recurrence` to allow customization of the recurrence of the idle session cleanup cronjob.
-+ Added filter `llms_quiz_is_open` to allow customization of whether or not a quiz is available to a student.
-+ When adding an client-side tracking events to the always make sure the server-side verification nonce is always set on the storage object.
-+ The Course/Membership filter on the main students reporting screen now correctly limits post results based on instructor access.
-
-
-v3.37.1 - 2019-11-13
---------------------
-
-+ TwentyTwenty Theme: Fixed course information block misalignment.
-+ Fixed conflict with WooCommerce resulting from the movement of the deprecated LiftreLMS function `is_filtered()`.
-
-
-v3.37.0 - 2019-11-11
---------------------
-
-##### Updates
-
-+ Tested and compatible with WordPress core 5.3.
-+ Add theme support for the TwentyTwenty core default theme.
-+ Improved security and data sanitization in with regards to the SendWP integration connector.
-
-##### LifterLMS Rest API 1.0.0-beta.8
-
-+ Added memberships controller, huge thanks to [@pondermatic](https://github.com/pondermatic)!
-+ Added new filters:
-
- + `llms_rest_lesson_filters_removed_for_response`
- + `llms_rest_course_item_schema`
- + `llms_rest_pre_insert_course`
- + `llms_rest_prepare_course_object_response`
- + `llms_rest_course_links`
-
-+ Improved validation when defining instructors for courses.
-+ Improved performance on post collection listing functions.
-+ Ensure that a course instructor is always set for courses.
-+ Fixed `sales_page_url` not returned in `edit` context.
-+ In `update_additional_object_fields()` method, use `WP_Error::$errors` in place of `WP_Error::has_errors()` to support WordPress version prior to 5.1.
-
-
-v3.36.5 - 2019-11-05
---------------------
-
-+ Add filter: `llms_user_caps_edit_others_posts_post_types` to allow 3rd parties to utilize core methods for determining if a user can manage another users LMS content on the admin panel.
-
-
-v3.36.4 - 2019-11-01
---------------------
-
-+ Fixes a conflict with CartFlows introduced by a Divi theme compatibility fix added in 3.36.3. Is WordPress complicated or what?
-
-
-v3.36.3 - 2019-10-24
---------------------
-
-##### Updates
-
-+ Added new `LLMS_Membership` class methods: `get_categories()`, `get_tags()` and `toArrayAfter()` methods. Thanks [@pondermatic](https://github.com/pondermatic)!
-
-##### Compatibility
-
-+ Fixed access plan description conflicts with the Classic Editor block. This also resolves compatibility issues with Elementor which uses a hidden TinyMCE instance.
-+ Changed `pre_get_posts` callback from `10` (default) to `15`. Fixes conflict with Divi (and possibly other themes) which prevented LifterLMS catalog settings from functioning properly.
-
-##### Bugfixes
-
-+ Added translation to error message encountered when non-members attempt to purchase a members-only access plan. Thanks [@mrosati84](https://github.com/mrosati84)!
-+ Fix return of `LLMS_Generator::set_generator()`.
-+ Fixed a typo causing invalid imports from returning the expected error. Thanks [@pondermatic](https://github.com/pondermatic)!
-+ Fixed issue preventing membership post type settings from saving properly due to incorrect sanitization filters.
-+ Fixed issue where `wp_list_pluck()` would run on non arrays.
-
-
-v3.36.2 - 2019-10-01
---------------------
-
-##### Updates
-
-+ Tested to WordPress 5.3.0-beta.2
-+ Upgrade UI on student course reporting screens.
-+ Added logic to physically remove from the membership level and remove enrollments data on related products, when deleting a membership enrollment.
-+ Lesson metabox "start" drip method made available only if the parent course has a start date set.
-
-##### Bugfixes
-
-+ Fixed JS error when client-side event tracking settings aren't loaded, thanks [@wenchen](https://github.com/wenchen)!
-+ Fixed PHP warning resulting from drip the "Course Start" lesson drip settings when no course start date exists.
-+ Fixed fatal error encountered when reviewing an order placed with a payment gateway that's been deactivated.
-
-##### Files Updated
-
-+ assets/js/app/llms-tracking.js
-+ includes/admin/post-types/meta-boxes/class.llms.meta.box.lesson.php
-+ includes/models/model.llms.lesson.php
-+ includes/models/model.llms.student.php
-+ lifterlms.php
-
-##### Templates Updated
-
-+ templates/admin/post-types/order-details.php
-+ templates/admin/reporting/tabs/students/courses-course.php
-
-
-v3.36.1 - 2019-09-24
---------------------
-
-##### Updates
-
-+ Include SendWP Connector in LifterLMS Engagement Settings.
-+ Removed usage of `WP_Error::has_errors()` to support WordPress version prior to 5.1.
-+ Improve performances when checking if an event is valid in `LLMS_Events->is_event_valid()`.
-+ Remove redundant check on `is_singular()` and `is_post_type_archive()` in `LLMS_Events->should_track_client_events()`.
-
-##### Bugfixes
-
-+ Fixed a compatibility issue with FitVids.js causing excess white space displayed around videos when using the library, WP plugin, or themes that utilize the library.
-+ Fixed an issue allowing recurring charges to continue processing after the order or customer had been deleted from the site.
-+ Fixed issue causing Membership Restriction settings from properly saving.
-+ Fixed issue that allowed instructors to see all quizzes on a site when the instructor had either no courses or only empty courses (courses with no lessons).
-+ Fixed "Last Seen" column displaying wrong date when the student last login date was saved as timestamp.
-+ Fixed an issue causing popover notifications to be skipped (never displayed) as a result of redirects.
-
-
-v3.36.0 - 2019-09-16
---------------------
-
-##### User Interaction event and session Tracking
-
-+ Added user interaction tracking for the following events:
-
- + User sign in and out.
- + Page load and exit (for LMS content)
- + Page focus and blur (for LMS content)
- + And more to come
-
-+ Interaction events are grouped into sessions automatically. A session is "closed" after 30 minutes of inactivity or a log-out event.
-+ Added "Last Seen" student reporting column which reports the last recorded activity for the student.
-
-##### Enhancements
-
-+ Automatically hydrate when calling LLMS_Abstract_Database_Store::to_array().
-+ Added CSS to make course and lesson video embeds automatically responsive.
-
-##### Bug Fixes
-
-+ Correctly pass the `$remember` variable when using `llms_set_person_auth_cookie()`.
-+ Fixed undefined index error when retrieving an unset value from an unsaved database model.
-+ Fix issue causing quotes to be encoded in shortcodes used in course and membership restriction message settings fields.
-+ Fix issue preventing manual updates of order dates (next payment, trial expiration, and access expiration) from being saved properly.
-
-
-v3.35.2 - 2019-09-06
---------------------
-
-+ When sanitizing settings, don't strip tags on editor and textarea fields that allow HTML.
-+ Added JS filter `llms_lesson_rerender_change_events` to lesson editor view re-render change events.
-
-
-v3.35.1 - 2019-09-04
---------------------
-
-+ Fix instances of improper input sanitization and handling.
-+ Include scripts, styles, and images for reporting charts and datepickers
-
-
-v3.35.0 - 2019-09-04
---------------------
-
-##### Security Notice
-
-+ Fixed a security vulnerability disclosed by the WordPress plugin review team. Please upgrade immediately!
-
-##### Updates
-
-+ Explicitly setting css and js file versions for various static assets..
-+ Added data sanitization methods in various form handlers.
-+ Added nonce verification to various form handlers.
-
-##### Bug fixes
-
-+ Fixed some translation strings that had literal variables instead of placeholders.
-+ Fixed undefined index error encountered when attempting to email a voucher export.
-+ Fixed undefined index error when PHP file upload errors are encountered during a course import.
-
-##### Deprecations
-
-The following unused classes have been marked as deprecated and will be removed from LifterLMS in the next major release.
-
-+ LLMS_Analytics_Memberships
-+ LLMS_Analytics_Courses
-+ LLMS_Analytics_Sales
-+ LLMS_Meta_Box_Expiration
-+ LLMS_Meta_Box_Video
-
-##### Template Updates
-
-+ [admin/reporting/tabs/courses/overview.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/courses/overview.php)
-+ [admin/reporting/tabs/memberships/overview.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/memberships/overview.php)
-+ [admin/reporting/tabs/quizzes/attempts.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/quizzes/attempts.php)
-+ [admin/reporting/tabs/quizzes/overview.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/quizzes/overview.php)
-+ [admin/reporting/tabs/students/courses-course.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/students/courses-course.php)
-+ [admin/reporting/tabs/students/courses.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/students/courses.php)
-+ [loop/featured-image.php](https://github.com/gocodebox/lifterlms/blob/master/templates/loop/featured-image.php)
-+ [myaccount/view-order.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/view-order.php)
-+ [quiz/results.php](https://github.com/gocodebox/lifterlms/blob/master/templates/quiz/results.php)
-+ [single-certificate.php](https://github.com/gocodebox/lifterlms/blob/master/templates/single-certificate.php)
-+ [single-no-access.php](https://github.com/gocodebox/lifterlms/blob/master/templates/single-no-access.php)
-+ [taxonomy-course_cat.php](https://github.com/gocodebox/lifterlms/blob/master/templates/taxonomy-course_cat.php)
-+ [taxonomy-course_difficulty.php](https://github.com/gocodebox/lifterlms/blob/master/templates/taxonomy-course_difficulty.php)
-+ [taxonomy-course_tag.php](https://github.com/gocodebox/lifterlms/blob/master/templates/taxonomy-course_tag.php)
-+ [taxonomy-course_track.php](https://github.com/gocodebox/lifterlms/blob/master/templates/taxonomy-course_track.php)
-+ [taxonomy-membership_cat.php](https://github.com/gocodebox/lifterlms/blob/master/templates/taxonomy-membership_cat.php)
-+ [taxonomy-membership_tag.php](https://github.com/gocodebox/lifterlms/blob/master/templates/taxonomy-membership_tag.php)
-
-
-v3.34.5 - 2019-08-29
---------------------
-
-+ Fixed logic issues preventing pending orders from being completed.
-
-##### Templates Changed
-
-+ [checkout/form-confirm-payment.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-confirm-payment.php)
-
-v3.34.4 - 2019-08-27
---------------------
-
-+ Add a new admin settings field type, "keyval", used for displaying custom html alongside a setting.
-+ Added filter `llms_order_can_be_confirmed`.
-+ Always bind JS for the login form handler on checkout and registration screens.
-
-##### Templates Changed
-
-+ [checkout/form-confirm-payment.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-confirm-payment.php)
-
-##### LifterLMS REST API v1.0.0-beta.6
-
-+ Fix issue causing certain webhooks to not trigger as a result of action load order.
-+ Change "access_plans" to "Access Plans" for better human reading.
-
-
-v3.34.3 - 2019-08-22
---------------------
-
-+ During payment gateway order completion, use `llms_redirect_and_exit()` instead of `wp_redirect()` and `exit()`.
-
-##### LifterLMS REST API v1.0.0-beta.5
-
-+ Load all required files and functions when authentication is triggered.
-+ Access `$_SERVER` variables via `filter_var` instead of `llms_filter_input` to work around PHP bug https://bugs.php.net/bug.php?id=49184.
-
-
-v3.34.2 - 2019-08-21
---------------------
-
-##### LifterLMS REST API v1.0.0-beta.4
-
-+ Load authentication handlers as early as possible. Fixes conflicts with numerous plugins which load user information earlier than expected by the WordPress core.
-+ Harden permissions associated with viewing student enrollment information.
-+ Returns a 400 Bad Request when invalid dates are supplied.
-+ Student Enrollment objects return student and post id's as integers instead of strings.
-+ Fixed references to an undefined function.
-
-
-v3.34.1 - 2019-08-19
---------------------
-
-+ Update LifterLMS REST to v1.0.0-beta.3
-
-##### Interface and Experience improvements during API Key creation
-
-+ Better expose that API Keys are never shown again after the initial creation.
-+ Allow downloading of API Credentials as a `.txt` file.
-+ Add `required` properties to required fields.
-
-##### Updates
-
-+ Added the ability to CRUD webhooks via the REST API.
-+ Conditionally throw `_doing_it_wrong` on server controller stubs.
-+ Improve performance by returning early when errors are encountered for various methods.
-+ Utilizes a new custom property `show_in_llms_rest` to determine if taxonomies should be displayed in the LifterLMS REST API.
-+ On the webhooks table the "Delivery URL" is trimmed to 40 characters to improve table readability.
-
-##### Bug fixes
-
-+ Fixed a formatting error when creating webhooks with the default auto-generated webhook name.
-+ On the webhooks table a translatable string is output for the status instead of the database value.
-+ Fix an issue causing the "Last" page pagination link to display for lists with 0 possible results.
-+ Don't output the "Last" page pagination link on the last page.
-
-
-
-v3.34.0 - 2019-08-15
---------------------
-
-##### LifterLMS REST API v1.0.0-beta.1
-
-+ A robust REST API is now included in the LifterLMS core.
-+ Create API Keys to consume and manage LifterLMS resources and students from external applications.
-+ Create webhooks to pass LifterLMS resource data to external applications (like Zapier!).
-+ The full API specification can be found at [https://gocodebox.github.io/lifterlms-rest/](https://gocodebox.github.io/lifterlms-rest/).
-
-##### Student management capabilities
-
-+ Explicit capabilities have been added to determine which users can create, view, update, and delete students.
-+ Admins and LMS Managers have all student management capabilities.
-+ Instructors and instructors assistants are granted limited view capabilities allowing them to only view students enrolled in their own courses/memberships.
-+ Added the `list_users` capability to the "Instructor" role, allowing instructor's to better view and manage their assistant instructors.
-+ The new capabilities are: `create_students`, `view_students`, `view_others_students`, `edit_students`, `edit_others_students`, `delete_students`, & `delete_others_students`.
-
-##### Updates
-
-+ Added new actions to help differentiate enrollment creation and update events.
-+ Added methods and logic for managing user management of other users.
-+ Added a filter `llms_table_get_table_classes` to LifterLMS admin tables which allows customization of the CSS classes applied to the `
` elements. Thanks [@pondermatic](https://github.com/pondermatic)!
-+ Added a filter `llms_install_get_schema` to the database schema to allow 3rd parties to run table installations alongside the core.
-+ Added the ability to pull "raw" (unfiltered) data from the database via classes extending the `LLMS_Post_Model` abstract.
-+ Added a `bulk_set()` method to the `LLMS_Post_Model` abstract allowing the updating of multiple properties in one command.
-+ Added `comment_status`, `ping_status`, `date_gmt`, `modified_gmt`, `menu_order`, `post_password` as gettable\settable post properties via the `LLMS_Post_Model` abstract.
-+ Links on reporting tables are now the proper color.
-+ The `editable_roles` filter which determines which roles can manage which other roles is now always loaded (instead of being loaded only on the admin panel).
-+ Updated LifterLMS Blocks to 1.5.2
-
-##### Bug Fixes
-
-+ Fixed an issue preventing the `user_url` property from being retrieved by the `get()` method of the `LLMS_Abstract_User_Data` class.
-+ Fixed an issue causing the `LLMS_Instructors::get_assistants()` method to return assistants for the currently logged in user instead of the instructor of the instantiated object.
-+ Fixed an issue which would allow LMS Managers to edit and delete site administrators.
-
-##### Deprecations
-
-**The following functions and methods have been marked as deprecated and will be removed from LifterLMS with the next major release.**
-
-+ LLMS_Course::get_children_sections() use LLMS_Course::get_sections( 'posts' )" instead
-+ LLMS_Course::get_children_lessons() use LLMS_Course::get_lessons( 'posts' )" instead
-+ LLMS_Course::get_author()
-+ LLMS_Course::get_author_id() use LLMS_Course::get( "author" ) instead
-+ LLMS_Course::get_author_name()
-+ LLMS_Course::get_sku() use LLMS_Course::get( "sku" ) instead
-+ LLMS_Course::get_id() use LLMS_Course::get( "id" ) instead
-+ LLMS_Course::get_title() use get_the_title() instead
-+ LLMS_Course::get_permalink() use get_permalink() instead
-+ LLMS_Course::get_user_postmeta_data()
-+ LLMS_Course::get_user_postmetas_by_key()
-+ LLMS_Course::get_checkout_url()
-+ LLMS_Course::get_start_date() use LLMS_Course::get_date( "start_date" ) instead
-+ LLMS_Course::get_end_date() use LLMS_Course::get_date( "end_date" ) instead
-+ LLMS_Course::get_next_uncompleted_lesson()
-+ LLMS_Course::get_lesson_ids() use LLMS_Course::get_lessons( "ids" ) instead
-+ LLMS_Course::get_syllabus_sections() use LLMS_Course::get_sections() instead
-+ LLMS_Course::get_short_description() use LLMS_Course::get( "excerpt" ) instead
-+ LLMS_Course::get_syllabus() use LLMS_Course::get_sections() instead
-+ LLMS_Course::get_user_enroll_date()
-+ LLMS_Course::get_user_post_data()
-+ LLMS_Course::check_enrollment()
-+ LLMS_Course::is_user_enrolled() use llms_is_user_enrolled() instead
-+ LLMS_Course::get_student_progress() use LLMS_Student::get_progress() instead
-+ LLMS_Course::get_membership_link()
-
-
-v3.33.2 - 2019-06-26
---------------------
-
-+ It is now possible to send test copies of the "Student Welcome" email to yourself.
-+ Improved information logged when an error is encountered during an email send.
-+ Add backwards compatibility for legacy add-on integrations priority loading method.
-+ Fixed undefined index notice when viewing log files on the admin status screen.
-
-
-v3.33.1 - 2019-06-25
---------------------
-
-##### Updates
-
-+ Added method to retrieve the load priority of integrations.
-+ The capabilities used to determine if uses can clone and export courses now check `edit_course` instead of `edit_post`.
-
-##### Bug Fixes
-
-+ Fixed an issue which would cause the "Net Sales" line to sometimes display as a bar on the sales revenue reporting chart.
-+ Fixed an issue causing a PHP notice to be logged when viewing the sales reporting screen.
-+ Fixed an issue causing backslashes to be added before quotation marks in access plan descriptions.
-+ Integration classes are now loaded in the order defined by the integration class.
-+ Fixed an issue causing a PHP error when viewing the admin logs screen when no logs exist.
-
-
-v3.33.0 - 2019-05-21
---------------------
-
-##### Updates
-
-+ Added the ability for site administrators to delete (completely remove) enrollment records from the database.
-+ Catalogs sorted by Order (`menu_order`) now have an additional sort (by post title) to improve ordering consistency for items with the same order, thanks [@pondermatic](https://github.com/pondermatic)!
-+ Hooks in the dashboard order review template now pass the `LLMS_Order`.
-
-##### LifterLMS Blocks
-
-+ Updated to version 1.5.1
-+ All blocks are now registered only for post types where they can actually be used.
-+ Only register block visibility settings on static blocks. Fixes an issue causing core (or 3rd party) dynamic blocks from being managed within the block editor.
-
-##### Bug Fixes
-
-+ If an enrolled student accesses checkout for a course/membership they're already enrolled in they will be shown a message stating as much.
-+ Removed a redundant check for the existence of an order on the dashboard order review template.
-+ When an order is deleted, student enrollment records for that order will be removed. This fixes an issue causing admins to not be able to manage the enrollment status of a student enrolled via a deleted order.
-+ Fix issue causing errors when using the `[lifterlms_lesson_mark_complete]` shortcode on course post types.
-+ Fixed an issue causing quiz questions to generate publicly accessible permalinks which could be indexed by search engines.
-
-##### Templates Changed
-
-+ [course/complete-lesson-link.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/complete-lesson-link.php)
-+ [templates/myaccount/view-order.php](https://github.com/gocodebox/lifterlms/blob/master/templates/templates/myaccount/view-order.php)
-
-
-v3.32.0 - 2019-05-13
---------------------
-
-##### Updates
-
-+ Added Membership reporting
-+ Added the ability to restrict coupons to courses and memberships which are in draft or scheduled status.
-+ When recurring payments are disabled, output a "Staging" bubble on the "Orders" menu item.
-+ Recurring recharges now add order notes and trigger actions when gateway or recurring payment status errors are encountered.
-+ When managing recurring payment status through the warning notice, stay on the same page and clear nonces instead of redirecting to the LifterLMS Settings screen.
-+ Updated the Action Scheduler library to the latest version (2.2.5)
-+ Exposed the Action Scheduler's scheduled actions interface as a tab on the LifterLMS Status page.
-
-##### LifterLMS Blocks
-
-+ Updated to version 1.4.1.
-+ Fixed issue causing asset paths to have invalid double slashes.
-+ Fixed issue causing frontend css assets to look for an unresolvable dependency.
-
-##### Bug Fixes
-
-+ Fixed an issue allowing instructors to view a list of students from courses and memberships they don't have access to.
-+ WooCommerce compatibility filters added in 3.31.0 are now scheduled at `init` instead of `plugins_loaded`, resolves conflicts with several WooCommerce add-ons which utilize core WC functions before LifterLMS functions are loaded.
-
-
-v3.31.0 - 2019-05-06
---------------------
-
-##### Updates
-
-+ Tested to WordPress 5.2
-+ Adds explicit support for the twentynineteen default theme.
-+ The main students reporting table can now be filtered to show only students enrolled in a specific course or membership.
-+ Resolve conflict with WooCommerce (3.6 and later) resulting in 404s on the dashboard endpoints "lost password", "order history", and "edit account".
-+ Adds a dynamic filter (`llms_notification_view{$trigger_id}_basic_options`) to basic (pop-over) notifications to allow configuration of their settings.
-+ The filter `llms_plan_get_checkout_url` now passes a 3rd parameter: `$check_availability`
-+ Improves `LLMS_Course_Data` and `LLMS_Quiz_Data` classes by adding shared functionality to a shared abstract, `LLMS_Abstract_Post_Data`
-+ Changed access on class methods in `LLMS_Shortcode_Courses` from private to protected, thanks [@andrewvaughan](https://github.com/andrewvaughan)!
-
-##### Bug fixes
-
-+ Treats `post_excerpt` data as HTML instead of plain text. Fixes an issue resulting in HTML tags being stripped from lesson excerpts when duplicating a lesson in the course builder or importing lessons via the course importer.
-+ Fix an issue allowing access plan sales prices to be set as negative values.
-
-##### LifterLMS Blocks
-
-+ Updated to LifterLMS Blocks 1.4.0.
-+ Adds an "unmigration" utility to LifterLMS -> Status -> Tools & Utilities which can be used to remove LifterLMS blocks from courses and lessons which were migrated to the block editor structure.
-+ This tool is only available when the Classic Editor plugin is installed and enabled and it will remove blocks from ALL courses and lessons regardless of whether or not the block editor is being utilized on that post.
-
-##### Deprecations
-
-+ `LLMS_Query::add_query_vars()` use `LLMS_Query::set_query_vars()` instead.
-
-
-v3.30.3 - 2019-04-22
---------------------
-
-##### Updates
-
-+ Fixed typos and spelling errors in various strings.
-+ Corrected a typo in the `content-disposition` header used when exporting voucher CSVs, thanks [@pondermatic](https://github.com/pondermatic)!
-+ Improved the quiz attempt grading experience by automatically focusing the remarks field and only toggling the first answer if it's not visible, thanks [@eri-trabiccolo](https://github.com/eri-trabiccolo)!
-+ Removed commented out code on the Student Dashboard Notifications Tab template, thanks [@tnorthcutt](https://github.com/tnorthcutt)!
-
-##### Bug Fixes
-
-+ Renamed "descrpition" key to "description" found in the return of `LLMS_Instructor()->toArray()`.
-+ Fixed an issue causing slashes to be stripped from course content when cloning a course.
-+ Fixed an issue causing JS warnings to be thrown in the Javascript console on Course and Membership edit pages on the admin panel due to variables being defined too late, thanks [@eri-trabiccolo](https://github.com/eri-trabiccolo)!
-+ Fixed an undefined variable notice encountered when filtering quiz attempts on the quiz attempts reporting screen, thanks [@eri-trabiccolo](https://github.com/eri-trabiccolo)!
-+ Fixed an issue causing slashes to appear before quotation marks when saving remarks on a quiz attempt, thanks [@eri-trabiccolo](https://github.com/eri-trabiccolo)!
-+ [@pondermatic](https://github.com/pondermatic) fixed typos and misspellings in comment and docs in over 200 files and while that doesn't concern most users it's worthy of a mention.
-
-##### Deprecations
-
-The following unused classes have been marked as deprecated and will be removed from LifterLMS in the next major release.
-
-+ `LLMS\Users\User`
-+ `LLMS_Analytics_Page`
-+ `LLMS_Course_Basic`
-+ `LLMS_Lesson_Basic`
-+ `LLMS_Quiz_Legacy`
-
-##### Template Updates
-
-+ [templates/myaccount/my-notifications.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/my-notifications.php)
-
-
-v3.30.2 - 2019-04-09
---------------------
-
-+ Added new filter to allow 3rd parties to determine if a `LLMS_Post_Model` field should be added to the `custom` array when converting the post to an array.
-+ Added hooks and filters to the `LLMS_Generator` class to allow 3rd parties to easily generate content during course clone and import operations.
-+ Fixed an issue causing all available courses to display when the [lifterlms_courses] shortcode is used with the "mine" parameter and the current user viewing the shortcode is not enrolled in any courses.
-+ Fixed a PHP undefined variable warning present on the payment confirmation screen.
-
-##### Template Updates
-
-+ [templates/checkout/form-confirm-payment.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-confirm-payment.php)
-
-
-v3.30.1 - 2019-04-04
---------------------
-
-##### Updates
-
-+ Added handler to automatically resume pending (incomplete or abandoned) orders.
-+ Classes extending the `LLMS_Abstract_API_Handler` can now prevent a request body from being sent.
-+ Added dynamic filter `'llms_' . $action . '_more'` to allow customization of the "More" button text and url for student dashboard sections. Thanks @[pondermatic](https://github.com/pondermatic).
-+ Remove unused CSS code on the admin panel.
-
-##### Bug Fixes
-
-+ Fixed a bug preventing course imports as a result of action priority ordering issues.
-+ Function `llms_get_order_by_key()` correctly returns `null` instead of false when no order is found and will return an `int` instead of a numeric string when an order is found.
-+ Changed the method used to sort question choices to accommodate numeric choice markers. This fixes an issue in the Advanced Quizzes add-on causing reorder questions with 10+ choices to sort display in the incorrect order.
-+ Increased the specificity of LifterLMS element tooltip hovers. Resolves a conflict causing issues on the WooCommerce tax rate management screen.
-+ Fixed an issue causing certain fields in the Customizer from displaying a blue background as a result of very unspecific CSS rules, thanks [@Swapnildhanrale](https://github.com/Swapnildhanrale)!
-+ Fixed builder deep links to quizzes freezing due to dependencies not being available during initialization.
-+ Fixed builder issue causing duplicate copies of questions to be added when adding existing questions multiple times.
-
-##### Template Updates
-
-+ [templates/myaccount/dashboard-section.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/dashboard-section.php)
-
-
-v3.30.0 - 2019-03-21
---------------------
-
-##### Updates
-
-+ **Create custom thank you pages with new access plan checkout redirect options.**
-+ Added the ability to sort items on the membership auto enrollment table (drag and drop to sort and reorder).
-+ Improved the interface and interactions with the membership auto enrollment table settings.
-
-##### LifterLMS Blocks
-
-+ Updated LifterLMS Blocks to 1.3.8.
-+ Fixed an issue causing some installations to be unable to use certain blocks due to jQuery dependencies being declared improperly.
-
-##### Bug Fixes
-
-+ Fixed issue preventing courses with the same title from properly displayed on the membership automatic enrollment courses table on the admin panel.
-+ Fixed an issue preventing builder custom fields from being able to specify a custom sanitization callback.
-+ Fixed an issue preventing builder custom fields from being able to properly save and render multi-select data.
-
-##### Template Updates
-
-+ [templates/product/access-plan-restrictions.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-restrictions.php)
-+ [templates/product/free-enroll-form.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/free-enroll-form.php)
-
-
-v3.29.4 - 2019-03-08
---------------------
-
-+ Fixed an issue preventing users with email addresses containing an apostrophe from being able to login.
-
-
-v3.29.3 - 2019-03-01
---------------------
-
-##### Bug Fixes
-
-+ Removed attempts to validate & save access plan data when the Classic Editor "post" form is submitted.
-+ Fix issue causing 1-click free-enrollment for logged in users to refresh the screen without actually performing an enrollment.
-
-##### Template Updates
-
-+ [product/free-enroll-form.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/free-enroll-form.php)
-
-
-v3.29.2 - 2019-02-28
---------------------
-
-+ Fix issue causing blank "period" values on access plans from being updated.
-+ Fix an issue preventing paid access plans from being switched to "Free".
-
-
-v3.29.1 - 2019-02-27
---------------------
-
-+ Automatically reorder access plans when a plan is deleted.
-+ Skip (don't create) empty plans passed to the access plan save method as a result of deleted access plans.
-
-
-v3.29.0 - 2019-02-27
---------------------
-
-##### Improved Access Plan Management
-
-+ Added a set of methods for creating access plans programmatically.
-+ Updated the Access Plan metabox on courses and lessons with improved data validation.
-+ When using the block editor, the "Pricing Table" block will automatically update when access plan changes are saved to the database (from LifterLMS Blocks 1.3.5).
-+ Access plans are now created and updated via AJAX requests, resolves a 5.0 editor issue causing duplicated access plans to be created.
-
-##### Student Management Improvements
-
-+ Added the ability for instructors and admins to mark lessons complete and incomplete for students via the student course reporting table.
-
-##### Admin Panel Settings and Reporting Design Changes
-
-+ Replaced LifterLMS logos and icons on the admin panel with our new logo LifterLMS Logo and Icons.
-+ Revamped the design and layout of settings and reporting screens.
-
-##### Checkout Improvements
-
-+ Updated checkout javascript to expose an error addition functions
-+ Abstracted the checkout form submission functionality into a callable function not directly tied to `$_POST` data
-+ Removed display order field from payment gateway settings in favor of using the gateway table sortable list
-
-##### Other Updates
-
-+ Removed code related to an incompatibility between Yoast SEO Premium and LifterLMS resulting from former access plan save methods.
-+ Reduced application logic in the `course/complete-lesson-link.php` template file by refactoring button display filters into functions.
-+ Added function for checking if request is a REST request
-+ Updated LifterLMS Blocks to version 1.3.7
-
-##### Bug Fixes
-
-+ Fixed an issue preventing "Pricing Table" blocks from displaying on the admin panel when the current user was enrolled in the course or no payment gateways were enabled on the site.
-+ Fixed the checkout nonce to have a unique ID & name
-+ Fixed an issue with deleted quizzes causing quiz notification's to throw fatal errors.
-+ Fixed an issue preventing notification timestamps from displaying on the notifications dashboard page.
-+ Fix an issue causing `GET` requests with no query string variables from causing issues via incorrect JSON encoding via the API Handler abstract.
-+ Fix an issue causing access plan sale end dates from using the default WordPress date format settings.
-+ `LLMS_Lesson::has_quiz()` will now properly return a boolean instead of the ID of the associated quiz (or 0 when none found)
-
-##### Template Updates
-
-+ [checkout/form-checkout.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-checkout.php)
-+ [course/complete-lesson-link.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/complete-lesson-link.php)
-+ [product/access-plan-pricing.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-pricing.php)
-+ [notifications/basic.php](https://github.com/gocodebox/lifterlms/blob/master/templates/notifications/basic.php)
-
-##### Templates Removed
-
-Admin panel templates replaced with view files which cannot be overridden from a theme or custom plugin.
-
-+ `admin/post-types/product-access-plan.php`
-+ `admin/post-types/product.php`
-
-
-v3.28.3 - 2019-02-14
---------------------
-
-+ ❤❤❤ Happy Valentines Day or whatever ❤❤❤
-+ Tested to WordPress 5.1
-+ Fixed an issue causing JSON data saved by 3rd party plugins in course or lesson postmeta fields to be not duplicate properly during course duplications and imports.
-
-
-v3.28.2 - 2019-02-11
---------------------
-
-##### Updates
-
-+ Updated default country list to remove non-existent countries and resolve capitalization issues, thanks [nrherron92](https://github.com/nrherron92)!
-
-##### Bug fixes
-
-+ Fixed an issue causing the email notification content getter to use the same filter as popover notifications.
-+ Fixed an issue preventing default blog date & time settings from being used when displaying an access plan's access expiration date on course and membership pricing tables.
-+ Fixed an issue causing 404s on paginated dashboard endpoints when the permalink structure is set to anything other than `%postname%`.
-
-##### Deprecations
-
-+ `LLMS_Query->set_dashboard_pagination()`
-
-
-v3.28.1 - 2019-02-01
---------------------
-
-+ Fixed an issues preventing exports to be accessible on Apache servers.
-+ Fixed an issue causing servers with certain nginx rules to open CSV exports directly instead of downloading them.
-
-
-v3.28.0 - 2019-01-29
---------------------
-
-##### Updates
-
-+ Updated reporting table export functions to provide immediate download prompts of the files. Exports are generated in real time and you *must* remain on the page while it generates. The good news is if your site had issues with email or cronjobs it'll no longer be an issue for you.
-+ Updated lesson metabox to use icons for attached quizzes
-+ Added an orange highlight to the admin "Add-Ons & More" menu item
-+ Removed unused cron event.
-
-##### LifterLMS Blocks
-
-+ Updated LifterLMS Blocks to 1.3.4
-+ Adds support for handling courses & lessons in "Classic Editor" mode as defined by the Divi page builder
-+ Skips course and lesson migration when "Classic" mode is enabled.
-+ Adds conditions to identify "Classic" mode when the Classic Editor plugin settings are configured to enforce classic (or block) mode for *all* posts.
-
-##### Database Updates
-
-+ Unschedules the aforementioned unused cron event.
-
-##### Bug fixes
-
-+ Fixed an issue preventing the temp directory old file cleanup cron from firing on schedule.
-+ During plugin uninstallation the tmp cleanup cron will now be properly unscheduled.
-+ Fixed an issue causing notifications on the student dashboard to appear on top of static headers or the WP Admin Bar when scrolling.
-+ Fixed an issue preventing manual updating of customer and source information on orders resulting from unfocusable hidden form fields.
-+ Fixed mismatched HTML tags on the Admin Add-Ons screen
-
-##### Deprecations
-
-+ Class method: `LLMS_Admin_Table::queue_export()`
-+ Class: `LLMS_Processor_Table_To_Csv`
-
-
-v3.27.0 - 2019-01-22
---------------------
-
-###### Updates
-
-+ Added the ability to add existing questions to a quiz in the course builder. This allows cloning of existing questions as well as attaching "orphaned" questions currently attached to no quizzes.
-+ Added the ability to detach questions from quizzes. Coupled with adding existing questions, questions can now be easily moved between quizzes.
-+ Added permalink capabilities to the builder to allow linking to specific items within the builder (a lesson, quiz, etc...).
-+ Quizzes with 0 possible points will no longer show a Pass/Fail chart with a 0% (failing) grade on quiz results screens.
-+ Replaced option `lifterlms_lock_down` which cannot be set via any setting with a filter to reduce database calls. This will have no effect on anyone unless you manually set this option to "no" via a database query. Having done this would allow the admin bar to be shown to students.
-
-##### Bug Fixes
-
-+ Fixed an issue causing the default "Redeem Voucher" and "My Orders" student dashboard endpoint slugs from not having the correct default values. Thanks [@tnorthcutt](https://github.com/tnorthcutt)!
-+ Fixed an issue causing quotation marks in quiz question answers to show escaping slashes on results screens.
-+ Fixed a bug preventing viewing quiz results for quizzes with questions that have been deleted.
-+ Fixed a bug causing a PHP Notice to be output when registering a new user with a valid voucher.
-
-##### Templates Changed
-
-+ [quiz/results-attempt.php](https://github.com/gocodebox/lifterlms/blob/master/templates/quiz/results-attempt.php)
-
-
-v3.26.4 - 2019-01-16
---------------------
-
-+ Update to [LifterLMS Blocks 1.3.2](https://make.lifterlms.com/2019/01/15/lifterlms-blocks-version-1-3-1/), fixing an issue preventing template actions from being removed from migrated courses & lessons.
-
-
-v3.26.3 - 2019-01-15
---------------------
-
-##### Updates
-
-+ Fix issue preventing course difficulty and course length from being edited when using the classic editor plugin.
-+ Improved pagination methods on Student Dashboard Endpoints
-+ "My Notifications" dashboard tab now consistently paginated like other dashboard endpoints
-+ Update to [LifterLMS Blocks 1.3.1](https://make.lifterlms.com/2019/01/15/lifterlms-blocks-version-1-3-1/).
-
-##### Bug Fixes
-
-+ Fixed an issue preventing course difficulty and course length from being edited when using various page builders.
-+ Fixed issues causing errors on quiz reporting screens for quiz attempts made by deleted users.
-
-##### Deprecated Functions
-
-+ `LLMS_Student_Dashboard::output_notifications_content()` replaced with `lifterlms_template_student_dashboard_my_notifications()`
-
-##### Templates Changed
-
-+ [myaccount/my-notifications.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/my-notifications.php)
-+ [admin/reporting/tabs/quizzes/attempt.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/quizzes/attempt.php)
-
-
-v3.26.2 - 2019-01-09
---------------------
-
-+ Fast follow to fix incorrect version number pushed to the readme files for 3.26.1 which prevents upgrading to 3.26.1
-
-
-v3.26.1 - 2019-01-09
---------------------
-
-##### Updates
-
-+ Tested to WordPress 5.0.3
-+ Student CSV reports will now bypass cached data during report generation.
-+ Add course and membership catalog visibility settings into the block editor.
-+ Includes LifterLMS Blocks 1.3.0.
-
-##### Bug Fixes
-
-+ Fixed issue preventing the course instructors metabox from displaying when using the classic editor plugin.
-+ Fixed an issue causing membership background enrollment from processing when the course background processor is disabled via filters.
-+ Fixed an issue causing errors when reviewing orders on the admin panel which were placed via a payment gateway which is no longer active.
-+ Fixed an issue preventing course difficulty and course length from being edited when using the classic editor plugin.
-+ Fixed a very convoluted conflict between LifterLMS, WooCommerce, and Elementor explained at https://github.com/gocodebox/lifterlms/issues/730.
-
-
-v3.26.0 - 2018-12-27
---------------------
-
-+ Adds conditional support for page builders: Beaver Builder, Divi Builder, and Elementor.
-+ Fixed issue causing LifterLMS core sales pages from outputting automatic content (like pricing tables) on migrated posts.
-+ Student unenrollment calls always bypass cache during enrollment precheck.
-+ Membership post type "name" label is now plural (as it is supposed to be).
-
-
-v3.25.4 - 2018-12-17
---------------------
-
-+ Adds a filter (`llms_blocks_is_post_migrated`) to allow determining if a course or lesson has been migrated to the WP 5.0 block editor.
-+ Added a filter (`llms_dashboard_courses_wp_query_args`) to the WP_Query used to display courses on the student dashboard.
-+ Fixed issue on course builder causing prerequisites to not be saved when the first lesson in a course was selected as the prereq.
-+ Fixed issue on course builder causing lesson settings to be inaccessible without first saving the lesson to the database.
-
-
-v3.25.3 - 2018-12-14
---------------------
-
-+ Fixed compatibility issue with the Classic Editor plugin when it was added after a post was migrated to the new editor structure.
-
-
-v3.25.2 - 2018-12-13
---------------------
-
-+ Added new filters to the `LLMS_Product` model.
-+ Fix issue with student dashboard login redirect causing a white screen on initial login.
-
-
-v3.25.1 - 2018-12-12
---------------------
-
-##### Updates
-
-+ Editor blocks now display a lock icon when hovering/selecting a block which corresponds to the enrollment visibility settings of the block.
-+ Removal of core actions is now handled by a general migrator function instead of by individual blocks.
-
-##### Bug fixes
-
-+ Fixed issue preventing strings from the lifterlms-blocks package from being translatable.
-+ Fix issue causing block visibility options to not be properly set when enrollment visibility is first enabled for a block.
-+ Fixed compatibility issue with Yoast SEO Premium redirect manager settings, thanks [@moorscode](https://github.com/moorscode)!
-+ Fixed typo preventing tag size options (or filters) of course information block from functioning properly. Thanks [@tnorthcutt](https://github.com/tnorthcutt)!
-
-##### Templates Changed
-
-+ [templates/course/meta-wrapper-start.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/meta-wrapper-start.php)
-
-
-v3.25.0 - 2018-12-05
---------------------
-
-##### WordPress 5.0 Ready!
-
-+ **Tested with WordPress core 5.0 (Gutenberg)!**
-+ Editor Blocks: Course and Lesson layouts are now (preferably) powered by various editor blocks.
-+ When a block is added to a course or lesson, the template hook that automatically outputs that element is removed automatically (preventing duplicates).
-+ If you use the LifterLMS Labs: Action Manager you may no longer need it!
-+ Course & Membership instructors are now managed through an editor "plugin". Check out the rocket icon near the "Publish/Update" button.
-+ Instructor metabox will load conditionally based on presence of the block editor
-+ New courses and lessons will automatically have a preloaded block editor template
-+ Courses and lessons will automatically be "migrated" to these templates when edited on the admin panel
-+ Various course settings conditionally load based on the presence of the block editor
-+ Added filter to the headline size in the `course/meta-wrapper-start.php` template. Allows customization of headline via the "Course Information" block settings.
-+ If you're not ready for WordPress 5.0 you can still upgrade LifterLMS. This release is fully functional without the block editor.
-
-##### Bug Fixes
-
-+ Fixed typo in `quiz/start-button.php` template.
-+ Fixed error occurring during activation of LaunchPad via the Add-Ons & More screen.
-+ Fixed issue causing quiz reporting screens to be blank for users without `view_others_lifterlms_reports` capabilities.
-
-##### Templates Changed
-
-+ [templates/course/author.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/author.php)
-+ [course/meta-wrapper-start.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/meta-wrapper-start.php)
-+ [quiz/start-button.php](https://github.com/gocodebox/lifterlms/blob/master/templates/quiz/start-button.php)
-
-
-v3.24.3 - 2018-11-13
---------------------
-
-##### Updates
-
-+ Added user email, login, url, nicename, display name, first name, and last name as fields searched when searching orders. Thanks Thanks [@yojance](https://github.com/yojance)!
-
-##### Bug Fixes
-
-+ Fixed issue causing fatal errors encountered during certificate downloading caused by CSS `` tags existing outside of the `` element.
-+ Certificates downloaded by users who can see the WP Admin Bar will no longer show the admin bar on the downloaded certificate
-+ Fixed issue on iOS Safari causing multiple choice quiz questions to require a "long press" to be properly selected
-+ Fixed issue causing access plan sales to end 36m and 1s prior to end of the day on the desired sale end date. Thanks [@eri-trabiccolo](https://github.com/eri-trabiccolo)!
-+ Ensure that fallback url slugs for course & membership archives are translatable.
-
-
-v3.24.2 - 2018-10-30
---------------------
-
-+ Fix issue causing newline characters to be malformed on course builder description fields, resulting in `n` characters being output in strange places.
-
-
-v3.24.1 - 2018-10-29
---------------------
-
-##### Updates
-
-+ The shortcode `[lifterlms_hide_content]` now accepts multiple IDs and can specify whether the user must belong to either *all* or *any one* of the specified memberships. Thanks [@yojance](https://github.com/yojance)!
-+ The action `llms_voucher_used`, called when a voucher code is used, will now pass the voucher code as a 3rd parameter. Thanks [@yojance](https://github.com/yojance)!
-
-##### Bug Fixes
-
-+ Fixed a typo in engagement drop creation dropdown. Thanks [README1ST](https://github.com/README1ST)!
-+ Fixed issue causing backslash characters (`\`) to be removed from course elements (sections, lessons, quizzes, and assignments) constructed in the course builder.
-+ Fixed an issue in the 3.16.0 database migration script that would cause migrations to get stuck as a result of malformed data saved in an invalid format.
-+ Added processing handlers to payment confirmation form. Fixes an issue which would allow multiple payment confirmation requests to be made (if the form was submitted multiple times before the page reloaded) resulting in duplicate charges.
-
-##### Templates Changed
-
-+ templates/checkout/form-confirm-payment.php
-
-
-v3.24.0 - 2018-10-23
---------------------
-
-##### "My Grades" Student Dashboard Endpoint
-
-+ A new student dashboard endpoint, "My Grades", has been added
-+ The main screen displays a paginated and sortable list of all courses a student is enrolled in and outputs their progress and grade in the courses
-+ Students can drill into individual reporting screens for each course where specific details for each course are available for review
-
-##### Grading Enhancements
-
-+ Each lesson can now be assigned an individual "points" value
-+ When a course is graded the points assigned to each lesson will be used to calculate the value of the lesson's grade within the overall course grade
-+ Lessons can also be assigned a value of "0" to allow a lesson to not count towards the overall grade of the course.
-+ Email notifications are now sent to a student when an instructor reviews, grades, or leaves remarks on a quiz attempt.
-
-##### Test Email Notifications
-
-+ An interface and API for sending test email notifications has been added, the following notifications can now be tested:
-
- + Purchase Receipt
- + Quizzes: Failed (Thanks [@philwp](https://github.com/philwp)!)
- + Quizzes: Graded
- + Quizzes: Passed (Thanks [@philwp](https://github.com/philwp)!)
-
-##### Updates and Enhancements
-
-+ Quiz Passed & Quiz Failed notifications have new names on the admin panel ("Quizzes: Quiz Passed" & "Quizzes: Quiz Failed")
-+ The default content for Quiz Passed and Quiz Failed notifications have been enhanced. If you've modified these you can delete your modified content to have your notifications "restored" to the improved defaults.
-+ Change the page title of the Student Dashboard page installed via the Setup Wizard to be "Dashboard" instead of "My Courses." Thanks [@philwp](https://github.com/philwp)!
-+ In the course builder when a lesson is duplicated, the attached quiz will be duplicated as well
-+ Minor increase to performance in the `LLMS_Course->get_lessons()` method
-+ Added `student_id` as a parameter passed to the `llms_student_get_progress` filter
-+ Updated all access plan templates added in 3.23.0 to ensure `ABSPATH` is defined to prevent direct template access
-+ Remove use of deprecated `LLMS_Lesson->get_children_lessons()` in the `LLMS_Course` and `LLMS_Lesson` models as well as in the `course/syllabus.php` template
-+ Refactored the `LLMS_Section->get_percent_complete()` method to utilize methods from the `LLMS_Student` model
-+ Added the ability for admin table classes to define `
` element CSS classes
-+ Admin settings pages with no settings to save (like the Notifications list) no longer display a "Save" button
-+ Added actions when creating, updating, and deleting records managed by `LLMS_Abstract_Database_Store` classes
-+ Updated system report to include URLs to settings with URLs, adds a small speed boost to support request turn around time.
-
-##### Please Rate & Review LifterLMS on WordPress.org
-
-+ Added a WordPress.org review request link to the footer of LifterLMS admin pages.
-+ Added a WordPress.org review request notice which displays a week after installation if the site has 50+ active students.
-
-##### Bug fixes
-
-+ Fixed issue causing HTML entity codes to display in email subject lines. Thanks [@philwp](https://github.com/philwp)!
-+ Fixed issue causing post cleanup functions to run queries against unsupported post types.
-+ Fixed typos in a handful of i18n functions so that the proper textdomain is now being used
-+ Removed `get_option()` call to unused option `lifterlms_logout_endpoint` which ran on WordPress initialization unnecessarily.
-+ Removed 3.21.0 fixes for iOS touch issues that are now causing iOS touch issues on quizzes.
-+ When an order is deleted, all order transactions will also be deleted. This does not happen until the order is deleted (transactions will remain while the order is in the trash)
-+ Fixed an issue causing duplicated quizzes to initially show images for question images & image choices (reorder pictures & picture choice) but the image data would not be properly saved so when returning to the builder or viewing a quiz on the frontend the images would be lost
-
-##### Deprecated Functions & Methods
-
-+ Deprecated `LLMS_Section->get_children_lessons()`, use `LLMS_Section->get_lessons( 'posts' )` instead
-
-##### Template Updates
-
-+ [course/syllabus.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/syllabus.php)
-+ [product/access-plan-button.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-button.php)
-+ [product/access-plan-description.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-description.php)
-+ [product/access-plan-feature.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-feature.php)
-+ [product/access-plan-pricing.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-pricing.php)
-+ [product/access-plan-restrictions.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-restrictions.php)
-+ [product/access-plan-title.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-title.php)
-+ [product/access-plan-trial.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/access-plan-trial.php)
-+ [product/free-enroll-form.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/free-enroll-form.php)
-
-
-v3.23.0 - 2018-08-27
---------------------
-
-##### Access Plan & Pricing Table Template Improvements
-
-+ The pricing table template has been split into multiple templates which are now rendered via action hooks. No visual changes have been made but if you've customized the template using a template override you'll want to review the template changes before updating!
-+ New action hooks are available to modify the rendering of access plans in course / membership pricing tables.
-
- + `llms_access_plan`: Main hook for outputting an entire access plan within the pricing table
- + `llms_before_access_plan`: Called before main content of access plan. Outputs the "Featured" area of plans
- + `llms_acces_plan_content`: Main access plan content. Outputs title, pricing info, restrictions, and description
- + `llms_acces_plan_footer`: Called after main content. Outputs trial info and the checkout / enrollment button
-
-+ Added filters to the returns of many of the functions in the `LLMS_Acces_Plan` model.
-+ Minor improvements made to `LLMS_Access_Plan` model
-
-##### Updates and Enhancements
-
-+ Improved handling of empty blank / empty data when adding instructors to courses and memberships
-+ Added filters to the "Sales Page Content" type options & functions for courses and memberships to allow 3rd parties to define their own type of sales page functionality
-+ Added filters to the saving of access plan data
-+ Improved the HTML and added CSS classes to the access plan admin panel html view
-
-##### Bug Fixes
-
-+ Fixes issue causing the "Preview Changes" button on courses to lock the "Update" publishing button which prevents changes from being properly saved.gi
-+ Fixed issue causing PHP errors when viewing courses / memberships on the admin panel when an instructor user was deleted
-+ Fixed issue causing PHP notices when viewing course / membership post lists on the admin panel when an instructor user was deleted
-+ Fixed issue causing PHP warnings to be generated when viewing the user add / edit screen on the admin panel
-+ Fixed an issue which would cause access plans to never be available to users. *This bug didn't affect any existing installations except if you wrote custom code that called the `LLMS_Access_Plan::is_available_to_user()` method.*
-
-##### Template Updates
-
-+ [templates/admin/post-types/product-access-plan.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/post-types/product-access-plan.php)
-+ [templates/product/pricing-table.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/pricing-table.php)
-
-
-v3.22.2 - 2018-08-13
---------------------
-
-+ Fixed issue causing banners on general settings screen to cause a fatal error when api connection errors occurred
-+ Improved CSS on setup wizard
-
-
-v3.22.1 - 2018-08-06
---------------------
-
-+ Fix issue causing themes to appear as requiring updates when using the LifterLMS Helper
-
-
-v3.22.0 - 2018-07-31
---------------------
-
-+ Frontend notifications are no longer powered by AJAX requests. This change will significantly reduce the number of requests made but will remove the ability for students to receive asynchronous notifications. This means that notifications will only be displayed on page load as notification polling will no longer occur while a student is on a page (while reading the content a lesson, for example).
-+ Course and membership catalogs items in navigation menus will now have expected CSS classes to identify current item and current item parents
-+ The admin panel add-ons screen has been reworked to be powered by the lifterlms.com REST api
-+ Some visual changes have been made to the add-ons screen
-+ The colors on the voucher screen on the admin panel have been updated to match the rest of the interfaces in LifterLMS
-
-
-v3.21.1 - 2018-07-24
---------------------
-
-+ Fixed issue causing visual issues on checkout summary when using coupons which apply discounts to a plan trial
-+ Fixed issue causing `.mo` files stored in the `languages/lifterlms` safe directory from being loaded before files stored in the default location `languages/plugins`
-+ Added methods to integration abstract to allow integration developers to automatically describe missing integration dependencies
-+ Tested to WordPress 4.9.8
-
-##### Template Updates
-
-+ [templates/checkout/form-summary.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-summary.php)
-
-
-v3.21.0 - 2018-07-18
---------------------
-
-##### Updates and Enhancements
-
-+ Added new actions before and after global login form HTML: `llms_before_person_login_form` & `llms_after_person_login_form`
-+ Settings API can now create disabled fields
-+ Added new actions to the checkout form: `lifterlms_pre_checkout_form` && `lifterlms_post_checkout_form`
-+ Added CRUD functions for interacting with data located in the `wp_lifterlms_user_postmeta` table
-+ Replaced various database queries for CRUD user postmeta data with new CRUD functions
-+ Added new utility function to allow splicing data into associative arrays
-
-##### Bug Fixes
-
-+ If all user information fields are disabled, the "Student Information" are will now be hidden during checkout for logged in users instead of displaying an empty information box
-+ Fixed plugin compatibility issue with Advanced Custom Fields
-+ Fixed issue causing multiple choice quiz questions to require a double tap on some iOS devices
-+ Fixed incorrectly named filter causing section titles to not display on student course reporting screens
-+ We do not advocate using PHP 5.5 or lower but if you were using 5.5 or lower and encountered an error during bulk enrollment we've fixed that for. Please upgrade to 7.2 though. We all want faster more secure websites.
-
-##### Template Updates
-
-+ [templates/checkout/form-checkout.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-checkout.php)
-+ [templates/global/form-login.php](https://github.com/gocodebox/lifterlms/blob/master/templates/global/form-login.php)
-
-
-v3.20.0 - 2018-07-12
---------------------
-
-+ Updated user interfaces on admin panel for courses and memberships with relation to "Enrolled" and "Non-Enrolled" student descriptions
-+ "Enrolled Student Description" is now the default WordPress editor
-+ "Non-Enrolled Student Description" is now the "Sales Page"
-+ Additional options for sales pages (the content displayed to visitors and non-enrolled students) have been added:
- + Do nothing (show course description)
- + Show custom content (use a WYSIWYG editor to define content)
- + Redirect to a WordPress page (use custom templates and enhance page builder compatibility and capabilities)
- + Redirect to a custom URL (use a sales page hosted on another domain!)
-+ Tested to WordPress 4.9.7
-
-v3.19.6 - 2018-07-06
---------------------
-
-+ Fix file load paths in OptimizePress plugin compatibility function
-
-
-v3.19.5 - 2018-07-05
---------------------
-
-+ Fixed bug causing `select2` multi-selects from functioning as multi-selects
-+ Fixed visual issue with `select2` elements being set without a width causing them to be both too small and too large in various scenarios.
-+ Fixed duplicate action on dashboard section template
-
-##### Template Updates
-
-+ [templates/myaccount/dashboard-section.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/dashboard-section.php)
-
-
-v3.19.4 - 2018-07-02
---------------------
-
-##### Updates and enhancements
-
-+ Bulk enroll multiple users into a course or membership from the Users table on your admin panel. See how at [https://lifterlms.com/docs/student-bulk-enrollment/](https://lifterlms.com/docs/student-bulk-enrollment/)
-+ Added event on builder to allow integrations to run trigger events when course elements are saved
-+ Added general redirect method `llms_redirect_and_exit()` which is a wrapper for `wp_redirect()` and `wp_safe_redirect()` which can be plugged (and tested via phpunit)
-+ Added new action called before validation occurs for a user account update form submission: `llms_before_user_account_update_submit`
-+ Removed placeholders from form fields. Fixes a UX issue causing registration forms to appear cluttered due to having both placeholders and labels.
-
-##### Bug fixes
-
-+ Fixed issue allowing nonce checks to be bypassed on login and registration forms
-+ Fixed issue causing a PHP notice if the registration form is submitted without an email address and automatic username generation is enabled
-+ Fixed issue preventing email addresses with the "'" character from being able to register, login, or update account information
-+ Fixed typo in automatic username generation filter `lifterlms_generated_username` (previously was `lifterlms_gnerated_username`)
-+ Fixed issue causing admin panel static assets to have a double slash (//) in the asset URI path
-+ Fixed issue allowing users with `view_lifterlms_reports` capability (Instructors) to access sales & enrollment reporting screens. The `view_others_lifterlms_reports` capability (Admins & LMS Managers) is now required to view these reporting tabs.
-+ Updated IDs of login and registration nonces to be unique. Fixes an issue causing Chrome to throw non-unique ID warnings in the developer console. Also, IDs are supposed to be unique _anyway_ but thanks for helping us out Google.
-
-
-v3.19.3 - 2018-06-14
---------------------
-
-+ Fix issue causing new quizzes to be unable to load questions list without reloading the builder
-
-
-v3.19.2 - 2018-06-14
---------------------
-
-##### Updates and enhancements
-
-+ The course builder will now load quiz question data when the quiz is opened instead of loading all quizzes on builder page load. Improves builder load times and addresses an issue which could cause timeouts in certain environments when attempting to edit very large courses.
-+ The currently viewed lesson will now be bold in the lesson outline widget.
-+ Added a CSS class `.llms-widget-syllabus .llms-lesson.current-lesson` which can be used to customize the display of the current lesson in the widget.
-+ Added the ability to filter quiz attempt reports by quiz status
-+ Updated language for access plans on with a limited number of payments to reflect the total number of payments due as opposed to the length (for example in years) that the plan will run.
-
-##### Bug fixes
-
-+ Fixed issue preventing oEmbed media from being used in quiz question descriptions
-+ Fixed issue preventing `` from being used in quiz question descriptions
-+ Quiz results will now exclude questions with 0 points value when displaying the number of questions in the quiz.
-+ Fixed error occurring when sorting was applied to quiz attempt reports which would cause quiz attempts from other quizzes to be included in the new sorted report
-+ Fixed filter `lifterlms_reviews_section_title` which was unusable due to the incorrect usage of `_e()` within the filter. Now using `__()` as expected.
-+ Fixed issue causing course featured image to display in place of lesson feature images
-
-##### Template Updates
-
-+ [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/lesson-preview.php)
-+ [templates/course/outline-list-small.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/outline-list-small.php)
-+ [templates/quiz/results-attempt.php](https://github.com/gocodebox/lifterlms/blob/master/templates/quiz/results-attempt.php)
-
-
-v3.19.1 - 2018-06-07
---------------------
-
-+ Fixed CSS specificity issue on admin panel causing white text on white background on system status pages
-
-
-v3.19.0 - 2018-06-07
---------------------
-
-##### Updates and enhancements
-
-+ Added a "My Memberships" tab to the student dashboard
-+ "My Memberships" preview area
-+ Updated admin panel order status badges to match frontend order status badges
-+ Added a new recurring order status "Pending Cancel." Orders in this state will allow students to access course / membership content until the next payment is due, on this date, instead of a recurring charge being made the order will move to "Cancelled" and the student's enrollment status will change to "Cancelled" removing their access to the course or membership.
-+ When a student cancels an active recurring order from the student dashboard, the order will move to "Pending Cancellation" instead of "Cancelled"
-+ Students can re-activate an order that's Pending Cancellation moving the expiration date to the next payment due date
-+ Added the ability to edit the access expiration date for orders with limited access settings and for orders in the "pending-cancel" state
-+ Added a filter to allow customization of the URL used to generate certificate downloads from
-+ When viewing taxonomy archives for any course or membership taxonomy (categories, tags, and tracks), if a term description exists, it will be used instead of the default catalog description content defined on the catalog page.
-+ Added a filter (`llms_archive_description`) to allow filtering of the archive description
-+ When `WP_DEBUG` is disabled the scheduled-actions posttype interface is now available via direct link. Useful for debugging but don't want to expose a menu-item link to clients. Access via wp-admin/edit.php?post_type=scheduled-action. Be warned: you shouldn't be modifying scheduled actions manually and that's why we're not exposing this directly, this should be used for debugging only!
-+ Updated the function used to check if lessons have featured images to improve performance and resolve an incompatibility issue with WP Overlays plugin.
-
-##### Bug fixes
-
-+ Fixed issue causing "My Courses" title to be duplicated on the student dashboard when viewing the endpoint
-+ Fixed issue causing the trial price to be displayed with a strike-through during a sale
-+ Fixed coupon issue causing coupons to expire at the beginning of the day on the expiration date instead of at the end of the day
-+ Fixed issue causing CSS rules to lose their declared order during exports causing export rendering issues with certain themes and plugin combinations
-
-##### Template Updates
-
-+ [templates/checkout/form-summary.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-summary.php)
-+ [templates/checkout/form-switch-source.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-switch-source.php)
-+ [templates/course/lesson-preview.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/lesson-preview.php)
-+ [templates/myaccount/view-order.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/view-order.php)
-
-
-v3.18.2 - 2018-05-24
---------------------
-
-+ Improved integrations settings screen to allow each integration to have it's own settings tab (page) with only its own settings
-+ Allow programmatic access to notification content when notification views are accessed via filters
-+ Fixed issue causing subscription cancellation notifications to be sent to admins when new orders were created
-+ Fixed warning message displayed prior to membership bulk enrollment
-+ Fixed multibyte character encoding issue encountered during certificate exports
-
-
-v3.18.1 - 2018-05-18
---------------------
-
-+ Attached `llms_privacy_policy_form_field()` and `llms_agree_to_terms_form_field()` to an action hook `llms_registration_privacy`
-+ Define minimum WordPress version requirement as 4.8.
-
-##### Template Updates
-
-+ [templates/checkout/form-checkout.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-checkout.php)
-+ [templates/global/form-registration.php](https://github.com/gocodebox/lifterlms/blob/master/templates/global/form-registration.php)
-
-
-v3.18.0 - 2018-05-16
---------------------
-
-##### Privacy & GDPR Compliance Tools
-
-+ Added privacy policy notice on checkout, enrollment, and registration that integrates with the WP Core 4.9.6 Privacy Policy Page setting
-+ Added settings to allow customization of the privacy policy and terms & conditions notices during checkout, enrollment, and registration
-+ Added suggested Privacy Policy language outlining information gathered by a default LifterLMS site
-
-+ During a WordPress Personal Data Export request the following LifterLMS information will be added to the export
-
- + All personal information gathered from registration, checkout, and enrollment forms
- + Course and membership enrollments, progress, and grades
- + Earned achievements and certificates
- + All order data
-
-+ During a WordPress Personal Data Erasure request the following LifterLMS information will be erased
-
- + All personal information gathered from registration, checkout, and enrollment forms
- + Earned achievements and certificates
- + All notifications for or about the user
- + If the "Remove Order Data" setting is enabled, the order will be anonymized by removing student personal information from the order and, if the order is a recurring order, it will be cancelled.
- + If the "Remove Student LMS Data" setting is enabled, all student data related to course and membership activity will be removed
-
-+ All of the above relies on features available in WordPress core 4.9.6
-
-##### Updates and Enhancements
-
-+ Tested up to WordPress 4.9.6
-+ Improved pricing table UX for members-only access plans. An access plan button for a plan belonging to only one membership will click directly to the membership as opposed to opening a popover. Plan's with access via multiple memberships will continue to open a popover listing all availability options.
-+ Added a "My Certificates" tab to the Student Dashboard
-+ Certificates can be downloaded as HTML files (available when viewing a certificate or from the certificate reporting screen on the admin panel)
-+ Admins can now delete certificates and achievements from reporting screens on the admin panel
-+ Added additional information to certificate and achievement reporting tables
-+ Expanded widths of admin settings page setting names to be a bit wider and more readable
-+ Now conditionally hiding some settings when they are no longer relevant
-+ Added daily cron automatically remove files from the `LLMS_TMP_DIR` which are more that 24 hours old
-+ Removed unused template `content-llms_membership.php`
-+ Added initialization actions for use by integration classes
-
-##### Bug Fixes
-
-+ Fixed issue causing coupon reports to always display "1" regardless of actual number of coupons used
-+ Fixed issue causing new posts created via the Course Builder to always be created for user_id #1
-+ Fixed issue causing "My Achievements" to display twice on the My Achievements student dashboard tab
-+ Fixed issue preventing lessons from being completed when a quiz in draft mode was attached to the lesson
-+ Fixed issue causing minified RTL stylesheets to 404
-
-##### Template Updates
-
-+ [templates/admin/post-types/order-details.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/post-types/order-details.php)
-+ [templates/checkout/form-checkout.php](https://github.com/gocodebox/lifterlms/blob/master/templates/checkout/form-checkout.php)
-+ [templates/content-certificate.php](https://github.com/gocodebox/lifterlms/blob/master/templates/content-certificate.php)
-+ [templates/global/form-registration.php](https://github.com/gocodebox/lifterlms/blob/master/templates/global/form-registration.php)
-+ [templates/myaccount/dashboard-section.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/dashboard-section.php)
-
-
-v3.17.8 - 2018-05-04
---------------------
-
-##### Updates and Enhancements
-
-+ Added admin email notification when student cancels a subscription
-+ Quiz results will now display the question's description when reviewing results as a student and on the admin panel during grading
-+ Add action hook fired when a student cancels a subscription (`llms_subscription_cancelled_by_student`)
-+ Reduce unnecessary DB queries for integrations by checking for dependencies and then calling querying the options table to see if the integration has been enabled.
-+ Updated the notifications settings table to be more friendly to the human eye
-
-##### Bug Fixes
-
-+ Fix admin scripts enqueue order. Fixes issue preventing manual student enrollment selection from functioning properly in certain scenarios.
-+ Shift + Enter when in a question choice field now adds a return as expected instead of exiting the field
-+ When pasting into question choice fields HTML from RTF documents will be automatically stripped
-+ Ensure certificates print with a white background regardless of theme CSS
-+ Fix issue causing themes with `overflow:hidden` on divs from cutting certificate background images
-+ Upon export completion unlock tables regardless of mail success / failure
-+ Resolve issue causing incorrect number of access plans to be returned on systems that have custom defaults set for `WP_Query` `post_per_page` parameter
-+ Fix error occurring when all 3rd party integrations are disabled by filter, credit to [@Mte90](https://github.com/Mte90)!
-+ Ensure `LLMS()->integrations()->integrations()` returns all integrations regardless of availability.
-+ Updated `LLMS_Abstract_Options_Data` to have an option set method
-
-##### Template Updates
-
-+ [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/master/templates/quiz/results-attempt-questions-list.php)
-
-
-v3.17.7 - 2018-04-27
---------------------
-
-+ Fix issue preventing assignments passing grade requirement from saving properly
-+ Fix issue preventing builder toggle switches from properly saving some switch field data
-+ Fix with "Launch Builder" button causing it to extend outside the bounds of its container
-+ Fix issue with builder radio select fields during view rerenders
-+ Course Outline shortcode (and widget) now retrieve parent course of the current page more consistently with other shortcodes
-+ Added ability to filter which custom post types which can be children of a course (allows course shortcodes & widgets to be used in assignment sidebars of custom content areas)
-
-
-v3.17.6 - 2018-04-26
---------------------
-
-+ Updated language on recurring orders with no expiration settings. Orders no longer say "Lifetime Access" and instead output no expiration information
-+ Quiz editor on builder updated to be consistent visually and functionally to the lesson settings editor
-+ Improved the builder field API to allow for radio element fields
-+ Fix issue causing JS error on admin settings pages
-+ Updated CSS for Certificates to be more generally compatible with theme styles when printed
-+ Allow system print settings to control print layout for certificates by removing explicit landscape declarations
-+ Now passing additional data to filters used to create custom columns on reporting screens
-+ Remove unused JS files & Chosen JS library
-+ Added filter to allow opting into alternate student dashboard order layout. Use `add_filter( 'llms_sd_stacked_order_layout', '__return_true' )` to stack the payment update sidebar below the main order information. This is disabled by default.
-+ Achievement and Certificate basic notifications now auto-dismiss after 10 seconds like all other basic notifications
-+ Deprecated Filter `llms_get_quiz_theme_settings` and added backwards compatible methods to transition themes using this filter to the new custom field api. For more information see new methods at https://lifterlms.com/docs/course-builder-custom-fields-for-developers/
-+ Increased default z-index on notifications to prevent notifications from being hidden behind floating / static navigation menus
-
-
-##### Template Updates
-
-+ [templates/myaccount/my-orders.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/my-orders.php)
-+ [templates/myaccount/view-order.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/view-order.php)
-
-
-v3.17.5 - 2018-04-23
---------------------
-
-##### Admin Settings Interface Improvements
-
-+ Improved admin settings page interface to allow for section navigation
-+ Updated checkout setting pages to utilize a separate section (page) for each available payment gateway
-+ Added a table of payment gateways to see at a glance which gateways are enabled and allows drag and drop reordering of gateway display order
-+ Moved dashboard endpoints to a separate section on the accounts settings area
-+ Updated CSS on settings page to have more regular spacing between subtitles and settings fields
-+ Added a "View" button next to any admin setting post/page selection field to allow quick viewing of the selected post
-+ Purchase page setting field is now ajax powered like all other page selection settings
-+ Renamed dashboard settings section titles to be more consistent with language in other areas of LifterLMS
-+ All dashboard endpoints now automatically sanitized to be URL safe
-
-##### Updates and Enhancements
-
-+ Dashboard endpoints can now be deregistered by setting the endpoint slug to be blank on account settings
-
-##### Bug Fixes
-
-+ Fix issue causing 404s for various script files when SCRIPT_DEBUG is enabled
-+ Fix issue with audio & video embeds to prevent fallback to default post attachments
-+ Fix issue causing student selection boxes to malfunction due to missing dependencies when loaded over slow connections
-
-##### Template Updates
-
-+ [templates/myaccount/navigation.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/navigation.php)
-
-
-v3.17.4 - 2018-04-17
---------------------
-
-+ Added core RTL language support
-+ Fixed fatal error on student management tables resulting from deleted admin users who manually enrolled students
-+ Added filter to allow 3rd parties to disable achievement dupchecking (`llms_achievement_has_user_earned`)
-+ Added {student_id} merge code which can be utilized on certificates
-+ Added merge code insert button to certificates editor
-+ Added filter to allow 3rd parties to disable certificate dupchecking (`llms_certificate_has_user_earned`)
-+ Added filter to allow 3rd parties to add custom merge codes to certificates (`llms_certificate_merge_codes`)
-+ Fix restriction check issue for lessons with drip or prerequisites on course outline widget / shortcode
-+ Bumped WP tested to version to 4.9.5
-
-##### Template Updates
-
-+ [templates/course/complete-lesson-link.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/complete-lesson-link.php)
-+ [templates/course/outline-list-small.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/outline-list-small.php)
-
-
-v3.17.3 - 2018-04-11
---------------------
-
-+ Course and Membership instructor metabox search field now correctly states "Select an Instructor" instead of previous "Select a Student"
-+ Added missing translation for "Select a Student" on admin panel student selection search fields
-+ Fix issue causing reporting export CSVs to throw a SYLK interpretation error when opened in Excel
-+ Fix issue causing drafted courses and memberships to be published when the "Update" button is clicked to save changes
-+ Remove use of PHP 7.2 deprecated `create_function`
-+ Fix errors resulting from quiz questions which have been deleted
-+ Fix issue causing current date / time to display as the End Date for incomplete quiz attempts on quiz reporting screens
-
-##### Template Updates
-
-+ [templates/admin/reporting/tabs/quizzes/attempt.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/quizzes/attempt.php)
-+ [templates/quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/master/templates/quiz/results-attempt-questions-list.php)
-
-
-v3.17.2 - 2018-04-09
---------------------
-
-+ Fixed issue preventing lesson video and audio embeds from being *removed* when using the course builder settings editor
-+ Fixed issue causing question images to lose the image source
-+ Updated student management table for courses and memberships to show the name (and a link to the user profile) of the site user who manually enrolled the student.
-+ Add "All Time" reporting to various reporting filters
-+ Added API for builder fields to enable multiple select fields
-+ Fix memory leak related to assignments rendering on course builder
-+ Fix issue causing course progress and enrollment checks to incorrectly display progress data cached for other users
-+ Lesson progression actions (Mark Complete & Take Quiz buttons) will now always display to users with edit capabilities regardless of enrollment status
-
-##### Template Updates
-
-+ [templates/course/complete-lesson-link.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/complete-lesson-link.php)
-+ [templates/course/outline-list-small.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/outline-list-small.php)
-
-
-v3.17.1 - 2018-03-30
---------------------
-
-+ Refactored lesson completion methods to allow 3rd party customization of lesson completion behavior via filters and hooks.
-+ Remove duplicate lesson completion notice implemented. Only popover notifications will display now instead of popovers and inline messages.
-+ Object completion will now automatically prevent multiple records of completion from being recorded for a single object.
-+ Lesson Mark Complete button and lessons completed by quiz now utilizes a generic trigger to mark lessons as complete: `llms_trigger_lesson_completion`.
-+ Removed several unused functions from frontend forms class
-+ Moved lesson completion form controllers to their own class
-
-##### Templates updates
-
-+ [templates/course/complete-lesson-link.php](https://github.com/gocodebox/lifterlms/blob/master/templates/course/complete-lesson-link.php)
-
-
-v3.17.0 - 2018-03-27
---------------------
-
-##### Builder Updates
-
-+ Moved action buttons for each lesson (for opening quiz and lesson editor) to be static below the lesson title as opposed to only being visible on hover
-+ Added new audio and video status indicator icons for each lesson
-+ Various status indicator icons will now have different icons in addition to different colors depending on their state
-+ Replaced "pencil" icons that open the WordPress post editor with a small "WP" icon
-+ Added several actions and filters to backend functions so that 3rd parties can hook into builder saves
-+ Added lesson settings editing to the builder. Lesson settings can now be updated from settings metaboxes on the lesson post edit screen AND on the builder.
-+ Added prerequisite validation for lessons to prevent accidental impossible prerequisite creating (eg: Lesson 5 can never be a prerequisite for Lesson 4)
-+ Added functions and filters to allow 3rd parties to add custom fields to the builder. For more details see [an example](https://lifterlms.com/docs/course-builder-custom-fields-for-developers/).
-+ Fixed issue causing changes made in "Text" mode on content editors wouldn't trigger save events
-+ Fixed issue causing lesson prerequisites to not properly display on the course builder
-+ Fixed CSS z-index issues related to builder field tooltip displays
-+ Removed unused Javascript dependencies
-
-##### Bug Fixes
-
-+ Fixed typo on filter on quiz question image getter function
-
-##### Updates
-
-+ Performance improvements made to database queries and functions related to student enrollment status and student course progress queries. Thanks to [@mte90](https://github.com/Mte90) for raising issues and testing solutions related to these updates and changes!
-+ Added PHP Requires plugin header (5.6 minimum)
-+ Added HTTP User Agent data to the system report
-+ [LifterLMS Assignments Beta](https://lifterlms.com/product/lifterlms-assignments?utm_source=LifterLMS%20Plugin&utm_medium=CHANGELOG&utm_campaign=assignments%20preorder) is imminent and this release adds functionality to the Builder which will be extended by Assignments upon when availability
-
-
-v3.16.16 - 2018-03-19
----------------------
-
-+ Fixed builder issue causing multiple question choices to be incorrectly selected
-+ Fixed builder issue with media library uploads causing an error message to prevent new uploads before the quiz or question has been persisted to the database
-+ Fixed builder issue preventing quizzes from being deleted before they were persisted to the database
-+ Fixed builder issue causing autosaves to interrupt typing and reset lesson and section titles
-+ Fixed JS console error related to LifterLMS JS dependency checks
-
-
-v3.16.15 - 2018-03-13
----------------------
-
-##### Quiz Results Improvements and fixes
-
-+ Improved quiz result user and correct answer handling functions for more consistent HTML output
-+ Result answers (correct and user) will display as lists
-+ image question types will display without bullets and will "float" next to each other
-+ Fixed issue causing quiz results with multiple answers from outputting all HTMLS with no spaces between them
-
-##### Quiz Grading
-
-+ Fixed issue causing advanced reorder and reorder question types from being graded incorrectly in some scenarios
-+ Advanced fill in the blank questions are now case insensitive. Case sensitivity can be enabled with a filter: `add_filter( 'llms_quiz_grading_case_sensitive', '__return_true' )`
-
-##### Fixes
-
-+ Updated spacing and returns found in the email header and footer templates to prevent line breaks from occurring in undesirable places on previews of HTML emails in mobile email clients
-+ Added options for themes to add layout support to quizzes where the custom field utilizes an underscore at the beginning of the field key
-+ Fixed CSS issue causing blanks of fill in the blanks to not be visible on the course builder when using Chrome on Windows
-+ Removed unnecessary `get_option()` call to unused option `lifterlms_permalinks`
-+ Updated permissions required to see various LifterLMS post types to rely on `manage_lifterlms` capabilities as opposed to `manage_options`
- + This will only affect the LMS Manager core role or any custom role which was provided with the `manage_options` capability. Manages will now be able to access all LMS content and custom roles would now not be able to access LMS content
- + Affected content types are: Orders, Coupons, Vouchers, Engagements, Achievements, Certificates, and Emails
-+ Several references to an option removed in LifterLMS 3.0 still existed in the codebase and have now been removed.
- + Option `lifterlms_course_display_banner` is no longer called or referenced
- + Template function `lifterlms_template_single_featured_image()` has been removed
- + Actions referencing `lifterlms_template_single_featured_image()` have been removed
- + Template function `lifterlms_get_featured_image_banner()` has been removed
- + Template `templates/course/featured-image.php` has been removed
-
-##### Templates updates
-
-+ [quiz/results-attempt-questions-list.php](https://github.com/gocodebox/lifterlms/blob/master/templates/quiz/results-attempt-questions-list.php)
-
-
-v3.16.14 - 2018-03-07
----------------------
-
-+ Courses reporting table now includes courses with the "Private" status
-+ Fixed issue causing some achievement notifications to be blank
-+ Added tooltips to question choice add / delete icon buttons
-+ Quiz results meta information elements now have unique CSS classes
-+ Removed reliance PHP 7.2 deprecated function `create_function()`
-+ Fixed invalid PHP 7.2 syntax creating a warning found on the setup wizard
-+ Fixed undefined index error related to admin notices
-+ Fixed untranslatable string on Users table ("No Memberships")
-+ Fixed discrepancy between membership restrictions as presented to logged out users and logged in users who cannot access membership
-+ Fixed FireFox and Edge issue causing changes to number inputs made via HTML5 input arrows from properly triggering save events
-
-
-v3.16.13 - 2018-02-28
----------------------
-
-+ Hotfix: Only create quizzes on the builder if quizzes exist on the lesson
-
-
-v3.16.12 - 2018-02-27
----------------------
-
-+ Quizzes can now be detached (removed from a lesson) or deleted (deleted from the lesson and the database) via the Course Builder
-+ Improved question choice randomization to ensure randomized choices never display in their original order.
-+ When a lesson is deleted, any quiz attached to the lesson will become an orphan
-+ When a lesson is deleted, any lesson with this lesson as a prerequisite will have it's prerequisite data removed
-+ When a quiz is deleted, all questions attached to the quiz will also be deleted
-+ When a quiz is deleted, the lesson associated with the quiz will have those associations removed
-+ Fixed grammar issue on restricted lesson tooltips when no custom message is stored on the course.
-+ Updated functions causing issues in PHP 5.4 to work on PHP 5.4. This has been done to reduce frustration for users still using PHP 5.4 and lower; [This does not mean we advocate using software past the end of its life or that we support PHP 5.4 and lower](https://lifterlms.com/docs/minimum-system-requirements-lifterlms/).
-
-
-v3.16.11 - 2018-02-22
----------------------
-
-+ Course import/exports and lesson duplication now carry custom meta data from 3rd party plugins and themes
-+ Added course completion date column to Course reporting students list
-+ Restriction checks made against a quiz will now properly cascade to the quiz's parent lesson
-+ Fixed issue preventing featured images from being exported with courses and lessons
-+ Fixed duplicate lesson issue causing quizzes to be double assigned to the old and new lesson
-+ Fixed issue allowing blog archive to be viewed by non-members when sitewide membership is enabled
-+ Fixed builder issue causing data to be lost during autosaves if data was edited during an autosave
-+ Fixed builder issue preventing lessons from moving between sections when clicking the "Prev" and "Next" section buttons
-+ Added actions to `LLMS_Generator` to allow 3rd parties to extend core generator functionality
-
-
-v3.16.10 - 2018-02-19
----------------------
-
-+ Content added to the editor of course & membership catalog pages will now be output *above* the catalog loop
-+ Fix issue preventing iframes and some shortcodes from working when added to a Quiz question description
-+ Added new columns to the Quizzes reporting table to display Course and Lesson relationships
-+ Improved the task handler of background updater to ensure upgrade functions that need to run multiple times can do so
-+ Fixed JS Backup confirmation dialog on the background updater.
-+ Add support for 32-bit systems in the `LLMS_Hasher` class
-+ Fix issue causing HTML template content to be added to lessons when duplicating an existing lesson within the course builder
-
-##### 3.16.0 migration improvements
-
-+ Accommodates questions imported by 3rd party Excel to LifterLMS Quiz plugin. Fixes an issue where choices would have no correct answer designated after migration.
-+ All migration functions now run on a loop. This improves progress reporting of the migration and prevents timeouts on mature databases with lots of quizzes, questions, and/or attempts.
-+ Fix an issue that caused duplicate quizzes or questions to be created when the "Taking too long?" link was clicked
-
-
-v3.16.9 - 2018-02-15
---------------------
-
-+ Fix issue causing error on student dashboard when reviewing an order with an access plan that was deleted.
-+ Fixed spelling error on course metabox
-+ Fixed spelling error on frontend quiz interface
-+ Fixed issues with 0 point questions:
- + Will no longer prevent quizzes from being automatically graded when a 0 point question is in an otherwise automatically gradable quiz
- + Point value not editable during review
- + Visual display on results displays with grey background not as an orange "pending" question
-+ Table schema uses default database charset. Fixes an issue with databases that don't support `utf8mb4` charsets.
-+ Updated `LLMS_Hasher` class for better compatibility with older versions of PHP
-
-
-v3.16.8 - 2018-02-13
---------------------
-
-##### Updates
-
-+ Added theme compatibility API so theme developers can add layout options to the quiz settings on the course builder. For details on adding theme compatibility see: [https://lifterlms.com/docs/quiz-theme-compatibility-developers/](https://lifterlms.com/docs/quiz-theme-compatibility-developers/).
-+ Quiz results "donut" chart had alternate styles for quizzes pending review (Dark grey text rather than red). You can target with the `.llms-donut.pending` CSS class to customize appearance.
-+ Allow filtering when retrieving student answer for a quiz attempt question via `llms_quiz_attempt_question_get_answer` filter
-
-##### Bug Fixes
-
-+ Fix issues causing conditionally gradable question types (fill in the blank and scale) from displaying without a status icon or possible points when awaiting admin review / grading.
-+ Fix issue preventing conditionally gradable question types (fill in the blank and scale) from being reviewable on the admin panel when the question is configured as requiring manual grading.
-+ Fix analytics widget undefined index warning during admin-ajax calls. Thanks [@Mte90](https://github.com/Mte90)!
-+ Fix issue causing `is_search()` to be called incorrectly. Thanks [@Mte90](https://github.com/Mte90)!
-+ Fix issue preventing text / html formatting from saving properly for access plan description fields
-+ Fix html character encoding issue on reporting widgets causing currency symbols to display as a character code instead of the symbol glyph.
-
-##### Templates changed
-
-+ templates/quiz/results-attempt-questions-list.php
-+ templates/quiz/results-attempt.php
-
-
-v3.16.7 - 2018-02-08
---------------------
-
-+ Added manual saving methods for the course builder that passes data via standard ajax calls. Allows users (hosts) to disable the Heartbeat API but still save builder data.
-+ Added an "Exit" button to the builder sidebar to allow exiting the builder back to the WP Edit Post screen for the current course
-+ Added dashboard links to the WP Admin Bar to allow existing the course builder to various areas of the dashboard
-+ Added data attribute to progress bars so JS (or CSS) can read the progress of a progress bar. Thanks [@dineshchouhan](https://github.com/dineshchouhan)!
-+ Fixed issue causing newly created lessons to lose their assigned quiz
-+ Fixed php `max_input_vars` issue causing a 400 Bad Request error when trying to save large courses in the course builder
-+ Removed reliance on PHP bcmath functions
-
-
-v3.16.6 - 2018-02-07
---------------------
-
-+ Removed reliance on PHP Hashids Library in favor of a simpler solution with no PHP module dependencies
-+ Added interfaces to allow customization of quiz url / slug
-+ Fixed [audio] shortcodes added to quiz question descriptions
-+ Fixed untranslatable strings on frontend of quizzes
-+ Fix issue causing certificate notifications to display as empty
-+ Fix issue preventing quiz pass/fail notifications from triggering properly for manually graded quizzes
-+ Fix undefined index warning on quiz pass/fail notifications
-
-
-v3.16.5 - 2018-02-06
---------------------
-
-+ Fix issue preventing manually graded quiz review points from saving properly
-+ Improved background updater to ensure scripts don't timeout during upgrades
-+ Admin builder JS now minified for increased performance
-+ Made frontend quiz and quiz-builder strings output via Javascript translatable
-
-
-v3.16.4 - 2018-02-05
---------------------
-
-+ Fix issue causing newly created quizzes to not be properly related to their parent lesson
-+ Fix issue preventing quiz time limits from starting unless an attempt limit is also set
-+ Fixes a WP Engine issue that prevented the builder from loading due to a blocked dependency
-
-
-v3.16.3 - 2018-02-02
---------------------
-
-+ When switching a quiz to "Published" it will now update the parent lesson to ensure it's recorded as having an enabled quiz.
-+ Declared the WordPress heartbeat API script as a dependency for the Course Builder JS. It seems that some servers and hosts dequeue the heartbeat when not explicitly required. This resolves a saving issue on those hosts.
-+ Added a Quiz Description content editor under quiz settings. This is the "Editor" from pre 3.16.0 quizzes and any content saved in these fields is now available in this description field
-+ Fixed issue causing points percentage calculation tooltip on quiz builder to show the incorrect percentage value
-+ Fix issue preventing lessons with no drip settings from being updated on the WP post editor
-+ Fix issue causing 500 error on lesson settings metabox for lessons not attached to sections
-+ Add a "Quiz Description" field to allow quiz post content to be edited on the quiz builder
-+ Added a database migration script to ensure quizzes migrated from 3.16 and lower that had quiz post content to automatically have the optional quiz description to be enabled
-
-
-v3.16.2 - 2018-02-02
---------------------
-
-+ Add an update notice to 3.16.0 migration scripts to provide more information about the major update.
-+ Removed quiz assignment fields on the lesson metabox to reduce confusion as quizzes are now managed exclusively on the quiz builder.
-+ Ensure questions migrated during 3.16 updates retain their initial points value from the quiz.
-
-
-v3.16.1 - 2018-02-01
---------------------
-
-+ Ensure quizzes in draft mode are only accessible by those with edit access (instructors, admins, etc...)
-+ Restore pre 3.16 actions and filters related to quiz start buttons
-+ Remove legacy error message for quiz accessibility issues by site admins
-+ Students who cannot access a quiz are redirected to the parent lesson if they attempt to access a quiz directly
-+ Fix undefined index warning on wp-login.php related to LifterLMS js assets. Thanks [Mte90](https://github.com/Mte90)!
-+ Update checkout error message to provide user with direction when they already have access to a course. Thanks [@andreasblumberg](https://github.com/andreasblumberg)!
-
-
-v3.16.0 - 2018-02-01
---------------------
-
-##### Quizzes
-
-+ New question types: True/False, Picture Choice, and Non-question content
-+ Picture & Multiple choice have options for multiple correct answers (checkbox-like questions)
-+ You can now create questions with NO POINTS (maybe for surveys?)
-+ Upgraded student quiz review interface
-+ Upgraded instructor quiz attempt review interface
-+ Admins may now leave remarks on questions directly
-+ Improved data available related to quizzes and quiz attempts on reporting screens
-+ Improved quiz user interface
-+ Added a progress bar to the quiz interface
-+ Shrunk the quiz timer
-+ Added a question # counter on the quiz interface
-+ Fixed issue causing randomized questions to get "lost" when navigating back through a quiz attempt
-+ Improved error handling on quizzes
-+ Overhauled quiz data structure for improved performance and scalability
-+ Requires database migration and update: [3.16.0](https://lifterlms.com/docs/lifterlms-database-updates/#3160)
-
-##### Course Builder Improvements
-
-+ Quiz-building is now available on the course builder
-+ Quiz and Question WordPress editors no longer available. Quizzes and Questions HAVE NOT DISAPPEARED, they've been improved and relocated
-+ All hooks & filters attached to `the_content` and `the_title` are now being removed when loading the course builder. This should prevent infinite spinners on builder loading and builder AJAX calls due to third-parties accidentally outputting html during these events.
-
-##### Updates
-
-+ Added space between arrows and "Next" and "Previous" text on pagination lists. Thanks [sujaypawar](https://github.com/sujaypawar)!
-+ Updated Quiz post type slug from "llms_quiz" to "quiz".
-+ Updated default return of `llms_get_post()` to be `false` rather than a `WP_Post` object when a LifterLMS post cannot be located
-
-##### Bug Fixes
-
-+ Fixed a potential database read error related to database store abstract
-+ Now passing Post ID as second parameter to the `the_title` filter called on post model getters
-
-
-##### Removed templates
-
-The following quiz templates have been removed. Customization of these templates causes quiz application functionality to break and they should not have been available for customization but were due to oversights. This has been corrected.
-
-+ templates/content-single-question-after.php
-+ templates/content-single-question-before.php
-+ templates/quiz/next-question.php
-+ templates/quiz/previous-question.php
-+ templates/quiz/question-count.php
-+ templates/quiz/quiz-question.php
-+ templates/quiz/single-choice.php
-+ templates/quiz/single-choice_ajax.php
-+ templates/quiz/summary.php
-+ templates/quiz/timer.php
-+ templates/quiz/wrapper-end.php
-+ templates/quiz/wrapper-start.php
-
-##### Removed Functions
-
-Various template functions related to quizzes were removed due to the deprecation of their related templates
-
-+ `lifterlms_template_quiz_timer()`
-+ `lifterlms_template_single_next_question()`
-+ `lifterlms_template_single_prev_question()`
-+ `lifterlms_template_single_single_choice()`
-+ `lifterlms_template_single_single_choice_ajax()`
-+ `lifterlms_template_single_question_count()`
-
-
-v3.15.1 - 2017-12-05
---------------------
-
-+ Ensure course & membership titles with HTML characters are decoded during reporting exports
-+ Fix issue causing some courses to display in membership columns on reporting exports
-
-
-v3.15.0 - 2017-12-04
---------------------
-
-##### Reporting Updates (and CSV exports!)
-
-+ Added course-level reporting table (see "Courses" tab of Reporting screen)
-+ Updated the interface on reporting screen when reviewing a single student
-+ Added reporting exports: students list, courses list, and list of students per course
-
-##### Bug fixes
-
-+ Fix error when `[lifterlms_course_continue_button]` shortcode is displayed to logged out or students not enrolled in the chosen course
-
-##### Minor updates
-
-+ Tested up to WordPress 4.9.1
-+ Added background data processors to ensure reporting data stays up to date in close to real time
-+ Add nocache constants and headers on student dashboard & checkout page to increase compatibility with caching plugins
-+ Added filter to student dashboard courses query
-
-
-v3.14.9 - 2017-11-27
---------------------
-
-+ Tested up to WordPress 4.9
-+ Fix error during uninstall related to missing file
-+ Fix issue with rewinding quiz using "Previous Question" button
-+ On final question of a quiz the "Next Lesson" button now says "Complete Quiz"
-+ When completing a quiz, the loading message will now say "Grading Quiz" the entire time instead of "Loading Question" and then "Grading Quiz"
-+ Fix issue causing the `` element on course builder pages from being partially empty
-
-
-v3.14.8 - 2017-11-06
---------------------
-
-+ Lessons can be cloned via the "Clone" action from the lessons post table
-
-##### Builder Improvements & Fixes
-
-+ Add "Existing Lesson" functionality can now clone and attach the clone (when adding a lesson currently attached to a course) OR attach orphans
-+ Lessons created via Course builder will have their slugs renamed the first time the lesson title is updated via the builder
-+ No longer display notices on the course builder
-+ Add extra space to the scrollable area on course builder
-+ Removed logging and debugging functions from admin builder class
-+ JS-generated error messages on the course builder are now translatable
-
-##### Bug Fixes
-
-+ Fix: Show all memberships on dashboard
-
-
-v3.14.7 - 2017-10-25
---------------------
-
-##### Navigation Menu Items
-
-+ Add LifterLMS endpoints to your nav menu
-+ Add Sign In and Sign Out links which display conditionally based on whether or not the visitor is logged in
-+ Checkout the docs at [https://lifterlms.com/docs/lifterlms-navigation-menu-items/](https://lifterlms.com/docs/lifterlms-navigation-menu-items/)
-
-##### Bug Fixes
-
-+ Fix SQL query issue with orphaned lesson query on course builder
-+ Fix undefined index warning occurring during theme switches
-+ Fix issue causing duplicate error messages to display on certain servers
-
-
-v3.14.6 - 2017-10-21
---------------------
-
-+ Fix: `` are no longer stripped when exporting or duplicating courses (this applies to lessons within the courses as well)
-+ Fix: Achievements on student dashboard now output the correct achievement title
-+ Fix: Courses on student dashboard ordered by Order attributes will obey settings correctly
-
-
-v3.14.5 - 2017-10-14
---------------------
-
-+ Course builder will persist open/collapsed state of sections when they are re-ordered
-+ Course builder lessons in a section are draggable after reordering a section
-
-
-v3.14.4 - 2017-10-13
---------------------
-
-+ You were right and we were wrong & we are sorry. This update returns the ability to add existing lessons to a course via the course builder.
-+ Lessons added to a section will no longer visually disappear when editing a section title on the course builder
-+ BuddyPress integration BP template fixes
-
-
-v3.14.3 - 2017-10-12
---------------------
-
-+ Fix [lifterlms_my_account] shortcode issue affecting Divi theme users
-
-
-v3.14.2 - 2017-10-11
---------------------
-
-+ Instructor query utilizes correct `$wpdb->prefix` for filtering by role instead of `wp_` which will not work when the `$table_prefix` in wp-config.php is customized
-+ include the admin notices class when running database update functions
-
-
-v3.14.1 - 2017-10-10
---------------------
-
-+ Fix `[lifterlms_my_achievements]` shortcode
-+ Fix reference to deprecated core function related to checking the permissions of content restricted to a membership
-+ Builder titles will be saved on all field focusout/blur events, not just tab & enter key presses
-+ LifterLMS custom meta save metaboxes will not trigger actions during ajax requests
-+ Fix issue displaying certificates on admin panel reporting screens
-
-
-v3.14.0 - 2017-10-10
---------------------
-
-+ Updated JS for 3.13 course builder to address issues on PHP 5.6 servers with asp_tags enabled
-+ Normalized date returns with various dates related to enrollments, achievements, and certificates. These dates now utilize the WP Core `date_format` option.
-+ Fixed strict comparison issue related to database query abstract (affected checks for last page & first page on admin reporting screens)
-+ Added a new capability `llms_instructor` for admins, lms managers, instructors, and instructor's assistant to easily differentiate "instructors" from "students"
-+ Fix `$wpdb->prepare` issue related to notification queries. Fixes WP 4.9-beta issue.
-
-##### Student Dashboard Updates
-
-+ Achievements on student dashboard now viewable in popover modal.
-+ Achievements tab added to student dashboard
-+ Courses, Memberships, Achievements, and Certificates have been updated to have a unified style
-+ Courses & Memberships extend the default catalog tiles
-+ Courses shortcode has new parameters useful for displaying a list of a specific users courses only. [More info](https://lifterlms.com/docs/shortcodes/#lifterlms_courses)
-
-##### Deprecated functions
-
-+ `LLMS_Student_Dashboard::output_courses_content()` replaced with `lifterlms_template_student_dashboard_my_courses( false )`
-+ `LLMS_Student_Dashboard::output_dashboard_content` replaced with `lifterlms_template_student_dashboard_home()`
-
-##### Template Updates
-
-+ [achievements/loop.php](https://github.com/gocodebox/lifterlms/blob/master/templates/achievements/loop.php)
-+ [achievements/template.php](https://github.com/gocodebox/lifterlms/blob/master/templates/achievements/template.php)
-+ [certificates/loop.php](https://github.com/gocodebox/lifterlms/blob/master/templates/certificates/loop.php)
-+ [certificates/preview.php](https://github.com/gocodebox/lifterlms/blob/master/templates/certificates/preview.php)
-+ [loop.php](https://github.com/gocodebox/lifterlms/blob/master/templates/loop.php)
-+ [loop/content.php](https://github.com/gocodebox/lifterlms/blob/master/templates/loop/content.php)
-+ [loop/enroll-date.php](https://github.com/gocodebox/lifterlms/blob/master/templates/loop/enroll-date.php)
-+ [loop/enroll-status.php](https://github.com/gocodebox/lifterlms/blob/master/templates/loop/enroll-status.php)
-+ [loop/pagination.php](https://github.com/gocodebox/lifterlms/blob/master/templates/loop/pagination.php)
-+ [myaccount/dashboard-section.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/dashboard-section.php)
-+ [myaccount/dashboard.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/dashboard.php)
-+ [myaccount/header.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/header.php)
-
-##### Deleted Templates
-
-+ /myaccount/my-achievements.php
-+ /myaccount/my-courses.php
-+ /myaccount/my-memberships.php
-
-
-v3.13.1 - 2017-10-04
---------------------
-
-+ Fix caching issue preventing quiz pass & fail engagements from triggering.
-+ Fix issue causing the "Builder" link to display on the lesson post table screen.
-+ Fix issue preventing new courses & memberships from being moved from draft -> published.
-+ Fix `wpdb->prepare()` empty placeholder issue related to engagement queries. Fixes warning added in WP 4.9.
-+ Add better version numbering to static assets to prevent caching issues during plugin updates
-
-
-v3.13.0 - 2017-10-02
---------------------
-
-##### An All New Course Builder
-
-+ The "Course Outline" metabox found on the admin panel when editing any LifterLMS course has been savagely beaten. We stole its lunch money and we put it towards the construction of an all interface
-+ Asynchronous loading: fixes issues where very large courses would drastically slow and possibly even time out the loading of the course edit screen
-+ Course outline is now collapsible and expandable. This Fixes issues where it was very hard to move lessons and sections around on very large courses
-+ In addition to the familiar (and now improved) drag and drop functionality, you may now also move sections and lessons up and down with button clicks. You can also move lessons between sections with button clicks
-+ Add new lessons and sections with a click or drag a new lesson or section into the existing course
-+ Edit section and lesson titles faster with inline title editing. No more modals with a potentially slow ajax load to update a title. Click the title, change it, and exit the field to automatically save!
-+ Delete sections and lessons with the click of a button
-+ Quick links to view (frontend) and edit (backend) lessons
-+ Completely internationalized. Thanks for you patience translators!
-+ Want to know more? Check out the [docs](https://lifterlms.com/docs/using-course-builder/).
-
-##### New User Roles
-
-+ Added new roles to enable you to provide access to LifterLMS (settings, courses building, etc...) without having to make an admin or mess with complicated code snippets.
-+ New Roles:
-
- + LMS Manager: Do everything in LifterLMS and nothing with plugins, themes, core settings, and so on
- + Instructor: Create, update, and delete courses and memberships
- + Instructor's Assistant: Edit courses and memberships
-
-+ More details and a full list of new LifterLMS capabilities are available [here](https://lifterlms.com/docs/roles-and-capabilities/).
-
-##### Updates & Fixes
-
-+ Tested up to WordPress 4.8.2
-+ The "Lesson Tree" metabox has been replaced with a simplified version of the lesson tree and a link to the launch the Course Builder.
-+ Course and membership categories and tags will now display on their respective post tables for sorting and filtering. They can be disabled on a per-user basis via the screen options.
-+ Removed `var_dump()` from bbPress integration restriction check
-
-##### Uninstall Script
-
-+ Uninstall script now removes all the things LifterLMS creates in your database if a constant is defined. Read more [here](https://lifterlms.com/docs/remove-lifterlms-data-plugin-uninstallation/).
-
-##### Database Update
-
-+ Adds default Instructor data for all LifterLMS Courses & Memberships based off of the post author of the course or membership
-+ [More information](https://lifterlms.com/docs/lifterlms-database-updates/#3130)
-
-##### Template Updates
-
-+ [admin/post-types/students.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/post-types/students.php)
-+ [admin/reporting/tabs/students/courses.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/reporting/tabs/students/courses.php)
-
-##### Deprecated Functions
-
-+ The following AJAX functions are no longer utilized by LifterLMS core. If you are utilizing them find alternatives (they all exist). These will be remove in the next **major** release:
-
- + `LLMS_AJAX::get_achievements()`
- + `LLMS_AJAX::get_all_posts()`
- + `LLMS_AJAX::get_associated_lessons()`
- + `LLMS_AJAX::get_certificates()`
- + `LLMS_AJAX::get_courses()`
- + `LLMS_AJAX::get_course_tracks()`
- + `LLMS_AJAX::get_emails()`
- + `LLMS_AJAX::get_enrolled_students()`
- + `LLMS_AJAX::get_enrolled_students_ids()`
- + `LLMS_AJAX::get_lesson()`
- + `LLMS_AJAX::get_lessons()`
- + `LLMS_AJAX::get_lessons_alt()`
- + `LLMS_AJAX::get_memberships()`
- + `LLMS_AJAX::get_question()`
- + `LLMS_AJAX::get_sections()`
- + `LLMS_AJAX::get_sections_alt()`
- + `LLMS_AJAX::get_students()`
- + `LLMS_AJAX::update_syllabus()`
-
-##### Removed Filters
-
-+ The following filters have been removed and are no longer in use.
-
- + `lifterlms_admin_courses_access`: replaced with user capability `edit_courses`
- + `lifterlms_admin_membership_access`: replaced with user capability `edit_memberships`
- + `lifterlms_admin_reporting_access`: replaced with user capability `manage_lifterlms`
- + `lifterlms_admin_settings_access`: replaced with user capability `manage_lifterlms`
- + `lifterlms_admin_import_access`: replaced with user capability `manage_lifterlms`
- + `lifterlms_admin_system_report_access`: replaced with user capability `manage_lifterlms`
-
-
-v3.12.2 - 2017-09-18
---------------------
-
-##### Bug fixes
-
-+ Fix issue with LifterLMS bbPress integration preventing course-restricted topics from being accessible by enrolled students
-+ Fix an issue preventing students expired from courses via access expiration settings from being manually re-enrolled by admins
-
-##### Deprecations
-
-+ `LLMS_Student` class function `has_access` is scheduled for deprecation in next major release. Developers should switch to `LLMS_Student->is_enrolled()`
-
-
-v3.12.1 - 2017-08-25
---------------------
-
-+ Prevent duplicate loading of repeater metabox fields
-+ Fix undefined warning related to quiz completion
-+ Ensure that the bbPress course forums shortcode & widget properly cascade up when used on a lesson or quiz
-
-
-v3.12.0 - 2017-08-17
---------------------
-
-+ New quiz feature: randomize the order of quiz questions each attempt! Props to [Larry Groebe](https://github.com/larrygroebe)
-+ Fixed logic error related to access checks when bubbling from quiz->lesson->course
-+ Fixed JS loader check for tinyMCE editors in repeater fields
-+ Fixed CSS issue related to tinyMCE editors in repeater fields
-+ Fixed issue causing tinyMCE editors in repeater fields to stop working after reordering rows
-+ LifterLMS alert box notices are now cleared during shutdown instead of immediately after rendering. Fixes some plugin compatibility issues.
-+ Fix reference to invalid meta key on order notes admin screen.
-+ Record order note when orders with a defined length complete
-+ When a payment is scheduled for an order with a defined length, calculate end date if no end date is saved
-+ Minor updates to the `LLMS_Abstract_Integration` class
-+ Fix undefined reference error on 404 pages resulting from the preview manager.
-
-##### bbPress Integration Updates
-
-+ Add "Private" Course Forums which allows forums to be made available only to students enrolled in the associated course
-+ Adds a shortcode and widget for outputting a list of forums associated with a course
-+ Adds the ability to restrict the page set as the bbPress forum index (via bbPress settings) to be restricted to LifterLMS memberships
-+ Adds engagement triggers to allow engagements to be fired when a student posts a reply or creates a new topic
-+ Improves integration membership restriction check performance
-+ Migrated to the `LLMS_Abstract_Integration` class. Visually changes the settings display but has no other impact
-+ [More information](https://lifterlms.com/docs/lifterlms-and-bbpress/)
-
-##### BuddyPress Integration Updates
-
-+ Add the ability to restrict activity, group, and member directory pages to LifterLMS memberships.
-+ Migrated to the `LLMS_Abstract_Integration` class. Visually changes the settings display but has no other impact
-+ [More information](https://lifterlms.com/docs/lifterlms-and-bbpress/)
-
-##### Database update
-
-+ calculate and store end dates for orders created prior to version 3.11.0 which have a defined length and do not have a stored end date.
-+ migrate bbPress and BuddyPress options to `LLMS_Abstract_Integration` naming convention
-+ [More information](https://lifterlms.com/docs/lifterlms-database-updates/#3120)
-
-##### Admin Post Table Upgrades
-
-+ Lessons
- + Fix section titles which formerly were a dead link. Now they're just text
- + Add filtering the table by associated course
-+ Quizzes
- + Display associated course and lesson columns with links
- + Add filtering by associated course and/or lesson
-+ Quiz Questions
- + Display associated Quizzes with links
- + Add filtering by associated quiz
-
-##### Template Updates
-
-+ [admin/post-types/order-details.php](https://github.com/gocodebox/lifterlms/blob/master/templates/admin/post-types/order-details.php)
-
-
-v3.11.2 - 2017-08-14
---------------------
-
-+ Tested up to WP Core 3.8.1
-
-##### System Status and Reporting updates
-
-+ System Report renamed to "Status"
-+ Added information of template overrides to the system report
-+ Added "Get Help" button linking to LifterLMS Ticketing submission page
-+ Added "Logs" tab which allows for easy viewing & management of LifterLMS logs
-+ Added "Tools and Utilities" tab and moved tools from the General Settings screen to this tab
-+ Improved Session Reset tool
-
-
-v3.11.1 - 2017-08-03
---------------------
-
-+ New shortcode: `[lifterlms_course_continue_button]`. See [shortcode docs](https://lifterlms.com/docs/shortcodes/#lifterlms_course_continue_button) for more information.
-+ New shortcode: `[lifterlms_lesson_mark_complete]`. See [shortcode docs](https://lifterlms.com/docs/shortcodes/#lifterlms_lesson_mark_complete) for more information.
-+ Added filter `llms_product_pricing_table_enrollment_status` to allow forceful display of course/membership pricing tables regardless of user enrollment status.
-+ Fix course author shortcode to allow usage outside of a course via the `course_id` parameter.
-
-##### Template Updates
-
-+ [product/pricing-table.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/pricing-table.php)
-+ [product/course/progress.php](https://github.com/gocodebox/lifterlms/blob/master/templates/product/course/progress.php)
-
-
-v3.11.0 - 2017-07-31
---------------------
-
-+ New engagement trigger "Student purchases access plan" allows engagements to be triggered from a specific access plan!
-+ Minor performance improvements to notification-related database queries
-+ Fix issue causing payment gateways to always use test mode links from Orders on the admin panel
-+ Added default email notification merge code for outputting an HTML divider
-+ Added new actions to Dashboard template to allow adding custom content to course tiles on the dashboard
-
-##### Template Updates
-
-+ [myaccount/my-courses.php](https://github.com/gocodebox/lifterlms/blob/master/templates/myaccount/my-courses.php)
-
-
-v3.10.2 - 2017-07-14
---------------------
-
-+ Fix fatal error related to purchase receipts for trashed or deleted orders
-+ l10n "Reviews" tab title on course settings
-+ Remove commented out sample preheader text from email header template which was displaying in some email clients.
-
-##### Template Updates
-
-+ [emails/header.php](https://github.com/gocodebox/lifterlms/blob/master/templates/emails/header.php)
-
-
-v3.10.1 - 2017-07-12
---------------------
-
-##### Bugfixes
-
-+ Prevent errors related to attempting to display notification data related to deleted students
-+ Fix errors related to displaying notifications for deleted post (courses, sections, lessons, quizzes, etc...)
-+ Fix error causing email notifications being sent after related user has been deleted
-+ Fix typo preventing `llms_form_field()` from outputting textareas
-
-##### Updates
-
-+ Add new filter `llms_allow_subscription_cancellation` useful for preventing students from self-cancelling their subscriptions on the student dashboard. [More info](https://lifterlms.com/docs/lifterlms-filters/#llms_allow_subscription_cancellation).
-+ Add new API for querying students via AJAX select2 elements
-+ Select2 Post Query elements can now query multiple post types simultaneously
-+ Seletc2 Post Query elements can now support `