diff --git a/.editorconfig b/.editorconfig index 040968efaa..cec1c95078 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,10 +13,16 @@ trim_trailing_whitespace = true [*.{md,txt,json,yml}] trim_trailing_whitespace = false -[*.{json}] +[*.json] indent_size = 2 tab_width = 2 [*.{json,yml}] insert_final_newline = false indent_style = space + +[composer.json] +indent_size = 4 +tab_width = 4 +indent_style = tab +insert_final_newline = true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46ee74a599..97bfafb0dc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,3 +34,27 @@ jobs: name: sensei-lms-${{ github.event.pull_request.head.sha }} path: ${{ github.workspace }}/sensei-lms/ retention-days: 7 + + syntax-check: + name: PHP Syntax Check + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: [7.3, 8.1] + steps: + - name: Download Build Artifact + uses: actions/download-artifact@v3 + with: + name: sensei-lms-${{ github.event.pull_request.head.sha }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + tools: phplint + coverage: none + + - name: Check Syntax + run: phplint ./sensei-lms diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index db0b7bffd3..8a4ee3f3e0 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -61,10 +61,10 @@ jobs: wpmu: [0] php: ['7.3', '7.4', '8.0'] include: - - php: 7.3 - wp: '6.0' - php: 7.3 wp: '6.1' + - php: 7.3 + wp: '6.2' - php: 7.3 wp: latest wpmu: 1 diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml new file mode 100644 index 0000000000..f73a6d3922 --- /dev/null +++ b/.github/workflows/psalm.yml @@ -0,0 +1,47 @@ +name: Psalm Test + +on: + pull_request: + workflow_call: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + tests: + name: Psalm + runs-on: ubuntu-latest + strategy: + fail-fast: true + max-parallel: 10 + matrix: + php: ['7.3', '8.2'] + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Get cached composer directories + uses: actions/cache@v3 + with: + path: ~/.cache/composer/ + key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }} + - uses: actions/cache@v3 + with: + path: vendor/ + key: ${{ runner.os }}-vendor-${{ hashFiles('composer.lock') }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + tools: composer + coverage: none + + - name: Install + run: composer install --no-ansi --no-interaction --prefer-dist --no-progress + + - name: Run Psalm + run: ./vendor/bin/psalm \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd54cad74e..a0ff0cafd5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,6 +49,10 @@ Before submitting a pull request, make sure that your changes follow the followi Test your code on the minimum supported PHP and WordPress versions. - Please ensure that any dependencies are properly handled and documented. +## Composer + +- Because of possible conflicts, all required composer packages should be `scoped`. Scoping is done by copying the package to the `third-party` folder and changing its namespace to `Sensei\ThirdParty\...`. To do so, first, add the package as a dev dependency - `composer require --dev vendor/package`. Then, edit `config/scoper.inc.php` to include the new package. Keep in mind that some packages may have their dependencies, so add those as well. Finally, run `composer dump-autoload` which will initialize the scoping process. + ## JavaScript and CSS - JavaScript, JSX, and SCSS files (using [SASS](https://sass-lang.com/documentation/file.SASS_REFERENCE.html)) need to be compiled before using the plugin. diff --git a/assets/admin/editor-wizard/steps/lesson-patterns-step.js b/assets/admin/editor-wizard/steps/lesson-patterns-step.js index cd8f3785b6..dc82b6ccb4 100644 --- a/assets/admin/editor-wizard/steps/lesson-patterns-step.js +++ b/assets/admin/editor-wizard/steps/lesson-patterns-step.js @@ -29,7 +29,7 @@ const LessonPatternsStep = ( { wizardData, ...props } ) => { return ( @@ -48,7 +48,7 @@ const UpsellBlock = () => (
- { __( 'Want More Lesson Types?', 'sensei-lms' ) } + { __( 'Want More Lesson Layouts?', 'sensei-lms' ) }
{ __( diff --git a/assets/css/3rd-party/themes/astra/learning-mode.scss b/assets/css/3rd-party/themes/astra/learning-mode.scss new file mode 100644 index 0000000000..797e670e9f --- /dev/null +++ b/assets/css/3rd-party/themes/astra/learning-mode.scss @@ -0,0 +1,3 @@ +div.wp-block-button.is-style-outline > .wp-block-button__link:not(.has-text-color) { + color: inherit; +} diff --git a/assets/css/learning-mode-compat.scss b/assets/css/learning-mode-compat.scss index 072927c90f..45d11ed5b5 100644 --- a/assets/css/learning-mode-compat.scss +++ b/assets/css/learning-mode-compat.scss @@ -146,8 +146,8 @@ $breakpoint: 782px; font-family: inherit; font-weight: inherit; font-size: inherit; - background-color: inherit !important; - color: inherit !important; + background-color: inherit; + color: inherit; text-transform: unset; &:hover { diff --git a/assets/css/sensei-course-theme/buttons.scss b/assets/css/sensei-course-theme/buttons.scss index 28283cf735..e35abc92f6 100644 --- a/assets/css/sensei-course-theme/buttons.scss +++ b/assets/css/sensei-course-theme/buttons.scss @@ -1,4 +1,3 @@ - $breakpoint: 782px; .sensei-course-theme .wp-block-buttons { @@ -8,13 +7,12 @@ $breakpoint: 782px; } .sensei-course-theme__button, -.wp-block-button.is-style-outline > .wp-block-button__link, .sensei-course-theme__link { align-items: center; - white-space: nowrap; - width: 100%; height: 100%; justify-content: center; + white-space: nowrap; + width: 100%; @media screen and (max-width: $breakpoint) { padding: 20px; @@ -22,7 +20,6 @@ $breakpoint: 782px; letter-spacing: -0.14px; } - &.has-icon { display: flex; gap: 8px; diff --git a/assets/css/sensei-course-theme/quiz.scss b/assets/css/sensei-course-theme/quiz.scss index 6a1468ab39..e592b89be8 100644 --- a/assets/css/sensei-course-theme/quiz.scss +++ b/assets/css/sensei-course-theme/quiz.scss @@ -32,8 +32,6 @@ $tablet-breakpoint: 768px; } &__header { - position: sticky; - top: var(--top-offset); background-color: var(--sensei-background-color); z-index: 100; diff --git a/assets/css/sensei-course-theme/sidebar-mobile-menu.scss b/assets/css/sensei-course-theme/sidebar-mobile-menu.scss index c01d8ac9b1..7aeb64cbd2 100644 --- a/assets/css/sensei-course-theme/sidebar-mobile-menu.scss +++ b/assets/css/sensei-course-theme/sidebar-mobile-menu.scss @@ -5,7 +5,11 @@ $breakpoint: 783px; -.sensei-course-theme__sidebar-toggle { +.single-quiz .sensei-course-theme__sidebar-toggle { + display: none; +} + +.single-lesson .sensei-course-theme__sidebar-toggle { display: block; width: 24px; height: 24px; @@ -31,9 +35,10 @@ $breakpoint: 783px; background: none; } } + // Desktop @media screen and (min-width: ($breakpoint)) { - .sensei-course-theme__sidebar-toggle { + .single-lesson .sensei-course-theme__sidebar-toggle { display: none; } } @@ -41,7 +46,6 @@ $breakpoint: 783px; // Mobile @media screen and (max-width: ($breakpoint - 1)) { .sensei-course-theme { - &--sidebar-open { overflow: hidden; @@ -84,6 +88,5 @@ $breakpoint: 783px; &:not(&--sidebar-open) &__sidebar { opacity: 0; } - } } diff --git a/assets/shared/structure/structure-store.js b/assets/shared/structure/structure-store.js index 29774021a9..dd2d44ffff 100644 --- a/assets/shared/structure/structure-store.js +++ b/assets/shared/structure/structure-store.js @@ -245,27 +245,27 @@ export function registerStructureStore( { return; } - const isSavingPost = - editor.isSavingPost() && ! editor.isAutosavingPost(); const isSavingStructure = select( storeName ).getIsSavingStructure(); + const isSavingPost = + editor.isSavingPost() && ! editor.isAutosavingPost(); if ( isSavingPost ) { editorStartedSaving = true; - metaSavingStarted = false; } - if ( editorStartedSaving && ! metaSavingStarted ) { - metaSavingStarted = editPostSelector.isSavingMetaBoxes(); + const isSavingMetaBoxes = editPostSelector.isSavingMetaBoxes(); + if ( isSavingMetaBoxes ) { + metaSavingStarted = true; } if ( ! structureStartedSaving && ! isSavingPost && + ! isSavingMetaBoxes && editorStartedSaving && - metaSavingStarted && - ! editPostSelector.isSavingMetaBoxes() + metaSavingStarted ) { // Start saving structure when post has finished saving. structureStartedSaving = true; diff --git a/changelog.txt b/changelog.txt index 09e5edf3fb..f6f2008350 100755 --- a/changelog.txt +++ b/changelog.txt @@ -1,7 +1,24 @@ *** Changelog *** -## 4.16.0 - 2023-07-13 +## 4.16.1 - 2023-08-15 +### Added +- Add CC/BCC fields for Sensei emails [#7014](https://github.com/Automattic/sensei/pull/7014) + +### Changed +- Update the `sensei_results_links` filter to include the learner's user ID when displaying public profiles and to display results links publicly [#7048](https://github.com/Automattic/sensei/pull/7048) +### Fixed +- Fix "View Results" button not working [#7058](https://github.com/Automattic/sensei/pull/7058) +- Fix custom button colors not being applied in Learning Mode [#7080](https://github.com/Automattic/sensei/pull/7080) +- Fix duplicate comment sections under lesson in FSE themes [#7044](https://github.com/Automattic/sensei/pull/7044) +- Fix lessons not using the selected template in FSE themes [#7045](https://github.com/Automattic/sensei/pull/7045) +- Fix error when the module author user is deleted [#7082](https://github.com/Automattic/sensei/pull/7082) +- Fix lessons not being saved when creating a course on the latest Gutenberg version [#7091](https://github.com/Automattic/sensei/pull/7091) +- Fix lesson styling in editor on WordPress 6.3 or when Gutenberg enabled [#7054](https://github.com/Automattic/sensei/pull/7054) +- Fix PHP 8.1 deprecation notice on Students page [#7038](https://github.com/Automattic/sensei/pull/7038) +- Fix `strpos`and `str_replace` deprecation messages in PHP 8.1 and 8.2 [#7028](https://github.com/Automattic/sensei/pull/7028) + +## 4.16.0 - 2023-07-13 ### Added - Enable to select how to generate lessons when a course is created [#6999](https://github.com/Automattic/sensei/pull/6999) @@ -14,7 +31,6 @@ - Fix PHP 8.1 autovivification of falsy value deprecation message [#7015](https://github.com/Automattic/sensei/pull/7015) - Removed Beta label from Editor Menu [#6989](https://github.com/Automattic/sensei/pull/6989) - ## 4.15.1 - 2023-06-22 ### Added - Add Enrolled and Completion columns on the reports course page. [#6966](https://github.com/Automattic/sensei/pull/6966) diff --git a/changelog/add-header-on-lm-quiz-template b/changelog/add-header-on-lm-quiz-template new file mode 100644 index 0000000000..4e423cf82d --- /dev/null +++ b/changelog/add-header-on-lm-quiz-template @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Added header on the learning mode template of quizzes diff --git a/changelog/add-profile-links-filter b/changelog/add-profile-links-filter deleted file mode 100644 index 05274655fc..0000000000 --- a/changelog/add-profile-links-filter +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Updates the `sensei_results_links` filter to include the learner's user ID when displaying public profiles and to display results links publicly. diff --git a/changelog/fix-duplicate-comment-section-in-fse-themes b/changelog/fix-duplicate-comment-section-in-fse-themes deleted file mode 100644 index 93670a9db5..0000000000 --- a/changelog/fix-duplicate-comment-section-in-fse-themes +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Fix duplicate comment sections under lesson in FSE themes diff --git a/changelog/fix-extra-heading-fix-course-and-lesson b/changelog/fix-extra-heading-fix-course-and-lesson new file mode 100644 index 0000000000..3eb769b331 --- /dev/null +++ b/changelog/fix-extra-heading-fix-course-and-lesson @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Fixed extra header element in lesson content diff --git a/changelog/fix-grades-duplicates b/changelog/fix-grades-duplicates deleted file mode 100644 index a44f51e6c8..0000000000 --- a/changelog/fix-grades-duplicates +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: fixed -Comment: Part of progress storage feature which is not publicly released. - - diff --git a/changelog/fix-php81-deprecation-notice b/changelog/fix-php81-deprecation-notice deleted file mode 100644 index 1b6c12eae6..0000000000 --- a/changelog/fix-php81-deprecation-notice +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Fix PHP 8.1 deprecation notice on Students page diff --git a/changelog/fix-wp-core-deprecation-messages b/changelog/fix-wp-core-deprecation-messages deleted file mode 100644 index fd4d51ff64..0000000000 --- a/changelog/fix-wp-core-deprecation-messages +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fixed - -Fix `strpos`and `str_replace` deprecation messages in PHP 8.1 and 8.2 diff --git a/changelog/update-lesson-types-naming b/changelog/update-lesson-types-naming new file mode 100644 index 0000000000..6590efb63c --- /dev/null +++ b/changelog/update-lesson-types-naming @@ -0,0 +1,4 @@ +Significance: minor +Type: changed + +Change "Lesson Type" to "Lesson Layout" in wizard diff --git a/composer.json b/composer.json index 860733670a..7020e423fe 100755 --- a/composer.json +++ b/composer.json @@ -9,11 +9,13 @@ "dms/phpunit-arraysubset-asserts": "0.5.0", "humbug/php-scoper": "0.15.0", "pelago/emogrifier": "7.0.0", + "php-stubs/wordpress-stubs": "^6.3", "phpcompatibility/phpcompatibility-wp": "2.1.4", "sirbrillig/phpcs-no-get-current-user": "1.1.0", "sirbrillig/phpcs-variable-analysis": "2.11.16", "squizlabs/php_codesniffer": "3.7.2", "symfony/polyfill-php80": "1.16.0", + "vimeo/psalm": "4.22.0", "wp-coding-standards/wpcs": "2.3.0", "yoast/phpunit-polyfills": "2.0.0" }, @@ -99,7 +101,16 @@ }, "extra": { "changelogger": { - "changelog": "changelog.txt" + "changelog": "changelog.txt", + "types": { + "security": "Vulnerability fix (e.g. Fix XSS vulnerability)", + "added": "New feature (e.g. Add quiz generation using AI)", + "changed": "Changes to existing functionality (e.g. Redirect to next lesson without showing a message, Bump minimum required PHP version to 7.3)", + "deprecated": "Soon-to-be removed feature (e.g. Deprecate the legacy email system in favor of the new one)", + "removed": "Removed feature (e.g. Remove the legacy email system)", + "fixed": "Bug fix (e.g. Fix admin notice styles)", + "dev": "Changes that third-party devs should be aware of (e.g. Deprecate the `Sensei_Emails` class, Remove wrapper elements from templates, Introduce new hook: `sensei_email_send`)" + } } } } diff --git a/composer.lock b/composer.lock index f466befb8a..b2a56cbe87 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,175 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "271a1c6440fc20adcd38c25f24d3eefe", + "content-hash": "b63b883ccf47e12a720b234c4f2b9a7d", "packages": [], "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" + }, { "name": "automattic/jetpack-changelogger", "version": "v3.3.5", @@ -200,6 +366,224 @@ ], "time": "2022-01-17T14:14:24+00:00" }, + { + "name": "composer/pcre", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "3fdb2807b31a78a40ad89570e30ec77466c98717" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/3fdb2807b31a78a40ad89570e30ec77466c98717", + "reference": "3fdb2807b31a78a40ad89570e30ec77466c98717", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/2.1.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-11-16T18:32:04+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, { "name": "dealerdirect/phpcodesniffer-composer-installer", "version": "v1.0.0", @@ -322,6 +706,43 @@ }, "time": "2023-06-02T17:33:53+00:00" }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, { "name": "doctrine/instantiator", "version": "1.5.0", @@ -392,6 +813,107 @@ ], "time": "2022-12-30T00:15:36+00:00" }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, { "name": "humbug/php-scoper", "version": "0.15.0", @@ -580,6 +1102,57 @@ ], "time": "2023-03-08T13:26:56+00:00" }, + { + "name": "netresearch/jsonmapper", + "version": "v4.2.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" + }, + "time": "2023-04-09T17:37:40+00:00" + }, { "name": "nikic/php-parser", "version": "v4.16.0", @@ -631,10 +1204,63 @@ "php" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + }, + "time": "2023-06-25T14:52:30+00:00" + }, + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "support": { + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" }, - "time": "2023-06-25T14:52:30+00:00" + "time": "2019-03-29T20:06:56+00:00" }, { "name": "pelago/emogrifier", @@ -825,6 +1451,50 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "php-stubs/wordpress-stubs", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-stubs/wordpress-stubs.git", + "reference": "adda7609e71d5f4dc7b87c74f8ec9e3437d2e92c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/adda7609e71d5f4dc7b87c74f8ec9e3437d2e92c", + "reference": "adda7609e71d5f4dc7b87c74f8ec9e3437d2e92c", + "shasum": "" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "php": "^7.4 || ~8.0.0", + "php-stubs/generator": "^0.8.3", + "phpdocumentor/reflection-docblock": "^5.3", + "phpstan/phpstan": "^1.10.12", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "paragonie/sodium_compat": "Pure PHP implementation of libsodium", + "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "WordPress function and class declaration stubs for static analysis.", + "homepage": "https://github.com/php-stubs/wordpress-stubs", + "keywords": [ + "PHPStan", + "static analysis", + "wordpress" + ], + "support": { + "issues": "https://github.com/php-stubs/wordpress-stubs/issues", + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.3.0" + }, + "time": "2023-08-10T16:34:11+00:00" + }, { "name": "phpcompatibility/php-compatibility", "version": "9.3.5", @@ -999,6 +1669,166 @@ }, "time": "2022-10-24T09:00:36+00:00" }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + }, + "time": "2022-03-15T21:29:03+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "9.2.26", @@ -3349,6 +4179,221 @@ ], "time": "2021-07-28T10:34:58+00:00" }, + { + "name": "vimeo/psalm", + "version": "4.22.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/fc2c6ab4d5fa5d644d8617089f012f3bb84b8703", + "reference": "fc2c6ab4d5fa5d644d8617089f012f3bb84b8703", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.22.0" + }, + "time": "2022-02-24T20:34:05+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webmozart/path-util", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" + }, { "name": "wikimedia/at-ease", "version": "v2.1.0", diff --git a/config/psalm/psalm-baseline.xml b/config/psalm/psalm-baseline.xml new file mode 100644 index 0000000000..de9b232f61 --- /dev/null +++ b/config/psalm/psalm-baseline.xml @@ -0,0 +1,9576 @@ + + + + + sensei_load_learning_mode_styles_for_astra_theme + + + Sensei() + + + + + sensei_admin_load_learning_mode_style_for_course_theme + sensei_disable_learning_mode_style_for_course_theme + sensei_load_learning_mode_style_for_course_theme + + + $screen->base + $screen->id + $screen->post_type + + + Sensei() + + + + + sensei_admin_load_learning_mode_style_for_divi_theme + sensei_fix_divi_learning_mode_video_template_excerpt + sensei_fix_divi_theme_builder_and_learning_mode_conflict + sensei_fix_divi_yoast_conflict + sensei_load_learning_mode_style_for_divi_theme + + + $course_id + $course_id + + + $screen->base + $screen->id + $screen->post_type + + + 'sensei_admin_load_learning_mode_style_for_course_theme' + 'sensei_load_learning_mode_style_for_course_theme' + Sensei() + + + + + sensei_woocommerce_show_admin_bar + + + + + ! self::$instance + self::$instance + + + require_once ABSPATH . 'wp-admin/includes/plugin.php' + + + add_admin_notice + add_admin_notices + handle_notice_dismiss + init + save_dismissed_notices + + + $plugin_version + $plugin_version + wp_json_encode( $action['tasks'] ) + + + DAY_IN_SECONDS + + + Sensei() + Sensei() + Sensei() + + + + + ! self::$instance + self::$instance + + + $allowed + $meta_key + $post_id + + + enqueue_admin_scripts + init + register_post_metas + + + $post_id + + + Sensei() + Sensei() + Sensei() + + + + + enqueue_admin_assets + save_exit_survey + + + $screen->id + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + ! self::$instance + self::$instance + + + $additional_query_args + + + string + string + + + function( $extension ) use ( $installed_plugins ) { + function( $theme ) { + + + require_once ABSPATH . 'wp-admin/includes/plugin.php' + + + add_admin_menu_item + enqueue_admin_assets + init + render + + + wp_json_encode( $additional_query_args ) + + + DAY_IN_SECONDS + + + + + ! self::$instance + self::$instance + + + add_admin_menu_item + enqueue_admin_assets + handle_tasks_dismiss + init + localize_script + render + + + $screen->id + + + (int) $notices_count + + + SENSEI_LMS_VERSION + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + 'WP_Post' + 'WP_Post' + 'WP_Post' + + + false === $mysql_date + + + $_POST['data']['comment_id'] + $_POST['data']['post_id'] + $full_name + $lesson_id + wp_unslash( $_GET['course_id'] ?? 0 ) + wp_unslash( $_GET['lesson_id'] ?? 0 ) + + + add_custom_navigation + add_learner_notices + display_students_navigation + edit_date_started + enqueue_scripts + enqueue_styles + get_redirect_url + handle_learner_actions + handle_user_async_action + json_search_users + learners_admin_menu + learners_default_nav + learners_headers + learners_page + load_data_table_files + load_screen_options_when_on_bulk_actions + remove_user_from_post + reset_user_post + wrapper_container + + + $course->post_author + $post->post_author + $post->post_author + + + $post->post_author + + + isset( $this->bulk_actions_controller ) && $this->bulk_actions_controller->is_current_page() + + + isset( $this->bulk_actions_controller ) + + + undefined + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + add_notices + check_nonce + do_user_action + enqueue_scripts + handle_http_post + is_current_page + learner_admin_page + learners_admin_menu + redirect_to_learner_admin_index + register_hooks + + + $edit_course_cap + + + get_post_type_object( 'course' )->cap + + + Sensei() + + + + + + $this->query_args + + + $this->query_args['filter_by_course_id'] + $this->query_args['filter_by_course_id'] + $this->query_args['per_page'] + $this->query_args['per_page'] + + + $this->query_args + + + $this->parse_query_args() + + + $item->last_activity_date + $learner->user_email + $learner->user_id + $learner->user_id + $learner->user_login + + + $course->ID + $full_name + $full_name + $this->total_items + $user_id + Sensei_Learner::get_full_name( $learner->user_id ) + + + courses_select + data_table_header + extra_tablenav + output_headers + prepare_items + search_button + + + $course->ID + $course->post_title + $course->post_title + + + $controller->get_name() + + + Sensei_Learners_Admin_Bulk_Actions_View + Sensei_Learners_Admin_Bulk_Actions_View + Sensei_Learners_Admin_Bulk_Actions_View + Sensei_Learners_Admin_Bulk_Actions_View + + + + + $item + $item + $user_activity + + + ! $item + $id + $item + + + 'course-category' + + + $form_course_id + $form_lesson_id + $post_id + $post_id + $post_id + $post_id + $post_id + $title + $title + + + extra_tablenav + + + $cats + + + $name + $post_id + $post_id + $post_type + $post_type + $post_type + + + is_enrolled + + + $cats + + + get_provider_results + + + get_post_type_object( 'course' )->cap->edit_post + get_post_type_object( 'lesson' )->cap->edit_post + + + get_post_type_object( 'course' )->cap + get_post_type_object( 'lesson' )->cap + + + Sensei_Learners_Main + Sensei_Learners_Main + Sensei_Learners_Main + Sensei_Learners_Main + WooThemes_Sensei_Learners_Main + WooThemes_Sensei_Learners_Main + WooThemes_Sensei_Learners_Main + WooThemes_Sensei_Learners_Main + + + 'course' === $form_post_type + + + Sensei_Course_Enrolment_Manager::instance()->get_enrolment_provider_name_by_id( $id ) + + + manual_filter_visible + + + Sensei() + + + + + + ! self::$instance + is_wp_error( $plugin_information ) + self::$instance + + + $plugin_information + + + $plugin_to_install->plugin_file + $plugin_to_install->product_slug + $plugin_to_install->title + + + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' + require_once ABSPATH . 'wp-admin/includes/file.php' + require_once ABSPATH . 'wp-admin/includes/plugin-install.php' + require_once ABSPATH . 'wp-admin/includes/plugin.php' + + + activate_plugin + associate_plugin_file + background_installer + close_http_connection + complete_installation + install_plugin + install_plugins + run_deferred_actions + save_error + set_installing_plugins + set_time_limit + + + $download + $download + $result + $working_dir + + + $plugin_information->download_link + + + $installed ? $installed_plugins[ $plugin_file ] : $plugin_slug . '/' . $plugin_file + $result + + + $installed_plugins[ $plugin_file ] + + + DAY_IN_SECONDS + WP_PLUGIN_DIR + + + + + $page_data + + + create_pages + + + $page->ID + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei_Utils::get_woocommerce_connect_data() + get_feature_with_status + get_sensei_extensions + + + ! $extensions + ! $screen + ! $screen + ! self::$instance + $extensions + self::$instance + + + new Sensei_Setup_Wizard_Pages() + + + $extension->price + + + activation_redirect + add_setup_wizard_help_tab + close_wccom_install + enqueue_scripts + enqueue_styles + finish_setup_wizard + install_extensions + prepare_wizard_page + redirect_to_setup_wizard + register_wizard_page + remove_notices_from_setup_wizard + render_wizard_page + setup_wizard_notice + skip_setup_wizard + + + $extension + + + $screen->id + + + $screen->id + + + Sensei_Setup + + + Sensei() + Sensei() + Sensei() + + + + + ! self::$instance + self::$instance + + + init + + + $installed_time + + + $final_template_path + + + Sensei() + Sensei() + + + + + ! self::$instance + self::$instance + + + add_menu_pages + get_tool_url + init + output + process + trigger_invalid_request + + + $tools + + + HOUR_IN_SECONDS + + + Sensei() + + + output + + + + + '\SenseiLMS_Licensing\SenseiLMS_Plugin_Updater' + + + $res + + + false|object + + + init + invalid_license_update_disclaimer + plugins_loaded + + + $remote->author + $remote->banners + $remote->download_url + $remote->download_url + $remote->icons + $remote->last_updated + $remote->name + $remote->requires + $remote->requires + $remote->requires_php + $remote->requires_php + $remote->sections + $remote->slug + $remote->slug + $remote->tested + $remote->tested + $remote->version + $remote->version + + + \SenseiLMS_Licensing\License_Manager + + + Sensei() + + + $remote->author + $remote->banners + $remote->download_url + $remote->download_url + $remote->icons + $remote->last_updated + $remote->name + $remote->requires + $remote->requires + $remote->requires_php + $remote->requires_php + $remote->sections + $remote->slug + $remote->slug + $remote->tested + $remote->tested + $remote->version + $remote->version + + + + + HOUR_IN_SECONDS + + + + + HOUR_IN_SECONDS + + + + + set_fail_retry + + + $response + + + DAY_IN_SECONDS + HOUR_IN_SECONDS + + + + + $admin_notices + $screen_id + + + $this->local_only( $max_age ) + isset( $this->admin_notices ) + + + DAY_IN_SECONDS + HOUR_IN_SECONDS + + + + + array|null + + + require_once ABSPATH . 'wp-admin/includes/plugin.php' + require_once ABSPATH . 'wp-admin/includes/update.php' + + + init + + + $plugin_data->update->plugin ?? null + + + $local_plugin_updates + + + isset( $this->local_plugin_updates ) + + + + + $this->get_email_notification_url() + + + '/admin.php?page=sensei-settings#email-notification-settings' + 'admin.php?page=sensei-settings&tab=email-notification-settings' + + + array + + + Sensei() + + + + + attach_tasks_statuses_hooks + mark_as_completed + update_tasks_statuses + + + $post->post_title + + + $post->post_title + + + + + require_once ABSPATH . 'wp-admin/includes/plugin.php' + + + + + $formatted_time + + + string + + + $item->user_id + + + $course_progress_id + $course_progress_id + $course_progress_id + $time + $time + + + $results + + + output + process + return_with_message + + + $course + $course + + + get_provider_results + get_time + get_version_hash + + + $course_progress->comment_approved + $course_progress->comment_date_gmt + + + $course_progress->comment_approved + + + Sensei() + Sensei() + Sensei() + + + debug + + + + + process + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + output + process + + + Sensei() + Sensei() + Sensei() + + + + + output + process + + + Sensei() + Sensei() + Sensei() + + + + + output + + + + + process + + + + + $terms + + + \WP_Term[] + + + process + + + Sensei() + Sensei() + + + + + output + process + + + $course + + + + + process + + + + + process + + + Sensei() + + + + + $course_value + $user_value + + + $courses + $users + + + + + $allowed_debug_html + + + $view_course_url + + + + + $course_value + + + + + Sensei() + + + + + Sensei() + Sensei() + + + + + empty( $tool ) + empty( $tool ) + + + + + run + + + + + run + + + + + cleanup + persist + restore_state + set_state + + + wp_json_encode( $this->get_args() ) + + + $state + + + DAY_IN_SECONDS + + + + + schedule_job + + + $current_job + + + cancel_all_jobs + cancel_scheduled_job + run + + + null + + + as_next_scheduled_action( $job->get_name(), [ $job->get_args() ], self::ACTION_SCHEDULER_GROUP ) + as_schedule_single_action( $time, $job->get_name(), [ $job->get_args() ], self::ACTION_SCHEDULER_GROUP ) + as_unschedule_all_actions( $job->get_name(), [ $job->get_args() ], self::ACTION_SCHEDULER_GROUP ) + as_unschedule_all_actions( null, null, self::ACTION_SCHEDULER_GROUP ) + + + + + cancel_all_jobs + cancel_scheduled_job + run + + + + + mixed + + + cancel_all_jobs + cancel_scheduled_job + run + + + + + $job + + + $class_name + + + string + + + new $class_name( $args, $id ) + new $class_name() + + + self::$instance + + + init + + + Sensei_Scheduler_Interface + + + new $class_name() + + + isset( self::$instance ) + + + + + ! self::$instance + self::$instance + + + $attributes + + + enqueue_scripts + get_patterns_category_name + get_post_content_block_type_name + init + maybe_register_pattern_block_polyfill + register_block_patterns + register_block_patterns_category + register_course_list_block_patterns + + + Sensei() + Sensei() + Sensei() + Sensei() + + + require __DIR__ . "/{$post_type}/{$block_pattern}.php" + + + + + register_course_list_block_patterns + + + + + Sensei() + + + + + + Sensei() + + + + + + Sensei() + + + + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei() + + + + + + wp_date( 'F jS, Y' ) + + + + + Sensei() + + + + + Sensei() + + + + + absint( $post->ID ) + + + add_notices + register_block + + + Sensei() + Sensei() + Sensei() + \Sensei() + + + + + ! isset( $value ) + + + + + Sensei() + + + + + $quiz_id + + + Sensei() + Sensei() + Sensei() + + + + + Sensei() + + + + + Sensei() + + + + + register_block + + + get_permalink( $course_id ) + + + $target + + + Sensei() + Sensei() + Sensei() + + + + + register_block + + + $course_id + $course_id + $course_id + + + + + null === $this->post_types + + + global $pagenow; + + + require_once ABSPATH . 'wp-admin/includes/post.php' + + + enqueue_block_assets + enqueue_block_editor_assets + initialize_blocks + maybe_initialize_blocks + + + get_post_type() + + + $post_type + $post_type + + + $post_types + + + Sensei() + Sensei() + + + + + $block_content + + + register_generic_assets + register_sensei_block + + + $post + + + is_string( $post ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + get_permalink() + + + $lesson->ID + + + Sensei() + Sensei() + + + + + $course_id + + + $course_id + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $course_id + + + $course_id + $course_id + get_permalink( absint( $target_post_id ?? $course_id ) ) + + + $target_post_id + + + Sensei() + + + + + enqueue_block_assets + enqueue_block_editor_assets + initialize_blocks + + + $post_type_object + + + $contact_teacher + $outline + $progress + $take_course + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + register_block + + + $terms + + + Sensei() + + + + + add_block_attributes + clear_block_content + get_block_structure + register_blocks + + + null + + + $block_content + + + Sensei() + Sensei() + Sensei() + + + + + $block + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + get_permalink( $lesson_id ) + + + Sensei() + Sensei() + + + + + $block + + + function( $block ) use ( $course_id ) { + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + get_permalink( absint( $course_id ) ) + + + Sensei() + + + + + register_block + + + $course_id + + + Sensei() + Sensei() + Sensei() + + + + + clear_block_content + register_block + render_lesson + + + get_permalink( $item['id'] ) + + + null + + + $block_content + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + register_block + + + Sensei() + + + + + enqueue_block_assets + enqueue_block_editor_assets + initialize_blocks + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + null + null + + + $attributes['options']['progressBarBorderRadius'] ?? null + $attributes['options']['progressBarHeight'] ?? null + + + Sensei() + + + + + admin_enqueue_scripts + register_block + + + get_post_type_archive_link( 'sensei_message' ) + + + Sensei() + Sensei() + + + + + $lesson->ID + + + Sensei() + Sensei() + + + + + enqueue_block_assets + enqueue_block_editor_assets + initialize_blocks + remove_block_related_content + + + $post_type_object + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + get_the_ID() + get_the_ID() + + + $course_id + + + Sensei() + Sensei() + + + + + $lesson->ID + $lesson->ID + + + sensei_get_prev_next_lessons( $lesson->ID ) + + + + + $block_parent['blockName'] + + + enqueue_block_assets + enqueue_block_editor_assets + initialize_blocks + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + enqueue_block_assets + enqueue_block_editor_assets + initialize_blocks + + + $post_type_object + $post_type_object + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + get_permalink() + + + $lesson->ID + + + Sensei() + Sensei() + Sensei() + + + + + Sensei() + + + + + $parent_block + + + Sensei() + Sensei() + Sensei() + + + + + 'course-category' + + + $default_option + + + $category + + + $course_categories + + + + + register_block + + + Sensei() + Sensei() + + + + + $lesson + $lesson + $lesson + + + register_block + + + get_permalink( $lesson_id ) + get_permalink( $lesson_id ) + get_permalink( $quiz_id ) + + + $user_lesson_status->comment_approved + + + \Sensei_Utils::get_current_course() + + + $course_id + $is_enrolled + $user_id + + + isset( $user_lesson_status->comment_approved ) + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + Sensei() + Sensei() + + + + + Sensei() + \Sensei() + + + + + enqueue_block_assets + enqueue_block_editor_assets + initialize_blocks + + + + + Sensei() + + + + + get_the_permalink( $course_id ) + + + $course_id + + + Sensei() + + + + + Sensei() + + + + + get_permalink( $lesson_id ) + + + $lesson_id + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + \Sensei() + \Sensei() + sensei_get_prev_next_lessons( $lesson_id ) + + + + + Sensei() + \Sensei() + + + + + Sensei() + + + + + $classes + + + Sensei() + + + + + Sensei() + + + + + Sensei() + + + + + $label + + + $aria_label + + + Sensei() + \Sensei() + sensei_get_prev_next_lessons( $lesson_id ) + + + + + Sensei() + + + + + Sensei() + Sensei() + + + + + render_questions_loop + + + Sensei() + sensei_get_the_question_id() + sensei_get_the_question_id() + sensei_get_the_question_number() + sensei_quiz_has_questions() + sensei_setup_the_question() + sensei_the_question_class() + sensei_the_question_content() + + + + + Sensei() + Sensei() + \Sensei() + + + + + Sensei() + + + + + Sensei() + + + + + $args + $new_lesson + + + false + + + $args + + + array + + + $new_post + + + object + + + $course->ID + $course->ID + $course_id + $course_id + '50' + intval( $course->ID ) + + + private $course_order_page_slug; + private $lesson_order_page_slug; + + + $course_id + $group_id + $hook + $new_status + $object + $old_status + $order_string + $order_string + $post + $post_id + $settings + + + $course_order_page_slug + $lesson_order_page_slug + + + add_course_order + add_lesson_order + admin_styles_global + ajax_log_event + get_course_order + handle_order_courses + handle_order_lessons + install_pages + notify_if_admin_email_not_real_admin_user + output_cpt_block_editor_workaround + register_scripts + remove_trashed_course_from_course_order + render_settings + save_course_order + save_lesson_order + sensei_add_custom_menu_items + sensei_set_plugin_url + update_lesson_order_on_course + update_lesson_order_on_lesson + wp_nav_menu_item_sensei_links_meta_box + + + $new_post + null + + + $data + $data + $post + get_post( $old_quiz_id ) + + + $course->ID + $course->ID + $course->ID + $course->post_status + $course->post_title + $post->ID + $post->post_type + $post->post_type + + + $course_structure + $event_name + $post_id + $post_id + $post_type->cap->edit_posts + $screen + + + $post->post_type + $post->post_type + $post_type->cap + $post_type->labels + $screen->id + + + $_GET['post'] + $_REQUEST['event_name'] + + + ! is_wp_error( $new_post_id ) + ! is_wp_error( $post ) + $new_post + $new_post + $num_posts + $num_posts + is_null( $update_prerequisite_object ) + isset( $hook_suffix ) + isset( $post_type ) + isset( $terms ) + + + esc_html( sprintf( __( 'Please supply a %1$s ID.', 'sensei-lms' ) ), $post_type ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + + $lesson_grades->meta_sum + $lesson_grades->total + $lesson_status->comment_ID + $lesson_status->comment_approved + $lesson_status->comment_date + + + $data + + + data + + + $user_name + $user_name + + + $args + $args + $report + $text + + + extra_tablenav + get_row_data + output_top_filters + + + $search + $search + + + $course->post_title + + + $course->post_title + + + $course->post_title + + + $user_email + + + $total_lessons + $user_ids + Sensei_Analysis_Course_List_Table + Sensei_Analysis_Course_List_Table + Sensei_Analysis_Course_List_Table + Sensei_Analysis_Course_List_Table + WooThemes_Sensei_Analysis_Course_List_Table + WooThemes_Sensei_Analysis_Course_List_Table + WooThemes_Sensei_Analysis_Course_List_Table + WooThemes_Sensei_Analysis_Course_List_Table + WooThemes_Sensei_Analysis_Course_List_Table + WooThemes_Sensei_Analysis_Course_List_Table + + + (array) $learners_search->get_results() + (int) $course_id + (int) $user_id + + + data + + + + + + $data + + + data + + + $user_name + + + $args + $lesson_id + $report + $text + + + $course_id + $lesson_id + $page_slug + + + extra_tablenav + get_row_data + + + $search + $search + + + $lesson->post_title + + + $lesson->post_title + + + $lesson->post_title + + + Sensei_Analysis_Lesson_List_Table + Sensei_Analysis_Lesson_List_Table + Sensei_Analysis_Lesson_List_Table + Sensei_Analysis_Lesson_List_Table + WooThemes_Sensei_Analysis_Lesson_List_Table + WooThemes_Sensei_Analysis_Lesson_List_Table + WooThemes_Sensei_Analysis_Lesson_List_Table + WooThemes_Sensei_Analysis_Lesson_List_Table + + + (array) $learners_search->get_results() + + + data + + + + + + Sensei_Analysis_Overview_List_Table + + + wp_date( get_option( 'date_format' ), $date->getTimestamp(), $timezone ) + + + string + + + $last_activity->comment_date_gmt + $last_activity->comment_date_gmt + + + $data + + + data + + + $this->total_items + $this->total_items + $value + ceil( Sensei()->grading->get_courses_average_grade() ) + + + $args + $args + $report + $text + + + $page_slug + $type + + + add_last_activity_to_user_query + add_orderby_custom_field_to_non_user_query + add_orderby_custom_field_to_query + filter_users_by_last_activity + output_course_select_input + output_top_filters + + + wp_get_object_terms( $lessons, 'module', $default_args ) + + + Sensei_Analysis_Overview_List_Table + Sensei_Analysis_Overview_List_Table + Sensei_Analysis_Overview_List_Table + Sensei_Analysis_Overview_List_Table + WooThemes_Sensei_Analysis_Overview_List_Table + WooThemes_Sensei_Analysis_Overview_List_Table + WooThemes_Sensei_Analysis_Overview_List_Table + WooThemes_Sensei_Analysis_Overview_List_Table + + + 'lessons' + + + remove_filter( 'posts_orderby', array( $this, 'add_orderby_custom_field_to_non_user_query' ), 10, 2 ) + + + data + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + + $data + + + data + + + $args + $report + $text + $user_id + + + $page_slug + $user_id + + + extra_tablenav + get_row_data + + + $search + $search + + + $user->display_name + + + Sensei_Analysis_User_Profile_List_Table + Sensei_Analysis_User_Profile_List_Table + Sensei_Analysis_User_Profile_List_Table + Sensei_Analysis_User_Profile_List_Table + WooThemes_Sensei_Analysis_User_Profile_List_Table + WooThemes_Sensei_Analysis_User_Profile_List_Table + WooThemes_Sensei_Analysis_User_Profile_List_Table + WooThemes_Sensei_Analysis_User_Profile_List_Table + + + data + + + + + $user_id + + + $type + $user_name + $user_name + + + new $object_name( $data ) + new $object_name( $data, $optional_data ) + + + $sensei_analysis_object + + + $type + $which + + + add_custom_navigation + check_course_lesson + display_nav + display_report_page + display_reports_navigation + enqueue_scripts + + + Sensei_List_Table + + + get_post_type_object( 'course' )->cap->edit_post + get_post_type_object( 'lesson' )->cap->edit_post + + + get_post_type_object( 'course' )->cap + get_post_type_object( 'lesson' )->cap + + + undefined + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + call_wp + disable_frontend_styles + enqueue + enqueue_script + enqueue_style + override_script + preload_data + register + wp_compat + + + wp_json_encode( $preload_data ) + + + $script + $script + $script + + + $deps + $handle + + + Sensei() + Sensei() + + + + + autoload + initialize_class_file_map + + + + + null === self::$instance + + + + + load + register + + + WP_CLI + + + + + add_notice + + + + + $lesson_id + + + $lesson_id + + + modules_taxonomy + set_module + + + ! $module_id || empty( $module_id ) || ! $module_exists_in_course + $module_id || ! empty( $module_id ) + + + Sensei() + + + + + $course->post_title + + + $title + + + fire_sensei_message_hook + + + $course->post_name + $course->post_name + + + $course->post_name + $course->post_name + $course->post_title + + + $courses_url_base + WooThemes_Sensei_Course_Results + + + OBJECT + + + + + $args + $changed_args + $post_args + $post_args + + + is_wp_error( $update_result ) + + + $existing_module + + + $post_args + + + false|int + + + $existing_module + $lessons_query instanceof WP_Query ? $lessons_query->posts : [] + $structure + $validate + + + WP_Post[] + array|WP_Error + bool|WP_Error + false|array[] + + + $author + $course_name + $teacher_user_id + get_post( $this->course_id )->post_author + + + clear_lesson_associations + create_quiz + save_module_order + + + $lesson->ID + $term->term_id + + + $structure + + + $lesson + + + $existing_module->term_id + $lesson->ID + $lesson->ID + $lesson->post_status + $lesson->post_status + $lesson->post_title + $lesson->post_title + $lesson->post_type + $previous_term->term_id + $term->description + $term->name + $term->slug + $term->slug + $term->term_id + get_post( $this->course_id )->post_author + get_post( $this->course_id )->post_author + get_post( $this->course_id )->post_author + + + $item['id'] + $lesson->ID + $lesson->ID + + + $lesson->ID + $lesson->ID + $lesson->post_status + $lesson->post_title + $lesson->post_title + $term->description + $term->name + $term->slug + $term->term_id + get_post( $this->course_id )->post_author + get_post( $this->course_id )->post_author + get_post( $this->course_id )->post_author + + + (int) $existing_module->term_id + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + $create_result + $lesson + $modules + + + $term->description + $term->name + $term->slug + $term->slug + $term->term_id + + + new static( $course_id ) + + + + + $post_args + $user_course_status + 'WP_Post' + 'WP_Post' + 'WP_Post' + 'WP_Post' + 'WP_User' + + + get_archive_query_args + + + is_a( $course_id, 'WP_Post' ) + + + $course_quizzes + $url + + + $lesson_args + $lesson_args + $lesson_args + uasort( $lessons, [ $this, '_short_course_lessons_callback' ] ) + + + public static function course_archive_filters( $query ) { + public static function course_archive_sorting( $query ) { + + + String + + + global $post; + global $post; + global $wp_query; + global $wp_query; + + + WP_Query + int + + + object + + + 0 + 0 + 1 + 1 + + + $lesson_1->course_order + $lesson_2->course_order + + + true + update_post_meta( $post_id, $meta_key, $new_meta_value ) + + + array + int + string + + + $course->post_author + $course->post_author + $i + $i + $i + $i + $id + $progress_percentage + [ $width, $height ] + [ $width, $height ] + absint( $course_item->ID ) + absint( $post_item->ID ) + round( $progress_percentage ) + + + $allowed + $allowed + $allowed + $allowed + $meta_key + $meta_key + $meta_key + $meta_key + $post_id + $post_id + $post_id + $post_id + + + public $token; + + + $class + $classes + $course + $course_id + $course_id + $course_id + $course_id + $course_id + $excludes + $excludes + $message + $query + $query + $should_send + $user_id + $user_id + + + $token + + + add_author_support + add_course_access_permission_message + add_custom_navigation + add_legacy_course_hooks + add_showcase_courses_upsell + allow_course_archive_on_front_page + archive_page_content + can_access_course_content + course_archive_filters + course_archive_sorting + course_category_title + course_notification_meta_box_content + disable_log_course_update + display_courses_navigation + load_single_course_lessons_query + log_course_update + log_initial_publish_event + mark_updating_course_id + maybe_redirect_to_login_from_course_completion + output_course_enrolment_actions + prerequisite_complete_message + register_admin_scripts + remove_legacy_course_actions + save_course_notification_meta_box + set_up_meta_fields + setup_single_course_page + showcase_courses_screen + the_course_action_buttons + the_course_enrolment_actions + the_course_free_lesson_preview + the_course_lessons_title + the_course_meta + the_course_video + the_title + update_status_after_lesson_change + update_status_after_quiz_submission + + + null + null + null + + + $course_id + $course_video_embed + $settings_json + $settings_sidebar + get_permalink( $course_id ) + get_permalink( $course_prerequisite_id ) + get_permalink( absint( $course_item->ID ) ) + get_permalink( absint( $course_item->ID ) ) + get_permalink() + get_post_type_archive_link( 'sensei_message' ) + get_the_ID() + get_the_ID() + get_the_ID() + + + $category_output + $category_output + $category_output + $course + $course_id + $output + $progress_percentage + wp_get_post_terms( $course->ID, 'module' ) + wp_get_post_terms( $course_id, 'module' ) + + + $lesson + + + $course->ID + $course->ID + $course->post_author + $course->post_content + $course_item->ID + $course_item->ID + $course_item->post_author + $course_item->post_author + $course_item->post_excerpt + $course_item->post_excerpt + $course_item->post_title + $course_item->post_title + $lesson->ID + $post->ID + $post->post_content + $post->post_name + $post->post_type + $post_item->ID + $post_item->post_title + $sensei_settings_course_page->post_content + $taxonomy_raw_obj->labels + $user_info->display_name + $user_info->display_name + get_post( $course_id )->post_author + get_post( get_the_ID() )->post_excerpt + + + $course->ID + $course->ID + $course->ID + $course->ID + $course->ID + $course->ID + $post_type->cap->edit_post + $screen + $sensei_settings_course_page->post_content + get_edit_post_link( $post_item->ID ) + get_edit_post_link( absint( $course_prerequisite_id ) ) + get_post_type_object( 'course' )->cap->edit_post + + + $course->ID + $course->ID + $course->post_author + $course->post_content + $post_type->cap + $sensei_settings_course_page->post_content + $term->term_id + get_post( $course_id )->post_author + get_post( get_the_ID() )->post_excerpt + get_post_type_object( 'course' )->cap + + + $course_id_updating + $meta_fields + $my_courses_page + WooThemes_Sensei_Course + WooThemes_Sensei_Course + + + is_array( $this->meta_fields ) + isset( $query->query ) + isset( $this->meta_fields ) && is_array( $this->meta_fields ) + isset( $this->meta_fields ) && is_array( $this->meta_fields ) + + + isset( $this->meta_fields ) + + + Sensei_WC + Sensei_WC + + + type + type + + + 'course_single_lessons' + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + \Sensei() + \Sensei() + \Sensei() + sensei_start_course_form( $post->ID ) + + + $term->name + $term->term_id + + + $lesson->course_order + + + $term->term_id + + + + + + add_customizer_settings + enqueue_customizer_helper + output_custom_settings + output_customizer_helper + + + + + Installer::instance() + + + Installer::instance() + get_schema + get_tables + + + cleanup_all + cleanup_custom_post_types + cleanup_options + cleanup_pages + cleanup_post_meta + cleanup_roles_and_caps + cleanup_taxonomies + cleanup_transients + cleanup_user_meta + remove_all_sensei_caps + + + $item + + + $role + + + Sensei() + + + + + $row + + + function( $row ) use ( $last_activity_date_by_users ) { + + + OBJECT_K + + + $this->course_id + $this->filter_by_course_id + $this->filter_type + $this->lesson_id + $this->offset + $this->order_by + $this->order_type + $this->per_page + $this->search + $this->total_items + $this->total_items + + + $this->filter_type + $this->offset + $this->order_type + $this->per_page + + + + + add_assets_notice + add_future_php_version_notice + add_php_version_notice + show_php_notice + + + $screen->id + + + + + is_wp_error( $grade ) + + + $comment + $comment_id + $comment_id + $course_id + $course_id + $course_id + $email_template + $file + $grade + $learner_id + $learner_id + $learner_id + $lesson_id + $message + $message_id + $passmark + $quiz_id + $status + $status + $template + $user_id + $user_id + + + get_content + init + load_template + teacher_quiz_submitted + + + $_from_address + $_from_name + $emails + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + include $template + + + + + register_scripts + + + wp_json_encode( $this->get_feature_flags() ) + + + + + $creds + + + $sorted_menu_items[ $k ] + $sorted_menu_items[ $k ] + + + $course_id + $course_id + $id + $post_id + $title + + + lesson_tag_archive_description + lesson_tag_archive_filter + lesson_tags_display + maybe_redirect_to_next_lesson + redirect_to_course_completed_page + sensei_complete_course + sensei_complete_lesson + sensei_complete_lesson_button + sensei_course_archive_meta + sensei_course_archive_pagination + sensei_course_category_main_content + sensei_course_start + sensei_frontend_messages + sensei_lesson_meta + sensei_lesson_preview_title + sensei_lesson_preview_title_tag + sensei_lesson_preview_title_text + sensei_lesson_video + sensei_login_form + sensei_reset_lesson_button + + + $tags + + + $id + $id + $post_id + $post_id + $post_id + $post_id + get_permalink( $course_id ) + get_permalink( $lesson_course_id ) + get_permalink( $lesson_id ) + get_permalink( $post_id ) + get_permalink( $post_id ) + get_permalink( $post_id ) + get_permalink() + get_permalink() + get_the_ID() + wp_get_referer() + + + $category_output + $tag_link + $tags + $user_id + $user_id + $user_id + + + $tag->description + + + $tag->description + $tag->term_id + get_queried_object()->name + + + $data + $messages + WooThemes_Sensei_Frontend + WooThemes_Sensei_Frontend + + + $tags && count( $tags ) > 0 + isset( $post_item->ID ) + + + WP_DEBUG + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + sensei_get_prev_next_lessons( $lesson_id ) + + + $tag->description + $tag->term_id + get_queried_object()->name + + + $tag->term_id + + + + + + $title + + + $args + + + $course_id + $lesson_id + $page_slug + $user_id + $user_ids + $view + + + extra_tablenav + get_row_data + + + $search + + + Sensei_Grading_Main + Sensei_Grading_Main + Sensei_Grading_Main + Sensei_Grading_Main + WooThemes_Sensei_Grading_Main + WooThemes_Sensei_Grading_Main + WooThemes_Sensei_Grading_Main + WooThemes_Sensei_Grading_Main + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $count + $graded_count + $lesson_status_id + $quiz_grade + $quiz_grade + $quiz_grade_total + $this->quiz_id + $this->user_id + $user_question_grade + $user_quiz_grade_total + $user_quiz_grade_total + $user_quiz_grade_total + + + display + + + $answer_media_url + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + 0 + + + false + false + + + $grade + $grade + + + $lesson_metadata + + + $grade + $question_grade + + + int + string + + + $user_name + $user_name + absint( $course_id ) + absint( $lesson_id ) + + + $course_id + $file + $lesson_id + $question_id + $selected_course_id + $selected_lesson_id + $type + $user_answer + $user_id + $which + + + $file + $name + $page_slug + + + add_grading_notices + deprecated_get_lessons_dropdown + deprecated_get_redirect_url + get_redirect_url + grading_admin_menu + lessons_drop_down_html + sensei_grading_notices + + + wp_json_encode( $args ) + + + $clean_lesson_id + $clean_user_id + + + get_post_type_object( 'course' )->cap->edit_post + get_post_type_object( 'lesson' )->cap->edit_post + get_post_type_object( 'lesson' )->cap->edit_post + + + get_post_type_object( 'course' )->cap + get_post_type_object( 'lesson' )->cap + get_post_type_object( 'lesson' )->cap + + + is_array( $right_answer ) + + + absint( wp_unslash( $_POST[ 'question_' . $question_id . '_grade' ] ) ) + + + count( $lesson_metadata ) + count( $lesson_metadata ) + + + ARRAY_A + + + undefined + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + add_groups_landing_page_menu_item + display_student_groups_landing_page + wrapper_container + + + Sensei() + Sensei() + Sensei() + + + + + 'WP_Role' + + + + int + + + $user_count + + + create_guest_student_role_if_not_exists + create_guest_user_and_login_for_open_course + enrol_user + init + is_current_user_guest + log_guest_user_out_before_all_actions + log_in_guest_user_if_in_open_course + login_user + recreate_nonce + + + $course_id + + + $user->roles + + + Sensei_Utils::get_current_course() + + + (array) $user->roles + + + + + global $current_user; + + + $name + + + enqueue_scripts + + + Sensei() + Sensei() + Sensei() + + + + + ! self::$instance + empty( self::$learner_terms[ $user_id ] ) || self::$learner_terms[ $user_id ] instanceof WP_Error + empty( self::$learner_terms[ $user_id ] ) || self::$learner_terms[ $user_id ] instanceof WP_Error + self::$instance + self::$learner_terms[ $user_id ] instanceof WP_Error + + + self::$learner_terms + self::$learner_terms + + + $user_id + + + add_course_column_data + before_enrolled_courses_query + init + remove_duplicate_progress + + + $courses + + + $courses + + + $user->display_name + $user->first_name + $user->last_name + + + Sensei() + + + + + $post_type_args + $post_type_args + 'WP_Post' + 'WP_User' + + + ! isset( $lesson_id ) + ! isset( $question->ID ) + - 1 !== $new_course + -1 !== $new_complexity + + + empty( $block['innerBlocks'][0]['attrs']['id'] ) ? null : wp_get_attachment_url( get_post_thumbnail_id( $block['innerBlocks'][0]['attrs']['id'] ) ) + get_permalink( $quiz_id ) + + + $args + $post_args + $post_args + $post_type_args + $post_type_args + $qargs + 'question-category' + + + string|null + + + global $wp_query; + + + string + + + $lesson_prerequisite + $quiz_id + + + int|null + + + $course_id + $i + $i + $id + $pre_requisite_id + $question_id + $question_id + $question_id + $question_id + $quiz_author + $quiz_id + $quiz_id + $quiz_id + $return + $return + $this->get_course_id( $post->ID ) + $total_right + $total_wrong + absint( $post_item->ID ) + array( $width, $height ) + + + $lesson + + + $column_name + $content + $context + $context + $context + $course_id + $current_lesson_id + $field + $hook + $hook + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $multiple_data + $page + $post_id + $post_id + $question_category + $question_counter + $question_counter + $question_counter + $question_id + $question_id + $question_id + $question_id + $question_search + $question_status + $question_type + $question_type + $question_type + $question_type + $questions + $quiz_id + $quiz_id + $quiz_id + $row + $user_id + $widget + + + $allowed_html + $meta_fields + $token + + + add_column_data + add_custom_link_to_course + add_custom_navigation + add_lesson_to_course_order + add_video_meta_box + all_lessons_edit_fields + content_drip_promo_meta_box_content + course_signup_link + deprecated_get_question_category_limit + deprecated_question_get_answer_id + disable_log_lesson_update + display_lessons_navigation + enqueue_lesson_edit_scripts + enqueue_scripts + enqueue_scripts_meta_box_quiz_editor + enqueue_styles + footer_quiz_call_to_action + get_question_category_limit + get_quiz_settings + handle_get_prerequisite_meta_box_content + lesson_add_existing_questions + lesson_add_multiple_questions + lesson_course_meta_box_content + lesson_info_meta_box_content + lesson_prerequisite_meta_box_content + lesson_preview_meta_box_content + lesson_quiz_meta_box_content + lesson_quiz_settings_meta_box_content + lesson_remove_multiple_questions + lesson_update_grade_type + lesson_update_question + lesson_update_question_order + lesson_update_question_order_random + lesson_video_meta_box_content + log_initial_publish_event + log_lesson_update + mark_updating_lesson_id + maybe_start_lesson + meta_box_setup + on_lesson_published + output_comments + output_prerequisite_meta_box_content + prerequisite_complete_message + question_get_answer_id + quiz_panel + quiz_panel_add + quiz_panel_add_existing_question + quiz_panel_filter_existing_questions + quiz_panel_get_existing_questions + quiz_panel_question + quiz_panel_question_feedback + quiz_panel_question_field + quiz_panel_questions + quiz_settings_panel + save_all_lessons_edit_fields + save_lesson_featured_video_thumbnail + save_post_meta + save_quiz_settings + set_default_question_order + set_quick_edit_admin_defaults + the_archive_header + the_lesson_image + the_lesson_meta + the_lesson_thumbnail + the_title + user_lesson_quiz_status_message + user_not_taking_course_message + + + $this->get_videopress_thumbnail( $url ) + $this->get_vimeo_thumbnail( $url ) + $this->get_youtube_thumbnail( $url ) + + + $question_cats + $question_cats + $question_cats + + + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + get_permalink( $lesson_id ) + get_permalink( $lesson_id ) + get_permalink( $lesson_prerequisite ) + get_permalink( $quiz_id ) + get_post_thumbnail_id( $block['innerBlocks'][0]['attrs']['id'] ) + get_post_type( $post_id ) + get_the_ID() + get_the_ID() + get_the_ID() + get_the_ID() + get_the_ID() + + + $lesson + $lesson_prerequisite_post + get_post( get_the_ID() ) + get_the_term_list( $question_id, 'question-category', '', ', ', '' ) + + + $question_cats + $question_cats + $question_cats + + + $attachment->post_title + $cat->count + $cat->count + $cat->name + $cat_question->ID + $lesson->ID + $lesson->post_content + $lesson->post_status + $lesson->post_title + $post->post_content + $post->post_content + $question->ID + $question->ID + $question->post_content + $question->post_title + $question->post_title + $question_cat->name + $user_info->display_name + get_post( $quiz_id )->post_author + get_post()->post_author + get_post()->post_author + + + $cat->name + $edit_course_url + $lesson->post_status + $lesson->post_title + $post->post_content + $post_type->cap->edit_post + $question->post_content + $question->post_title + $question->post_title + get_edit_post_link( absint( $lesson_course_id ) ) + get_edit_post_link( absint( $lesson_prerequisite_id ) ) + get_post_type_object( 'course' )->cap->edit_post + get_post_type_object( 'lesson' )->cap->edit_post + get_post_type_object( 'question' )->cap->edit_post + get_post_type_object( 'question' )->cap->edit_post + get_post_type_object( 'question' )->cap->edit_post + + + $attachment->post_title + $cat->name + $lesson->post_status + $lesson->post_title + $post->post_content + $post_type->cap + $question->post_content + $question->post_title + $question->post_title + $question_cat->name + $screen->base + get_post( $quiz_id )->post_author + get_post()->post_author + get_post()->post_author + get_post_type_object( 'course' )->cap + get_post_type_object( 'lesson' )->cap + get_post_type_object( 'question' )->cap + get_post_type_object( 'question' )->cap + get_post_type_object( 'question' )->cap + + + is_block_editor + + + $nonce + $nonce + $nonce + $nonce + $question_grade + $question_grade + $question_grade + $question_media + $question_media_add_button + $question_media_delete_class + $question_media_link + $question_media_link_class + $question_media_thumb + $question_media_thumb_class + $question_wrong_answers_array + $random_order + + + $lesson_id_updating + + + is_array( $question_data ) + is_array( $question_data ) + + + ! is_wp_error( $multiple_id ) + - 1 !== $new_course + -1 !== $new_complexity + is_array( $data ) && count( $data ) > 0 + + + ! isset( $row_counter ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + sensei_complete_lesson_button() + sensei_reset_lesson_button() + + + $cat->name + $question_cat->name + + + $this->question_order + $this->question_order + $this->question_order + $this->question_order + + + + + $which + $which + + + array + + + $item + $token + + + $token + + + extra_tablenav + get_row_data + single_row + + + $item + + + false + + + Sensei_List_Table + Sensei_List_Table + Sensei_List_Table + Sensei_List_Table + WooThemes_Sensei_List_Table + WooThemes_Sensei_List_Table + WooThemes_Sensei_List_Table + WooThemes_Sensei_List_Table + + + isset( $this->_column_headers ) + + + + + $message_data + + + is_wp_error( $post ) + + + public function message_login() { + public function stop_wp_comment_emails( $emails, $comment_id ) { + + + global $current_user; + + + string + + + string + + + $comment->comment_ID + $comment->comment_post_ID + $comment->comment_post_ID + $comment->user_id + $comment->user_id + $post->ID + $post->post_author + $post_id + absint( $post->ID ) + + + $comment_id + $message_post_id + $message_post_id + $post + $post + $post_id + $post_type + $query + $user_id + + + $meta_fields + $post_type + $token + + + add_menu_item + add_meta_box + check_permissions_edit_comments + message_login + message_reply_received + message_rest_insert + meta_box_content + only_show_messages_to_owner + save_new_message + send_message_link + stop_wp_comment_emails + teacher_contact_form + the_message_sender + the_message_sent_by_title + the_message_title + the_my_messages_link + + + get_permalink( $content_post_id ) + get_post_type_archive_link( 'sensei_message' ) + get_the_ID() + get_the_date() + get_the_date() + get_the_permalink( $message_post_id ) + + + $comment->comment_post_ID + $comment->comment_post_ID + $comment->user_id + $comment_author->user_login + $comment_author->user_login + $course->post_title + $message->ID + $message->ID + $message->post_type + $message->post_type + $message_post->ID + $message_post->post_type + $post->ID + $post->ID + $post->post_author + $post->post_type + $receiver->user_login + $sender->display_name + $sender->user_login + + + $message->ID + $message->ID + $message->ID + $message->ID + $post_id + + + $course->post_title + $message->ID + $message->ID + $message->post_type + $message->post_type + $post->ID + $post->ID + $post->post_author + $post->post_type + + + $description + $label + $user_login + + + ! is_wp_error( $message_id ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $module + $module + 'Sensei_Frontend' + 'Sensei_Utils' + 'WP_User' + + + is_wp_error( $lessons ) + + + $term_owner + $term_owner + false + false + false + false + + + $args + + + WP_User + object + + + global $current_user; + + + $index + $index + + + (float) $module_progress + array() + + + WP_Query + integer + + + $course->post_author + $course_id + $course_id + $course_id + $possible_user_id + $post_after->post_author + $term + $term + absint( $module->term_id ) + esc_attr( $_POST['course_id'] ) + intval( $course->ID ) + + + $args + $args + $classes + $course_id + $course_ids_array + $file + $hook + $html + $lesson_id + $separator + $slug + $taxonomies + $taxonomies + $taxonomies + $term_id + $terms + $terms + $terms + $terms + $title + $user_id + + + $file + $order_page_slug + $taxonomy + + + add_custom_navigation + add_lesson_column_content + add_module_admin_hooks + add_new_module_term + add_submenus + add_teacher_id_in_module_meta_when_added_to_course + ajax_get_course_modules + append_teacher_name_to_module + course_module_metabox + course_signup_link + display_modules_navigation + filter_course_selected_terms + filter_module_terms + handle_get_lesson_module_metabox + handle_order_modules + module_archive_body_class + module_breadcrumb_link + output_course_modules_column + output_lesson_module_metabox + remove_default_modules_box + remove_if_unused + remove_teacher_id_from_module_meta_when_removed_from_course + reset_none_modules_transient + sensei_course_preview_titles + setup_modules_taxonomy + setup_single_course_module_loop + teardown_single_course_module_loop + track_module_creation + update_module_teacher_id_meta_on_post_teacher_update + update_module_teacher_meta + + + $modules + $modules + $terms + + + get_permalink( $course_id ) + get_permalink( $course_id ) + + + $module + $post + get_post( (int) $_GET['lesson_id'] ) + + + $terms + + + $course->ID + $course->ID + $course->ID + $course->post_author + $course->post_title + $course->post_title + $module->parent + $module->slug + $post->post_type + $slug->errors + $taxonomy->cap + $taxonomy->labels + $term->slug + $term->term_id + $term->term_id + get_post( $post_ID )->post_type + + + $module->description + $module->slug + $module->term_id + $module_id + $post->post_type + $post_type->cap->edit_post + + + $course->post_author + $module->description + $module->parent + $module->slug + $module->term_id + $module->term_id + $module->term_id + $post->post_type + $post_type->cap + $term->slug + get_post( $post_ID )->post_type + get_queried_object()->name + + + (int) $module_id + + + 'tax_input[' . $tax_name . ']' + isset( $course_id ) + + + ! empty( $course_modules ) && is_array( $course_modules ) + ! empty( $site_admins ) && is_array( $site_admins ) + ! user_can( $author, 'manage_options' ) && isset( $term->name ) + $module + $module + $module + $module + is_array( $columns ) + is_array( $course_modules ) + is_array( $courses ) + is_array( $courses ) + is_array( $site_admins ) + isset( $courses ) + isset( $courses ) + isset( $courses ) && is_array( $courses ) + isset( $courses ) && is_array( $courses ) + isset( $lesson_query->posts ) + + + $tax_name === 'category' + $tax_name === 'category' + empty( $modules ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + sensei_module_has_lessons() + + + $module->description + $module->term_id + $module->term_id + $module->term_id + get_queried_object()->name + + + $modules + $slug + + + $module->parent + $module->slug + $module->term_id + $module->term_id + $module->term_id + $term->slug + + + + + protected $notices; + + + $notices + + + setup_block_notices + + + Sensei() + + + + + 'WP_Post' + + + $args + $args + $args + $args + + + global $pagenow; + + + $post->ID + $post->ID + $post->ID + $post_id + $post_id + + + new $class_name() + + + $role_caps + $slider_labels + $token + + + add_submenus + disable_fire_scheduled_initial_publish_actions + fire_scheduled_initial_publish_actions + is_meta_box_save_request + mark_post_already_published + maybe_schedule_initial_publish_action + protect_feeds + reset_scheduled_initial_publish_actions + schedule_initial_publish_action + setup_initial_publish_action + setup_learner_taxonomy + setup_post_type_labels_base + setup_rest_api + + + get_permalink( $post_ID ) + get_permalink( $post_ID ) + get_permalink( $post_ID ) + wp_post_revision_title( (int) $_GET['revision'], false ) + + + $post->ID + $post->post_type + + + get_queried_object()->ID + + + $object_type->labels + get_queried_object()->ID + get_queried_object()->post_type + + + $course + $lesson + $messages + $question + $quiz + WooThemes_Sensei_PostTypes + WooThemes_Sensei_PostTypes + WooThemes_Sensei_PostTypes + WooThemes_Sensei_PostTypes + WooThemes_Sensei_PostTypes + + + $post instanceof WP_Post + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + get_queried_object()->ID + get_queried_object()->post_type + + + get_queried_object()->ID + get_queried_object()->post_type + + + $this->labels + $this->labels + $this->labels + $this->labels + $this->labels + $this->labels + $this->labels + $this->labels + + + $this->labels + $this->labels + $this->labels + $this->labels + $this->labels + $this->labels + + + + + 'WP_Role' + 'WP_User' + + + + int + + + add_preview_user_filters + add_user_switch_to_admin_bar + create_role + delete_preview_user + init + override_user + set_preview_user + switch_off_preview_user + switch_to_preview_user + + + (array) $user->roles + (int) $course_id + + + + + self::output_result_indication( $lesson_id, $question_item->ID ) + + + false + false + + + $qargs + 'question-category' + array( 'src' => $question_media_url ) + array( 'src' => $question_media_url ) + + + public static function file_upload_load_question_data( $question_data, $question_id, $quiz_id ) { + public static function gap_fill_load_question_data( $question_data, $question_id, $quiz_id ) { + public static function multiple_choice_load_question_data( $question_data, $question_id, $quiz_id ) { + + + $attachment_src[1] + $attachment_src[2] + $id + $question_id + $question_id + $question_id + $question_id + + + $post + $post_id + $post_type + $question_data + $question_data + $question_id + $question_id + $question_id + $question_id + $question_id + $question_id + $question_id + $question_id + $question_id + $question_id + $quiz_id + $quiz_id + $quiz_id + + + $meta_fields + $token + + + add_custom_navigation + answer_feedback_notes + display_question_navigation + file_upload_load_question_data + gap_fill_load_question_data + load_question_template + log_initial_publish_event + multiple_choice_load_question_data + output_result_indication + question_edit_panel + question_edit_panel_metabox + question_lessons_panel + question_types + save_question + the_answer_feedback + the_answer_result_indication + the_question_description + the_question_hidden_fields + the_question_media + the_question_title + + + $categories_of_question + $cats + $question_types + + + $answer_media_url + $question_media_url + $question_media_url + $question_media_url + $quiz_id + size_format( $upload_size ) + + + $cat_question_id + get_the_term_list( $id, 'question-category', '', ', ', '' ) + get_the_term_list( $id, 'question-type', '', ', ', '' ) + + + $attachment_src[0] + $attachment_src[1] + $attachment_src[2] + + + $lessons[ $lesson_id ] + $lessons[ $lesson_id ] + + + $cats + + + $attachment->post_content + $attachment->post_title + $question->ID + $question->post_content + $question->post_type + $quiz->post_author + $quiz->post_type + $user_lesson_status->comment_approved + $user_lesson_status->comment_approved + get_post( $question_id )->post_content + + + $question_description + $question_description + $question_media_title + $question_media_title + + + $attachment->post_content + $attachment->post_title + $question->post_content + get_post( $question_id )->post_content + + + $is_quiz_graded + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + $this->question_types + + + $this->question_types + $this->question_types + + + + + $my_post + + + $this->file + + + ! $encoded_feedback + ! $encoded_feedback + ! is_array( $all_feedback ) + ! is_array( $quiz_answers ) + ! is_array( $quiz_answers ) + ! is_array( $unprepared_answers ) + ! is_array( $users_answers ) + empty( $lesson_id ) || empty( $user_id ) || ! is_array( $quiz_answers ) + is_array( $lesson_status ) + is_int( $user_grade ) + isset( $user_lesson_status->comment_ID ) + + + public function reset_button_click_listener() { + + + global $post; + + + array + array + + + $comment->comment_content + $question_activity->comment_ID + $question_activity->comment_ID + + + $posts + true + + + false|int + + + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_id + $lesson_status->comment_ID + $this->get_lesson_id( $quiz_id ) + $this->get_lesson_id( $quiz_id ) + + + $answers_feedback + $lesson_id + $lesson_id + $quiz_grades + $user_id + $user_id + + + action_buttons + delete_quiz_question_meta + load_global_quiz_data + maybe_delete_quiz + output_quiz_hidden_fields + page_change_listener + redirect_if_lesson_is_protected + reset_button_click_listener + set_questions + start_quiz_questions_loop + stop_quiz_questions_loop + the_quiz_pagination + the_quiz_progress_bar + the_title + the_user_status_message + update_quiz_author + user_save_quiz_answers_listener + + + self::get_question_inner_block( $question_id, 'sensei-lms/quiz-question-feedback-correct' ) + self::get_question_inner_block( $question_id, 'sensei-lms/quiz-question-feedback-incorrect' ) + + + + $quiz_id + $quiz_id + $quiz_id + $quiz_id + $quiz_id + $quiz_id + $quiz_id + get_permalink( $lesson->ID ) + get_permalink( $lesson_id ) + get_the_ID() + + + $quiz + get_post() + + + $lesson->ID + $lesson->post_author + $lesson->post_name + $question->post_content + $quiz->post_parent + $saved_lesson->post_author + $saved_lesson->post_name + $saved_lesson->post_title + $user_lesson_status->comment_ID + + + $lesson->ID + $lesson_id + $question->post_content + + + $lesson->ID + $lesson->post_name + $question->post_content + $saved_lesson->post_author + $saved_lesson->post_name + $saved_lesson->post_title + + + (int) $user_id + + + ! is_wp_error( $grade ) + $lesson_status + + + DAY_IN_SECONDS + DAY_IN_SECONDS + DAY_IN_SECONDS + DAY_IN_SECONDS + DAY_IN_SECONDS + DAY_IN_SECONDS + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + $this->data + + + + + isset( $input ) + + + protected function determine_method( $data, $type = 'form' ) { + + + $input + (bool) $input + 0 + + + string + string + + + $section + $type + + + $errors + $fields + $has_imageselector + $has_range + $has_tabs + $menu_label + $name + $page_slug + $sections + $settings + $settings_version + $tabs + $this->fields + $this->token + $this->token_legacy + $token + $token_legacy + + + determine_method + form_field_button + register_hook_listener + render_additional_section_elements + render_content_drip_settings + render_promo_banner + render_woocommerce_upgrade_settings + + + $input[ $k ] + + + $v + $v + + + $is_valid + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + $this->hook + $this->remaining_fields + $this->remaining_fields + + + $this->remaining_fields + + + + + ! is_array( $new_value ) + ! is_array( $old_value ) + + + 'type' => 'email' + + + + $include_milliseconds + $new_value + $setting + + + flush_rewrite_rules + get_learning_mode_template_options + log_settings_update + mark_section_as_visited + render_learning_mode_setting + render_learning_mode_templates + set + + + wp_json_encode( $inline_data ) + + + $new_field_value + $old_field_value + + + $template->title + $title + + + get_current_screen()->id + + + empty( $template->title ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + \Sensei() + \Sensei() + + + $this->hook + + + + + $args + $user + 'WP_Role' + 'WP_Role' + 'WP_Role' + + + ! $term_author + ! $term_author + ! is_admin() || ! $this->is_admin_teacher() || is_numeric( $comments ) + ! is_array( $args ) + ! is_array( $comments ) + is_numeric( $comments ) + + + $post_updates + + + $course_id + $lesson_id + + + bool + + + $activity_comments->user_id + + + $course->post_author + $module_course->post_author + + + public function teacher_filter_query_modify( $query ) { + + + $clauses + $column + $columns + $course_id + $course_id + $course_id + $data + $new_status + $new_teacher_id + $old_status + $post + $post + $post + $postarr + $query + $query + $query + $query + $questions + $quiz_id + $teacher_id + $wp_query + $wp_query + + + $teacher_role + $token + + + add_capabilities + archive_title + course_column_data + filter_queries + remove_course_meta_on_teacher_archive + teacher_filter_query_modify + teacher_meta_box_content + update_lesson_teacher + + + empty( $lesson_id ) || ! $lesson_id + + + $author->display_name + $course->post_author + $course->post_author + $course->post_author + $course->post_author + $course->post_title + $existing_module_by_slug->term_id + $lesson->ID + $module_course->ID + $module_course->post_author + $module_course->post_title + $post->ID + $post->post_author + $term->slug + $user->ID + $user->roles + + + $course->post_author + $term->slug + + + $course->post_author + $course->post_author + $course->post_author + $course->post_author + $course->post_title + $lesson->ID + $post->ID + $post->post_author + $screen->id + $term->slug + + + (array) $user->roles + (int) $new_author + + + ! is_wp_error( $search_term ) + isset( $screen->id ) + + + ! $course_id + ! $course_id + ! $lesson_id + empty( $this->teacher_role ) + + + ARRAY_A + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + $new_term + + + $term->slug + + + + + is_numeric( $post ) + + + $template_name + $template_name + + + fire_frontend_messages_hook + fire_sensei_complete_course_hook + get_no_permission_template + get_template + locate_and_load_template_overrides + the_title + + + get_permalink( $post->ID ) + + + $post->ID + $post->post_title + $post->post_type + + + $post->ID + + + $post->ID + $post->post_title + $post->post_type + + + $args && is_array( $args ) + is_array( $args ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + get_sensei_footer() + get_sensei_header() + + + include $found_template + include $found_template + include $located + + + + + 'WP_Comment' + + + ! self::$instance + is_a( $last_week_activities, 'WP_Comment' ) + self::$instance + + + clean_inactive_guest_users + init + maybe_schedule_cron_jobs + + + remove_filter( 'sensei_check_for_activity', [ Sensei_Temporary_User::class, 'filter_sensei_activity' ], 10, 2 ) + + + + + ! is_array( $comments ) + + + require_once ABSPATH . '/wp-admin/includes/ms.php' + require_once ABSPATH . 'wp-admin/includes/user.php' + + + filter_learners_query + filter_out_temporary_user_role_tabs + filter_out_temporary_user_roles + filter_out_temporary_users + init + + + get_userdata( $user_id )->roles + + + (array) $emails + + + + + new Sensei_Unsupported_Themes() + + + get_instance + init + maybe_handle_request + reset + + + + + is_object( $current_version ) + + + new Email_Seeder( new Email_Seeder_Data(), $repository ) + new Email_Seeder_Data() + + + create_all + has_emails + init + new Email_Seeder( new Email_Seeder_Data(), $repository ) + + + $releases + + + DateTimeImmutable[] + + + assign_role_caps + log_update + run_updates + v3_0_check_legacy_enrolment + v3_7_add_comment_indexes + v3_7_check_rewrite_front + v3_9_fix_question_author + v3_9_remove_abandoned_multiple_question + v4_10_update_install_time + + + $this->current_version + $this->current_version + $this->current_version + $this->current_version + + + (int) $diff->d + + + false !== $diff->d + + + null + + + ARRAY_A + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + 0 + + + $key + 'module' + 'module' + 'module' + + + $count[ $key ] + $count[ self::get_question_type_key( $key ) ] + + + [ 'Sensei_learner', 'get_learner_id' ] + + + $max_modules + $min_modules + $query->found_posts + $query->found_posts + $query->found_posts + $query->found_posts + '' + str_replace( '-', '_', 'question_' . $key ) + wp_get_object_terms( $course_id, Sensei_PostTypes::LEARNER_TAXONOMY_NAME, $term_args ) + + + array + array + array + array + array + array|WP_Error + double + int + int + + + $learner_terms + $learner_terms + + + $course->ID + + + is_array( $courses ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + \Sensei() + + + + + $fields + $fields + + + get_instance + init_event_logging_sources + log_update + log_wccom_plugin_install + set_event_logging_source_data_import + set_event_logging_source_frontend + set_tracking_enabled + + + false + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $data + 'WP_Comment' + 'WP_Post' + 'WP_Post' + + + ! is_array( $array_a ) + ! is_array( $array_b ) + ! is_int( $post_id ) + ! is_int( $post_id ) + is_array( $user_lesson_status ) + + + $activity_value + $question_grade + false + wp_date( get_option( 'date_format' ), $date->getTimestamp(), $timezone ) + + + Course_Progress::STATUS_COMPLETE + + + string + + + bool + + + $last_lesson_activity->comment_post_ID + + + $activity_logged + $activity_logged + $success + + + bool + boolean + boolean + + + $comment_id + $comment_id + $data_key + $lesson + $lesson_status->comment_ID + $post_id + $user_answer_id + $user_answer_id + $user_answer_id + $user_id + $user_id + $user_id + $user_lesson_id + $user_lesson_status->comment_ID + + + require_once ABSPATH . 'wp-admin/includes/admin.php' + require_once ABSPATH . 'wp-admin/includes/image.php' + require_once ABSPATH . 'wp-admin/includes/plugin-install.php' + + + $attributes + $course_id + $data_key + $decimal_places_to_round + $decimal_places_to_round + $denominator + $denominator + $file + $from_course + $key + $lesson_id + $mode + $number + $numerator + $numerator + $options + $plugin_class_to_look_for + $plugin_registered_path + $post_id + $question_id + $quiz_id + $quiz_id + $quiz_id + $setting_name + $trigger_completion_action + $user_id + $user_id + $user_id + + + as_absolute_rounded_number + force_complete_user_course + is_plugin_present_and_activated + is_preview_lesson + output_query_params_as_inputs + quotient_as_absolute_rounded_number + restore_wp_query + sensei_delete_question_grade + sensei_get_quiz_questions + sensei_get_quiz_total + sensei_user_course_status_message + upload_file + user_passed_quiz + + + $attributes + + + $url + get_permalink( $course_id ) + get_permalink( $course_id ) + get_permalink( $lesson_prerequisite ) + get_permalink( $quiz_id ) + get_permalink( $quiz_id ) + + + $post + + + $_user_lesson_status->comment_approved + $lesson_status->comment_ID + $plugin_information->name + $plugin_information->short_description + $plugin_information->version + $post->ID + $post->post_content + $user_lesson_status->comment_approved + get_userdata( $user_id )->user_login + get_userdata( $user_id )->user_login + + + (int) $lesson_id + (int) $user_id + + + is_array( $comments ) + isset( $_GET ) + + + isset( $_user_lesson_status->comment_approved ) + isset( $user_lesson_status->comment_approved ) + + + '' != $sort_key + + + WC_Admin_Addons + + + ATOMIC_CLIENT_ID + DAY_IN_SECONDS + WP_PLUGIN_DIR + + + int|number + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + WC() + sensei_get_prev_next_lessons( $lesson_id ) + + + + + $default + + + 'brackets' === $format + 'full' === $format + 'none' === $format + 'text' === $format + + + Sensei() + Sensei() + + + + + $allowed_html + $string + + + $allowed_html + + + get_default_wp_kses_allowed_html + get_source_html_tag_allowed_attributes + get_video_html_tag_allowed_attributes + + + Sensei() + + + + + course_exists + register_plugin_version + + + empty( $comment_counts ) + is_null( self::$_instance ) + + + Email_Customization::instance( $this->settings, $this->assets, $this->lesson_progress_repository ) + new Answer_Repository_Factory( $use_tables ) + new Course_Deleted_Handler( $this->course_progress_repository ) + new Course_Progress_Repository_Factory( $use_tables ) + new Grade_Repository_Factory( $use_tables ) + new Lesson_Deleted_Handler( $this->lesson_progress_repository ) + new Lesson_Progress_Repository_Factory( $use_tables ) + new Quiz_Deleted_Handler( $this->quiz_progress_repository ) + new Quiz_Progress_Repository_Factory( $use_tables ) + new Submission_Repository_Factory( $use_tables ) + new Updates_Factory() + + + Email_Customization::instance( $this->settings, $this->assets, $this->lesson_progress_repository ) + create + create + create + create + create + create + create + init + init + init + init + new Answer_Repository_Factory( $use_tables ) + new Course_Deleted_Handler( $this->course_progress_repository ) + new Course_Progress_Repository_Factory( $use_tables ) + new Grade_Repository_Factory( $use_tables ) + new Lesson_Deleted_Handler( $this->lesson_progress_repository ) + new Lesson_Progress_Repository_Factory( $use_tables ) + new Quiz_Deleted_Handler( $this->quiz_progress_repository ) + new Quiz_Progress_Repository_Factory( $use_tables ) + new Submission_Repository_Factory( $use_tables ) + + + $this->get_id() + $this->get_id() + + + $course_archive_thumbnail['crop'] + $course_archive_thumbnail['height'] + $course_archive_thumbnail['width'] + $course_single_thumbnail['crop'] + $course_single_thumbnail['height'] + $course_single_thumbnail['width'] + $lesson_archive_thumbnail['crop'] + $lesson_archive_thumbnail['height'] + $lesson_archive_thumbnail['width'] + $lesson_single_thumbnail['crop'] + $lesson_single_thumbnail['height'] + $lesson_single_thumbnail['width'] + + + $file + + + global $sensei_modules; + + + $is_upgrade + + + private $id; + + + $args + $args + $class_name + $main_plugin_file_name + $plugin + + + $id + $plugin_path + $plugin_url + $template_url + $this->plugin_path + $this->plugin_path + $this->plugin_url + $this->post_types->role_caps + $this->settings->settings + $this->version + $token + $version + + + activate + activation + activation_flush_rules + assign_role_caps + disable_sensei_modules_extension + flush_comment_counts_cache + flush_rewrite_rules + init + initialize_cache_groups + initialize_cli + initialize_global_objects + initiate_rewrite_rules_flush + jetpack_latex_support + load_hooks + load_modules_class + maybe_add_latex_support_via + sensei_load_template_functions + set_legacy_flag + update + wp_quicklatex_support + + + null + + + $admin + $admin_notices + $analysis + $assets + $blocks + $course + $course_progress_repository + $course_results + $emails + $enrolment_scheduler + $feature_flags + $frontend + $grading + $learner_profiles + $learners + $lesson + $lesson_progress_repository + $messages + $modules + $notices + $permissions_message + $post_types + $question + $quiz + $quiz_answer_repository + $quiz_grade_repository + $quiz_progress_repository + $quiz_submission_repository + $rest_api_internal + $settings + $setup_wizard + $shortcode_loader + $teacher + $theme_integration_loader + $updates + $usage_tracking + $view_helper + Woothemes_Sensei + Woothemes_Sensei + Woothemes_Sensei + Woothemes_Sensei + Woothemes_Sensei + + + (bool) $default + (bool) $value + (int) $post_id + (int) $post_id + + + 'Sensei_Modules' !== $class + + + init + + + ARRAY_A + SENSEI_LMS_PLUGIN_FILE + WP_LANG_DIR + + + Sensei() + Sensei() + Sensei() + Sensei() + + + $this->Sensei_WPML + + + require_once $this->plugin_path . 'widgets/class-sensei-' . $key . '-widget.php' + require_once $this->resolve_path( 'includes/3rd-party/3rd-party.php' ) + require_once $this->resolve_path( 'includes/class-sensei-cli.php' ) + require_once $this->resolve_path( 'includes/hooks/template.php' ) + require_once $this->resolve_path( 'includes/template-functions.php' ) + require_once dirname( __FILE__ ) . '/class-' . esc_attr( $this->token ) . '-' . esc_attr( $class_name ) . '.php' + + + + + $now - $this->timer_start + + + $timer_start + + + log + start_timer + + + $course_id + $course_id + $user_id + $user_id + + + $user_id + $user_id + + + WP_CLI + WP_CLI + + + Sensei() + + + + + 'ET_GB_Block_Layout' + + + ! self::$instance + self::$instance + + + the_course_theme_layout + + + ET_GB_Block_Layout + + + + + ! $theme + ! self::$instance + $theme + self::$instance + + + WP_Post? + + + $post + + + add_admin_menu_site_editor_item + add_editor_styles + add_site_editor_hooks + enqueue_site_editor_assets + init + is_site_editor_request + maybe_add_site_editor_hooks + maybe_override_lesson_theme + substitute_theme_cache + + + $post->ID + $post->post_type + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + ! $user_answers || empty( $user_answers ) || ! is_array( $user_answers ) + ! is_array( $user_answers ) + ! self::$instance + self::$instance + + + init + intercept_notice + maybe_add_lesson_prerequisite_notice + maybe_add_quiz_results_notice + + + $current_link + $current_link + get_permalink( $course_id ) + get_permalink( $lesson_prerequisite ) + + + $lesson_status->comment_approved + + + $lesson_id + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + ! self::$instance + null === get_post_type( 'lesson' ) + self::$instance + + + 'lesson' + + + $allowed + $meta_key + $post_id + + + ensure_learning_mode_url_prefix + init + register_post_meta + + + $prefix + get_post_type_object( 'lesson' )->cap->edit_post + + + get_post_type_object( 'lesson' )->cap + + + Sensei() + \Sensei() + + + + + ! self::$instance + self::$instance + + + init + maybe_add_quiz_results_notice + render_contact_teacher + render_reset_quiz + + + null + + + get_permalink() + + + $lesson_id + $lesson_id + + + Sensei() + Sensei() + + + + + '-global' + + + array + + + $postfix + + + array + + + format_css_variables + init + output_global_styles_colors + output_style + + + $element_colors['background'] + $element_colors['text'] + + + + + ! self::$instance + isset( $template->content ) + self::$instance + + + $post + + + init + maybe_set_block_template_name + update_legacy_template_naming + + + Sensei() + \Sensei() + \Sensei() + + + + + $content + $name + $screenshots + $scripts + $styles + $title + $upsell + $version + + + + + ! self::$instance + $template->name + 'wp_template' !== $template_type + 'wp_template' !== $template_type + [] + self::$instance + + + $post->post_author + + + add_learning_mode_template + init + load_file_templates + maybe_add_theme_supports + maybe_use_course_theme_templates + + + $post->post_type + + + $lesson_id + $query['post_type'] ?? null + + + $db_templates_query->posts + $template->title + 'wp_template' !== $template_type + 'wp_template' !== $template_type + is_array( $template->scripts ) + + + Sensei() + + + $response + + + + + ! self::$instance + self::$instance + + + + add_post_type_rewrite_rules + add_query_var + admin_menu_init + enqueue_fonts + enqueue_styles + init + maybe_flush_rewrite_rules + maybe_override_theme + override_theme + + + get_permalink( $module_lessons[0] ) + get_post_type() + + + $lesson->ID + + + $_wp_current_template_content + $course_id + + + $original_theme + + + The + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + get_extension_class_name + is_supported + + + init + + + + + init + + + self::$instance + self::$instance + + + + + Sensei_Course_Video_Blocks_Embed_Extension + + + self::$instance + self::$instance + + + static + + + self::$instance + self::$instance + + + + + Sensei_Course_Video_Blocks_Embed_Extension + + + self::$instance + self::$instance + + + + + Sensei_Course_Video_Blocks_Embed_Extension + parent::init() + + + is_supported + + + self::$instance + self::$instance + + + init + + + static + + + self::$instance + self::$instance + + + + + ! self::$instance + self::$instance + + + $allowed + $meta_key + $post_id + + + init + register_post_meta + + + get_the_ID() + get_the_ID() + get_the_ID() + + + $post + $post + + + Sensei() + Sensei() + + + + + $uploads + null === $first + null === $second + + + wp_delete_attachment( $file_id, true ) + + + bool + + + new $task_class( $this ) + + + new $task_class( $this ) + + + add_log_entry + clean_up + persist + restore_from_json + run + set_state + set_user_id + start + + + Sensei_Data_Port_Task_Interface + + + wp_delete_attachment( $file_id, true ) + + + $first_type_order_exists ? array_search( $first_log[2]['type'], $log_order, true ) : null + $second_type_order_exists ? array_search( $second_log[2]['type'], $log_order, true ) : null + $uploads['error'] + + + $file->post_title + + + $first_type_order_exists ? array_search( $first_log[2]['type'], $log_order, true ) : null + $second_type_order_exists ? array_search( $second_log[2]['type'], $log_order, true ) : null + isset( $first_log[2]['line'] ) ? $first_log[2]['line'] : null + isset( $second_log[2]['line'] ) ? $second_log[2]['line'] : null + + + $files + $is_completed + $is_started + $logs + $percentage + $results + $state + $user_id + + + (int) $level + + + $uploads + + + new static( $job_id ) + new static( $job_id, $json ) + + + + + 'Sensei_Data_Port_Job' + 'Sensei_Data_Port_Job' + 'Sensei_Data_Port_Job' + 'Sensei_Data_Port_Job' + + + ! self::$instance + self::$instance + + + $this->create_job( $user_id, Sensei_Export_Job::class ) + $this->create_job( $user_id, Sensei_Import_Job::class ) + + + Sensei_Export_Job + Sensei_Import_Job + + + $handler_class::create( $job_id, (int) $user_id ) + + + cancel_all_jobs + cancel_job + clean_old_jobs + init + log_complete_export_jobs + log_complete_import_jobs + maybe_schedule_cron_jobs + persist + redirect_edit_post_link + redirect_imported_sample + run_data_port_job + run_scheduled_data_port_job + + + null + + + get_edit_post_link( $post_id, null ) + + + get_import_id + is_complete + + + (int) $user_id + (int) $user_id + (int) $user_id + (int) $user_id + (string) $job_id + + + WP_CLI + + + DAY_IN_SECONDS + + + get_import_id + + + + + run + save_state + + + + + save_state + + + + + [ 'timeout' => $timeout ] + + + 0 + is_wp_error( $attachment_id ) + + + $user + + + $attachment_id + $attachment_id + $last_term + $module + $query->get_posts()[0] + $user_id + $valid_mime_type + $valid_mime_type + $valid_mime_type + get_term_by( 'id', $term_arr['term_id'], $taxonomy_name ) + + + WP_Error|WP_Term + WP_Term|false + WP_Term|false + WP_User|WP_Error + int|WP_Error + int|WP_Error + int|null + + + $value + + + require_once ABSPATH . 'wp-admin/includes/file.php' + require_once ABSPATH . 'wp-admin/includes/image.php' + require_once ABSPATH . 'wp-admin/includes/media.php' + + + $file_path + $file_path + $file_path + $wp_filetype['type'] + $wp_filetype['type'] + + + $attachment_id + $attachment_id + $parent_term + $terms + $user_id + wp_get_post_terms( $course_id, 'module' ) + + + $last_term->term_id + $module->term_id + + + $teacher_user_id + $teacher_user_id + + + isset( $last_term ) + + + $term_arr + + + + + null === $this->results + + + get_result_counts + set_content_types + + + $tasks + Sensei_Export_Job + + + isset( $this->tasks ) + + + $this->results + + + + + admin_menu + export_page + + + Sensei() + Sensei() + Sensei() + + + + + $args + + + $inner_block + $inner_block + + + get_error_code + get_error_message + + + translate_import_id + + + $term->term_id + + + + + null === $value + + + $name + + + detect_delimiter + + + $column_names + $indexed_line + $indexed_line + $indexed_line + $indexed_line + $indexed_line + $second_line + $this->file->current() + + + + + WP_CLI_Command + + + + + null === $this->results + + + empty( $post ) ? null : $post[0] + + + int|null + + + $this->get_tasks()['associations'] + + + add_line_warning + add_log_entry + get_result_counts + set_import_id + set_is_sample_data + set_line_result + + + Sensei_Import_Associations + + + $filetype + + + add_data + + + $tasks + Sensei_Import_Job + + + (bool) $is_sample_data + + + isset( $this->tasks ) + + + $this->results + + + + + admin_menu + import_page + + + Sensei() + Sensei() + Sensei() + + + + + $categories + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $tags + + + get_term( $module_term_id )->name + + + get_term( $module_term_id )->name + + + Sensei() + Sensei() + + + get_term( $module_term_id )->name + + + + + run + + + $file->post_title + + + $file->post_title + + + $file->post_title + + + + + wp_get_attachment_image_url( $attachment, 'full' ) + wp_get_attachment_url( $attachment ) + + + string + + + $value + $value + + + $categories + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + require_once ABSPATH . 'wp-admin/includes/file.php' + + + add_file_to_job + run + + + get_attached_file( $files[ $type ] ) + + + $post + + + + + null === $new_lessons + + + $post_args + + + get_posts( $post_args ) + + + int[] + + + $code + $code + $message + $message + + + function( $message, $code ) use ( $line_number, $course_id, $post_title ) { + function( $message, $code ) use ( $line_number, $lesson_id, $post_title ) { + + + add_course_lessons + add_lesson_module + handle_course_lessons + run + save_state + + + get_error_code + get_error_message + + + get_error_code + get_error_message + + + $batch_remaining + + + (int) $lesson_id + + + isset( $this->total_tasks ) + isset( $this->total_tasks ) + isset( $this->total_tasks ) + + + Sensei() + Sensei() + + + add_line_warning + add_line_warning + translate_import_id + was_imported + + + $term->term_id + + + + + Sensei_Import_CSV_Reader::validate_csv_file( $file_path, $required_fields, $optional_fields ) + + + true|WP_Error + + + handle_prerequisite + + + + + add_post_process_task + run + run_post_process_tasks + save_state + + + get_attached_file( $attachment_id ) + + + $completed_lines + $post_process_tasks + $reader + + + set_line_result + set_line_result + set_line_result + sync_post + + + + + Sensei_Import_CSV_Reader::validate_csv_file( $file_path, $required_fields, $optional_fields ) + + + true|WP_Error + + + handle_prerequisite + + + + + add_prerequisite_task + handle_prerequisite_helper + + + add_line_warning + add_line_warning + translate_import_id + + + + + Sensei_Import_CSV_Reader::validate_csv_file( $file_path, $required_fields, $optional_fields ) + + + true|WP_Error + + + + + $field + $field + + + + + 0 === $post_id + + + + $post_id + $teacher_user + + + true|WP_Error + + + delete_course_terms + set_course_terms + + + $post_id + $post_id + $post_id + + + get_error_code + get_error_message + + + Sensei_Import_Course_Model + Sensei_Import_Course_Model + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + get_associations_task + + + $teacher_user->ID + $teacher_user->user_email + + + + + 0 === $post_id + + + $post_id + $quiz_id + $result + is_wp_error( $result ) ? $result : true + + + bool|WP_Error + bool|WP_Error + true|WP_Error + + + set_lesson_terms + set_quiz_questions + + + $post_id + $post_id + $post_id + $quiz_id + $quiz_id + + + get_error_code + get_error_message + + + Sensei_Import_Lesson_Model + Sensei_Import_Lesson_Model + + + Sensei() + Sensei() + + + get_associations_task + translate_import_id + + + + + + int + + + $attachment_id + + + bool|WP_Error + + + $value + + + add_line_warning + add_warnings_to_job + restore_from_source_array + set_data + set_post_id + store_import_id + + + $post_id + + + $existing_posts[0]->ID + + + $task + + + $data + $default_author + $is_new + $line_number + $post_id + $schema + $task + + + null !== $value + + + ! empty( $import_id ) && $this->task + $this->task + + + add_line_warning + set_import_id + + + new static() + + + + + 0 === $post_id + + + $post_id + Sensei_Data_Port_Utilities::get_attachment_from_source( $value, $this->get_post_id(), $this->schema->get_schema()[ $column_name ]['mime_types'] ) + + + null|string + true|WP_Error + + + sync_meta + + + $meta_fields + + + $post_id + + + $question_type + Sensei_Import_Question_Model + Sensei_Import_Question_Model + Sensei_Import_Question_Model + + + Sensei() + + + $this->processed_multiple_choice_answers + + + + + ! self::$instance + self::$instance + + + enqueue_scripts + enqueue_styles + init + output_modal + + + Sensei() + Sensei() + + + + + Sensei_Email_Signup_Form::GDPR_EMAIL_FIELD_ID + Sensei_Email_Signup_Form::MC_LIST_ID + Sensei_Email_Signup_Form::MC_USER_ID + + + + + global $sensei_email_data; + + + $heading + $recipient + $subject + $template + $user + + + Sensei() + Sensei() + + + + + global $sensei_email_data; + + + $heading + $recipient + $subject + $template + $user + + + Sensei() + Sensei() + + + + + global $sensei_email_data; + + + $message + + + $this->message->ID + + + $comment->user_id + + + $commenter + $original_receiver + $original_sender + + + $this->commenter->display_name + $this->commenter->user_login + $this->original_receiver->user_email + $this->original_sender->user_email + + + $comment + $heading + $message + $recipient + $subject + + + Sensei() + Sensei() + + + + + global $sensei_email_data; + + + $heading + $learner + $recipient + $subject + $teacher + $template + + + Sensei() + Sensei() + + + + + global $sensei_email_data; + + + $heading + $learner + $recipient + $subject + $teacher + $template + + + Sensei() + Sensei() + + + + + $course_id + $teacher_id + + + $heading + $learner + $recipient + $subject + $teacher + $template + + + $course->post_title + + + $course->post_title + + + Sensei() + Sensei() + + + + + global $sensei_email_data; + + + $heading + $learner + $message + $recipient + $subject + $teacher + $template + + + $this->learner->ID + $this->learner->display_name + $this->message->post_content + $this->teacher->ID + $this->teacher->user_email + + + $this->message->post_content + + + Sensei() + Sensei() + + + + + global $sensei_email_data; + + + $heading + $learner + $recipient + $subject + $teacher + $template + + + Sensei() + Sensei() + + + + + global $sensei_email_data; + + + $heading + $learner + $recipient + $subject + $teacher + $template + + + Sensei() + Sensei() + + + + + ! self::$instance + self::$instance + + + Sensei_Course_Manual_Enrolment_Provider::instance()->get_id() + + + $this->get_enrolment_provider_by_id( Sensei_Course_Manual_Enrolment_Provider::instance()->get_id() ) + + + add_wcpc_1_notice + collect_enrolment_providers + defer_course_enrolment_check + detect_wcpc_1 + do_course_enrolment_check + init + invalidate_learner_result + mark_user_as_needing_recalculation + recalculate_enrolments + recalculate_on_course_post_status_change + remove_deferred_enrolment_check + run_deferred_course_enrolment_checks + trigger_course_enrolment_check + + + false|Sensei_Course_Manual_Enrolment_Provider + + + wp_json_encode( $versions ) + + + $course + + + $screen->id + + + $enrolment_providers + $enrolment_providers_versions_hash + + + $course_enrolment + $course_enrolment + $course_enrolment + $course_enrolment + + + isset( $this->enrolment_providers ) + isset( $this->enrolment_providers ) + isset( $this->enrolment_providers_versions_hash ) + + + + + $version + + + isset( $time ) ? $time : time() + + + + + clear_enrolment_status + set_enrolment_status + + + + + [ 'Sensei_learner', 'get_learner_id' ] + + + invalidate_learner_result + store_enrolment_results + + + $is_enrolled + + + $learner_terms + + + get_version_hash + + + $is_enrolled + + + $course_enrolment_providers + $removed_learners + + + isset( $this->course_enrolment_providers ) + isset( $this->removed_learners ) + + + $learner_terms + + + new static( $course_id ) + + + + + 'manual' + + + int + + + set_migrated_legacy_enrolment_status + + + isset( self::$instance ) + + + + + false + + + string + + + end + modify_user_query_add_user_id + run + set_last_user_id + setup + + + $this->get_current_job_id() + + + isset( $args['course_id'] ) ? intval( $args['course_id'] ) : null + isset( $args['job_id'] ) ? sanitize_text_field( $args['job_id'] ) : null + + + (int) $this->batch_size + (int) $user_id + (int) $user_query->get_total() + + + + + ! self::$instance + self::$instance + + + function() { + + + cancel_course_calculation_job + init + maybe_start_learner_calculation + run_course_calculation + run_learner_calculation + + + + + end + modify_user_query_add_user_id + run + set_last_user_id + setup + + + (int) $this->batch_size + (int) $user_id + (int) $user_query->get_total() + + + + + is_wp_error( $result ) + + + $timestamp + + + add_provider_log_message + persist_all + register_possible_enrolment_change + restore_from_json + + + + + is_array( $log_entry ) + + + false + false + false + + + array + + + add_log_message + add_status + + + + + is_wp_error( $result ) + + + $provider_states + + + $provider_states + + + get_has_changed + persist_all + restore_from_json + set_has_changed + set_provider_states + + + (bool) $has_changed + + + + + set_stored_value + + + + + 'Sensei_Main' + + + $this + + + 'sensei_the_single_lesson_meta' + + + + + load_admin_assets + + + WP_Theme_JSON_Data|WP_Theme_JSON_Data_Gutenberg + WP_Theme_JSON_Data|WP_Theme_JSON_Data_Gutenberg + + + Sensei() + Sensei() + + + + + ! self::$instance + self::$instance + + + disable_legacy_emails + + + new Email_Seeder( new Email_Seeder_Data(), $this->repository, $template_repository ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + + $email_generators + + + Email_Generators_Abstract[] + + + + + validate_bulk_action_request + + + + + + prepare_items + + + $post + + + $post + $post + + + get_edit_post_link( $post ) + get_edit_post_link( $post->ID ) + + + Email_List_Table + Email_List_Table + Email_List_Table + Email_List_Table + + + + + $post->post_author + + + $query->posts[0] + + + require $path + + + + + WP_Block_Template + WP_Block_Template + WP_Block_Template + WP_Block_Template + WP_Block_Template + WP_Block_Template + + + + + init + register_block_patterns_category + register_email_block_patterns + register_email_editor_block_patterns + register_email_preview_block_patterns + + + WP_Screen + + + + + null === self::$instance + + + null + + + WP_Post_Type + + + + + get_post( $post_id ) + + + WP_Post|null + + + get_the_ID() + + + $this->get_email_post_for_preview() + $this->get_email_post_for_preview() + + + $post->ID + + + + + $query->posts[0] + + + \WP_Post|null + + + $post->ID + + + (int) $query->post_count + + + + + $emails + + + + + init + + + + + init + send_email + + + null + + + get_block_template( Email_Page_Template::ID, 'wp_template' )->content + + + get_block_template( Email_Page_Template::ID, 'wp_template' )->content + + + $template_repository + + + Email_Template_Repository + + + Sensei() + Sensei() + + + require Sensei()->plugin_path() . 'templates/emails/block-email-template.php' + + + + + [] + + + $key + $key + + + form_field_hidden + init + render_tabs + + + $this->settings->get_settings() + + + + + init + process + + + + + init + + + + + get_permalink( $course_id ) + + + completed_course_mail_to_student + + + \Sensei_Course::get_course_completed_page_url( $course_id ) ?? get_permalink( $course_id ) + + + \Sensei_Course::get_course_completed_page_url( $course_id ) + + + + + course_created_to_admin + + + $course->post_author + + + $course->post_author + + + $course->post_author + + + (int) $course_id + + + + + welcome_to_course_for_student + + + $course->ID + $course->post_author + $course->post_status + $course->post_title + + + + + send_email_action + + + + + course_new_teacher_assigned_email + + + + + quiz_graded_mail_to_student + + + get_permalink( $quiz_id ) + + + $course->ID + $lesson->ID + + + \Sensei() + \Sensei() + + + + + student_completed_course_mail_to_teacher + + + \Sensei() + \Sensei() + + + + + student_completed_lesson_mail_to_teacher + + + (int) $lesson_id + (int) $student_id + + + \Sensei() + + + + + $teacher_id + + + $message_receiver_user->ID + $message_sender_user->ID + $post->post_author + $post->post_type + $teacher->ID + $teacher->display_name + get_userdata( $recipient_id )->user_email + + + Sensei() + + + + + get_permalink( absint( $message_id ) ) + + + $course->ID + $message->ID + $message->post_content + $message->post_title + + + $course->ID + $message->ID + $message->post_content + $message->post_title + + + $course->ID + $message->ID + $message->post_content + $message->post_title + + + + + student_started_course_mail_to_teacher + + + $course->post_author + $course->post_status + $course->post_title + + + + + student_submits_quiz_mail_to_teacher + + + $course->ID + $lesson->ID + + + ! is_wp_error( $grade ) + + + \Sensei() + \Sensei() + + + + + $comment->user_id + $teacher_id + + + $commenter->display_name + $course->ID + $course->post_author + get_userdata( $teacher_id )->user_email + + + + + ! self::$instance + self::$instance + + + init + install + + + MINUTE_IN_SECONDS + SENSEI_LMS_PLUGIN_FILE + SENSEI_LMS_VERSION + + + + + run + + + + + require_once ABSPATH . 'wp-admin/includes/upgrade.php' + + + create_tables + + + Sensei() + + + + + $plugin_version + + + + + is_null( $this->errors ) + + + $value_sql + + + strng + + + + + $this->wpdb->get_results( $query ) + + + + + $grade_rows + + + + + $status_comment->comment_ID + $status_comment->comment_ID + $status_comment->comment_ID + $status_comment->comment_ID + $status_comment->comment_ID + $status_comment->comment_ID + $status_comment->comment_ID + $status_comment->comment_ID + is_numeric( $final_grade ) ? $final_grade : null + + + Sensei() + + + + + $row->created_at + $row->final_grade + $row->id + $row->quiz_id + $row->updated_at + $row->user_id + + + + + getTimestamp + getTimestamp + + + + + Course_Progress + + + $comment->comment_ID + $comment->comment_approved + $comment->comment_date + + + $this->get( $course_id, $user_id ) + + + $course_progress->get_status() + + + format + + + Sensei() + + + + + $row->completed_at + $row->created_at + $row->id + $row->post_id + $row->started_at + $row->status + $row->updated_at + $row->user_id + + + format + format + + + (int) $this->wpdb->insert_id + + + + + getTimestamp + getTimestamp + + + + + Lesson_Progress + + + $comment->comment_ID + $comment->comment_approved + $comment->comment_date + + + $this->get( $lesson_id, $user_id ) + + + $lesson_progress->get_status() + + + format + format + + + RuntimeException + + + RuntimeException + + + Sensei() + Sensei() + Sensei() + + + + + $row->completed_at + $row->created_at + $row->id + $row->post_id + $row->started_at + $row->status + $row->updated_at + $row->user_id + + + format + format + + + (int) $this->wpdb->insert_id + + + Sensei() + + + + + getTimestamp + getTimestamp + + + + + $comment->comment_ID + $comment->comment_approved + $comment->comment_date + + + $comments + $comments + + + $quiz_progress->get_status() + + + format + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $row->completed_at + $row->created_at + $row->id + $row->post_id + $row->started_at + $row->status + $row->updated_at + $row->user_id + + + format + format + + + (int) $this->wpdb->insert_id + + + + + handle + init + + + WP_Post + + + + + WP_Post + + + + + WP_Post + + + + + handle + init + + + + + init + process + + + + + $callback + + + new $subclass() + + + self::$instances[ $subclass ] + + + include_once ABSPATH . 'wp-admin/includes/plugin.php' + + + add_usage_tracking_two_week_schedule + enqueue_script_deps + get_event_prefix + get_instance + handle_tracking_opt_in + hide_tracking_opt_in + is_opt_in_hidden + maybe_display_tracking_opt_in + opt_in_dialog_text_allowed_html + output_opt_in_js + schedule_tracking_task + send_usage_data + set_callback + set_tracking_enabled + unschedule_tracking_task + + + $callback + + + + + get_instance + get_template_data + set_tracking_enabled + + + false + + + + + $args + $message + $title + + + $wp_die_args + + + get_wp_die_args + set_wp_die_args + + + + + WP_UnitTestCase + + + + + array( 'include' => $user_ids ) + + + $timestamp + + + $post->post_excerpt + $post->post_title + $post->post_title + $post->post_type + $post->post_type + + + $mail_poet_lists + $sensei_lists + + + (int) $mp_list_id + + + $exception + \MailPoet\API\API + \MailPoet\API\MP\v1\APIException + \MailPoet\API\MP\v1\APIException + \MailPoet\API\MP\v1\APIException + \MailPoet\API\MP\v1\APIException + + + SENSEI_LMS_PLUGIN_FILE + WP_PLUGIN_DIR + + + Sensei_MailPoet + Sensei_MailPoet + + + + + $args + + + $student + + + static function( $student ) { + + + $students + + + $post->ID + $post->post_excerpt + $post->post_title + $post->post_type + + + $student_ids + + + + + $subscriber + + + $sensei_mp_instance + $sensei_mp_instance + $sensei_mp_instance + $sensei_mp_instance + $sensei_mp_instance + + + + + backup_global_vars + reset_global_vars + set_global_vars + setup_post_query + + + $post->post_content + + + $post->post_content + + + $global_pages_ref + $global_post_ref + $global_wp_query_ref + $global_wp_the_query_ref + + + Sensei() + + + + + Sensei_Analysis_Overview_List_Table + + + ! self::$instance + self::$instance + + + global $wpdb; + + + + + add_orderby_custom_field_to_query + + + remove_filter( 'posts_orderby', array( $this, 'add_orderby_custom_field_to_query' ), 10, 2 ) + remove_filter( 'posts_orderby', array( $this, 'add_orderby_custom_field_to_query' ), 10, 2 ) + + + + + public function get_is_last_activity_filter_enabled() { + + + add_last_activity_to_user_query + add_orderby_custom_field_to_user_query + add_pre_user_query_hook + filter_users_by_last_activity + get_is_last_activity_filter_enabled + group_by_users + only_course_enrolled_users + + + + + + data_table_footer + extra_tablenav + output_course_select_input + output_top_filters + prepare_items + search_button + + + Sensei_Reports_Overview_List_Table_Abstract + Sensei_Reports_Overview_List_Table_Abstract + Sensei_Reports_Overview_List_Table_Abstract + Sensei_Reports_Overview_List_Table_Abstract + + + get_is_last_activity_filter_enabled + + + + + ceil( $this->reports_overview_service_courses->get_courses_average_grade( $all_course_ids ) ) + count( $all_course_ids ) + + + Sensei_Reports_Overview_List_Table_Courses + Sensei_Reports_Overview_List_Table_Courses + Sensei_Reports_Overview_List_Table_Courses + Sensei_Reports_Overview_List_Table_Courses + + + Sensei() + + + + + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $lessons + + + $value + + + $modules_terms + + + wp_get_object_terms( $lessons, 'module', $default_args ) + + + Sensei_Reports_Overview_List_Table_Lessons + Sensei_Reports_Overview_List_Table_Lessons + Sensei_Reports_Overview_List_Table_Lessons + Sensei_Reports_Overview_List_Table_Lessons + + + + + wp_date( get_option( 'date_format' ), $date->getTimestamp(), $timezone ) + + + string + + + $user_name + + + $user_name + + + $user_name + + + Sensei_Reports_Overview_List_Table_Students + Sensei_Reports_Overview_List_Table_Students + Sensei_Reports_Overview_List_Table_Students + Sensei_Reports_Overview_List_Table_Students + + + + + $acc + $current + + + function ( $acc, $current ) { + function ( $carry, $lesson ) use ( $lessons_completions ) { + + + empty( $lessons ) + + + + + WP_HTTP + + + register_routes + + + $result[ $student_id ][ $course_id ] + $result[ $student_id ][ $course_id ] + + + $course->post_type + + + $edit_course_cap + + + get_post_type_object( 'course' )->cap + + + Sensei_REST_API_Course_Progress_Controller + + + + + $course ? $course : null + + + WP_Post|null + + + get_schema_lessons + get_schema_modules + register_routes + + + get_error_code + get_error_message + + + $course->ID + $course->ID + get_post_type_object( 'course' )->cap->edit_post + get_post_type_object( 'course' )->cap->read_post + + + $course->ID + $course->ID + get_post_type_object( 'course' )->cap + get_post_type_object( 'course' )->cap + + + Sensei_REST_API_Course_Structure_Controller + + + Sensei() + + + + + WP_HTTP + WP_HTTP + + + register_routes + + + $result[ $user_id ][ $course_id ] + $result[ $user_id ][ $course_id ] + + + $course->post_type + + + $edit_course_cap + + + get_post_type_object( 'course' )->cap + + + Sensei_REST_API_Course_Students_Controller + + + + + WP_HTTP + WP_HTTP + + + wp_verify_nonce( $nonce, \Sensei_Teacher::NONCE_ACTION_NAME ) + + + boolean + + + register_routes + + + $post->post_type + + + $post->post_type + $post_type->cap->edit_post + + + $post->post_type + $post_type->cap + + + Sensei_REST_API_Course_Utils_Controller + + + Sensei() + Sensei() + + + + + $allow_current && 'active' === $job_id + 'active' === $job_id + + + [ 'id' => null ] + + + WP_REST_Response|WP_Error + + + $job_id + $job_id + sanitize_text_field( $request->get_param( 'job_id' ) ) + sanitize_text_field( $request->get_param( 'job_id' ) ) + sanitize_text_field( $request->get_param( 'job_id' ) ) + + + $handler_class::get_file_config() + + + register_routes + + + $request->get_param( 'job_id' ) + $request->get_param( 'job_id' ) + $request->get_param( 'job_id' ) + $request->get_param( 'job_id' ) + + + Sensei_REST_API_Data_Port_Controller + Sensei_REST_API_Data_Port_Controller + + + get_result_counts + + + + + sanitize_text_field( $request->get_param( 'job_id' ) ) + + + $request->get_param( 'job_id' ) + + + Sensei_REST_API_Export_Controller + + + $job + $job + + + + + $error + $skin->result + + + WP_REST_Response|WP_Error + bool|WP_Error + + + $param + $param + $param + $param + + + function ( $plugin ) { + + + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' + require_once ABSPATH . 'wp-admin/includes/file.php' + + + register_routes + + + Sensei_REST_API_Extensions_Controller + + + + + register_get_data_route + register_mark_tasks_complete_route + register_routes + + + Sensei_REST_API_Home_Controller + + + + + ! $job + ! $job + + + $job + + + $result + + + WP_REST_Response|WP_Error + + + sanitize_text_field( $request->get_param( 'job_id' ) ) + + + register_routes + + + $result + + + $request->get_param( 'file_key' ) + $request->get_param( 'file_key' ) + $request->get_param( 'file_key' ) + $request->get_param( 'job_id' ) + + + Sensei_REST_API_Import_Controller + + + Sensei() + Sensei() + + + + + register + + + + + + is_wp_error( $quiz_id ) + + + $question_id + $quiz_id + + + WP_REST_Response|WP_Error + + + register_routes + + + $lesson + $lesson + $lesson + $question + get_post( $quiz ) + get_post( $quiz_id ) + + + get_error_code + get_error_data + + + $lesson->ID + $lesson->ID + $lesson->ID + $lesson->ID + $lesson->post_status + $lesson->post_title + $lesson->post_type + $lesson->post_type + + + $lesson->ID + get_post_type_object( 'lesson' )->cap->edit_post + get_post_type_object( 'lesson' )->cap->edit_post + + + $lesson->ID + $lesson->ID + $lesson->post_status + $lesson->post_title + get_post_type_object( 'lesson' )->cap + get_post_type_object( 'lesson' )->cap + + + Sensei_REST_API_Lesson_Quiz_Controller + + + is_wp_error( $result ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + $value + $value + $value + + + init_post_meta + + + $prepared + + + $post->ID + + + $post->ID + + + Sensei_REST_API_Lessons_Controller + Sensei_REST_API_Lessons_Controller + Sensei_REST_API_Lessons_Controller + Sensei_REST_API_Lessons_Controller + Sensei_REST_API_Lessons_Controller + + + Sensei() + Sensei() + + + + + empty( $current_user ) + + + $object + $object + $object + $value + + + function ( $value ) { + function( $object ) { + + + Sensei_REST_API_Messages_Controller + Sensei_REST_API_Messages_Controller + Sensei_REST_API_Messages_Controller + Sensei_REST_API_Messages_Controller + Sensei_REST_API_Messages_Controller + + + $post->ID + $post->post_author + + + + + $post_args + + + $post_args + + + migrate_non_editor_question + + + $question_categories + + + $mimetype + wp_get_attachment_url( $question_media_id ) + + + $attachment_src[0] + + + $attachment->ID + $attachment->post_title + $question_category->name + $question_category->term_id + + + $attachment->post_title + $question_id + get_post_type_object( 'multiple_question' )->cap->edit_post + get_post_type_object( 'question' )->cap->edit_post + get_post_type_object( 'question' )->cap->edit_post + + + $attachment->ID + $attachment->post_title + get_post_type_object( 'multiple_question' )->cap + get_post_type_object( 'question' )->cap + get_post_type_object( 'question' )->cap + + + ! is_wp_error( $result ) + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + $question_category->name + $question_category->term_id + + + + + + register_routes + + + $question + $question + $question_post + $question_post + + + $question->post_type + + + Sensei_REST_API_Question_Options_Controller + + + + + -1 + + + WP_Error|WP_Post|WP_REST_Response + WP_Error|WP_Post|WP_REST_Response + + + '' + + + $question_id + + + WP_Error|WP_Post|WP_REST_Response + + + $object + + + function( $object ) { + + + $post + $question_id + get_post( $question_id ) + + + get_error_code + + + $question->post_author + + + $post_type->cap->edit_posts + + + $post_type->cap + $question->post_author + + + Sensei_REST_API_Questions_Controller + Sensei_REST_API_Questions_Controller + Sensei_REST_API_Questions_Controller + Sensei_REST_API_Questions_Controller + Sensei_REST_API_Questions_Controller + + + $current_user + $current_user + + + Sensei() + Sensei() + + + $response->data + + + $response->data + + + + + is_wp_error( $post ) + + + $fail_response + $fail_response + wp_verify_nonce( $nonce, \Sensei_Messages::NONCE_ACTION_NAME ) + + + boolean + string + + + register_routes + + + $post->ID + $post->ID + $post->ID + $post->ID + $post->post_author + $post->post_type + + + $post->ID + $post->ID + $post->ID + $post->ID + $post->post_author + $post->post_type + + + Sensei_REST_API_Send_Message_Controller + + + \Sensei() + \Sensei() + \Sensei() + \Sensei() + + + + + install_extensions + + + get_json_params + get_json_params + + + complete_setup_wizard + register_complete_wizard_route + register_get_data_route + register_get_features_route + register_routes + register_setup_wizard_settings + register_submit_features_installation_route + register_submit_features_route + register_submit_purpose_route + register_submit_theme_route + register_submit_tracking_route + register_submit_welcome_route + update_setup_wizard_settings + + + Sensei_REST_API_Setup_Wizard_Controller + + + $this->setup_wizard->pages + + + Sensei() + Sensei() + Sensei() + + + + + + is_null( $result ) + is_wp_error( $api ) + + + include_once ABSPATH . '/wp-admin/includes/admin.php' + include_once ABSPATH . '/wp-admin/includes/class-theme-upgrader.php' + include_once ABSPATH . '/wp-admin/includes/class-wp-upgrader.php' + include_once ABSPATH . '/wp-admin/includes/theme-install.php' + include_once ABSPATH . '/wp-admin/includes/theme.php' + + + register_routes + + + $api->download_link + + + Sensei_REST_API_Theme_Controller + + + + + $base + $base + + + $rgb + + + string + + + $alternative + $hook_tag + $post + $version + + + sensei_do_deprecated_action + sensei_log_event + sensei_log_jetpack_event + + + get_the_ID() + + + $page->ID + get_post( $course_id )->post_author + + + get_post( $course_id )->post_author + + + Jetpack + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + 'course-category' + + + $category_ids + + + mixed + + + $categories + + + get_term_link( $category ) + + + get_terms( 'course-category', $args ) + + + $term->term_id + + + $this->exclude + $this->hide_empty + $this->include + $this->number + $this->order + $this->orderby + $this->parent + + + $this->exclude + $this->hide_empty + $this->include + $this->number + $this->order + $this->orderby + $this->parent + + + + + array( $this->renderer, 'set_global_vars' ) + + + new Sensei_Renderer_Single_Post( $this->id, 'single-course.php', $attributes ) + + + $renderer + + + $e + Sensei_Renderer_Missing_Fields_Exception + + + $this->renderer + Sensei_Renderer_Single_Course + + + + + ! empty( $this->exclude ) && is_array( $this->exclude ) + ! empty( $this->ids ) && is_array( $this->ids ) + is_array( $this->exclude ) + is_array( $this->ids ) + + + $teachers + + + $global_product + + + setup_course_query + + + empty( $exclude ) ? '' : explode( ',', $exclude ) + empty( $ids ) ? '' : explode( ',', $ids ) + + + $user->ID + + + + + setup_course_query + + + + + new WP_Query( $args ) + + + $lesson_page_query + + + $this->id + + + + + 'WP_Post' + + + $attributes + $code + $content + + + initialize_shortcodes + setup_shortcode_class_map + + + $shortcode_classes + + + + + 'WP_User' + + + $this->exclude + array( 'include' => $this->include ) + + + $this->convert_usernames_to_ids( $exclude ) + $this->convert_usernames_to_ids( $include ) + + + $user + $user_1 + $user_2 + $users + $users + + + setup_teacher_query + + + $exclude + $include + + + is_array( $users ) + + + which + which + + + + + $key === $this->status + $key === $this->status + 'active' === $this->status + 'active' === $this->status + 'active' === $this->status + 'active' === $this->status + 'complete' === $this->status + 'complete' === $this->status + 'complete' === $this->status + 'complete' === $this->status + + + isset( $attributes['number'] ) ? absint( $attributes['number'] ) : $per_page + + + $course_status + $user_id + + + active_no_course_message_output + add_course_details_wrapper_end + add_course_details_wrapper_start + attach_course_buttons + attach_course_progress + attach_shortcode_hooks + completed_no_course_message_output + course_category + course_toggle_actions + detach_shortcode_hooks + is_my_courses + no_course_message_output + print_course_toggle_actions_inline_script + setup_course_query + should_filter_course_by_status + + + $category_output + $course + + + $query + + + status + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + mixed + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + + + ! $item + ! $item + ! $item + $item + + + get_permalink( $item->ID ) + + + $args + + + string + + + html + html + string + string + string + + + $lesson_id + $lesson_id + sensei_get_the_module_id() + + + $args + $path + $post_id + $post_id + $question_type + $template_name + + + get_sensei_footer + get_sensei_header + sensei_courses_per_row + sensei_get_template + sensei_get_the_question_id + sensei_load_template + sensei_load_template_part + sensei_setup_module + sensei_setup_the_question + sensei_the_course_results_lessons + sensei_the_excerpt + sensei_the_lesson_excerpt + sensei_the_lesson_status_class + sensei_the_module_description + sensei_the_module_id + sensei_the_module_status + sensei_the_my_courses_content + sensei_the_question_class + sensei_the_question_content + sensei_the_single_lesson_meta + the_no_permissions_message + the_no_permissions_title + + + get_permalink( $course_id ) + get_the_ID() + + + $item + get_post( $lesson_id ) + + + Sensei_Course::get_loop_number_of_columns() + + + is_array( $modules_and_lessons ) + + + the_excerpt( $post ) + + + html + html + + + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + Sensei() + + + $item->ID + $item->name + $item->post_title + $item->term_id + $item->term_id + + + + + get_supported_themes + possibly_load_supported_theme_wrappers + setup_currently_active_theme + setup_themes + + + Sensei() + Sensei() + Sensei() + + + + + wrapper_end + wrapper_start + + + + + print_styles + wrapper_start + + + + + wrapper_end + wrapper_start + + + + + wrapper_end + wrapper_start + + + + + wrapper_end + wrapper_start + + + + + wrapper_end + wrapper_start + + + + + wrapper_end + wrapper_start + + + + + empty( $post_to_copy ) + + + handle_request + prepare_wp_query + + + $post_to_copy + + + $post_to_copy + + + Sensei() + + + + + handle_request + prepare_wp_query + + + $post_to_copy + + + $post_to_copy + + + OBJECT + + + + + true + + + add_filter_hide_the_title + get_option + handle_request + remove_filter_hide_the_title + + + get_the_ID() + + + $post_id + + + remove_filter( 'the_title', array( $this, 'hide_the_title' ), 20, 2 ) + + + + + ! $learner_user + $learner_user + + + handle_request + prepare_wp_query + + + $post_to_copy + + + $post_to_copy + + + + + handle_request + + + Sensei() + + + + + handle_request + prepare_wp_query + + + + + handle_request + prepare_wp_query + + + $post_to_copy + + + $post_to_copy + + + $course + + + $module->name + + + $module->name + $module->slug + + + Sensei() + Sensei() + + + $module->name + $module->slug + + + $module->slug + + + + + ! $this->original_query + $this->dummy_post->ID === $id + $this->original_query + + + do_sensei_pagination + output_content_as_page + prepare_wp_query + setup_original_query + + + $object_to_copy + $object_to_copy + + + + + $author + + + handle_request + prepare_wp_query + + + $this->author + + + get_user_by( 'id', get_query_var( 'author' ) ) + + + + + disable_comments + disable_theme_pagination + reenable_comments + + + + + handle_request + + + + + $quiz->ID + $quiz->post_author + + + (int) $offset + + + Sensei() + + + + + $question + + + $question->ID + $question->post_type + + + (int) $offset + + + + + $email_address + + + sensei_after_sending_email + sensei_before_mail + + + + + \Sensei\Internal\Installer\Installer::instance( SENSEI_LMS_VERSION ) + init + + + global $woothemes_sensei; + + + Sensei + activate_sensei + + + $plugin + + + require SENSEI_LMS_PLUGIN_PATH . 'vendor/autoload.php' + + + + + function get_objects_in_term($term_ids, $taxonomies, $args = array()) + function wp_remote_request($url, $args = array()) + + + diff --git a/config/psalm/psalm-loader.php b/config/psalm/psalm-loader.php new file mode 100644 index 0000000000..9da9b00e9e --- /dev/null +++ b/config/psalm/psalm-loader.php @@ -0,0 +1,14 @@ +get_template() ); + + if ( empty( $course_id ) || ! $is_target_theme ) { + return false; + } + + if ( Sensei_Course_Theme_Option::has_learning_mode_enabled( $course_id ) ) { + Sensei()->assets->enqueue( 'astra-learning-mode', 'css/3rd-party/themes/astra/learning-mode.css' ); + } +} + +add_action( 'wp_enqueue_scripts', 'sensei_load_learning_mode_styles_for_astra_theme' ); diff --git a/includes/blocks/class-sensei-block-view-results.php b/includes/blocks/class-sensei-block-view-results.php index f2a2d082f9..8ed5b44256 100644 --- a/includes/blocks/class-sensei-block-view-results.php +++ b/includes/blocks/class-sensei-block-view-results.php @@ -72,7 +72,16 @@ public function render( $attributes, $content ): string { return ''; } - return '
' . + $results_link = Sensei_Course::get_view_results_link( $course_id ); + parse_str( wp_parse_url( $results_link, PHP_URL_QUERY ), $results_link_query_params ); + + $form_inputs = ''; + foreach ( $results_link_query_params as $name => $value ) { + $form_inputs .= ''; + } + + return '' . + $form_inputs . preg_replace( '//', '