{"id":312864,"date":"2026-06-11T03:06:48","date_gmt":"2026-06-11T03:06:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/xtreme-courses\/"},"modified":"2026-06-11T03:20:01","modified_gmt":"2026-06-11T03:20:01","slug":"xtreme-courses","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/xtreme-courses\/","author":23499422,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.9","stable_tag":"2.1.9","tested":"7.0","requires":"6.5","requires_php":"8.2","requires_plugins":null,"header_name":"Xtreme Courses","header_author":"Jacob Swartz","header_description":"WordPress LMS that sells courses through WooCommerce, builds them in a React drag-and-drop editor, runs quizzes, schedules drip content, issues PDF certificates, awards XP and badges, and hosts live Zoom lessons. Bundles Chart.js (MIT, Copyright 2014-2025 Chart.js Contributors).","assets_banners_color":"97add5","last_updated":"2026-06-11 03:20:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/xtremeplugins.com\/plugins\/xtreme-courses\/","header_author_uri":"https:\/\/xtremeplugins.com","rating":5,"author_block_rating":0,"active_installs":0,"downloads":30,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.9":{"tag":"2.1.9","author":"xtremplugins","date":"2026-06-11 03:20:01"}},"upgrade_notice":{"2.1.9":"<p>Reviewer follow-up: adds a publish-specific capability check (publish_xtrc_courses) to the course publish REST endpoint, and composes the certificate PDF stylesheet block from a constant instead of a literal style element (PDF markup, not enqueueable front-end CSS). No DB changes.<\/p>","2.1.8":"<p>Reviewer round: updates bundled Chart.js to v4.5.1, hardens drip-override nonces, binds the override SQL via prepare(), sanitizes the certificate layout JSON and SCRIPT_NAME, lowers the admin menu position, and drops the deprecated XC_* aliases. No DB changes.<\/p>","2.1.7":"<p>Plugin Check round 4: rewrites the <code>$_GET[&amp;#039;xtrc_bulk_token&amp;#039;]<\/code> read so <code>wp_unslash()<\/code> wraps the raw <code>$_GET<\/code> value directly (sniff-compatible pattern). Trims oversize Upgrade Notices to comply with the 300-char guideline. No DB or schema changes.<\/p>","2.1.6":"<p>React course-builder UX: save-failure banner now wraps multi-line and shows the full error message (was truncated at ~360px). Update on a published course no longer hard-blocks when a Quiz lesson has zero questions \u2014 saves with an amber warning. Publish still blocks. No DB changes.<\/p>","2.1.5":"<p>Fixes the React course builder &quot;Save failed \u2014 Quiz not found.&quot; error on every Update \/ Publish of a course containing a Quiz lesson. Builder now sends <code>lesson.quiz_id<\/code> instead of the lesson ID; backend <code>validate_quiz()<\/code> falls back through lesson-ID lookup. No DB or schema changes.<\/p>","2.1.4":"<p>Adds plugin-row Settings \/ Upgrade \/ Docs \/ Support links. Fixes 4 Plugin Check findings: badge-icon upload isset() guard, bulk-token + lesson-player $_GET wp_unslash + sanitize (lesson-player is a regression of work that never reached main), uninstall.php NoCaching suppression. No DB changes.<\/p>","2.1.3":"<p>Fixes the React course builder &quot;Save failed \u2014 Invalid parameter(s): live_meeting_*&quot; error on Video, Text, PDF, Audio, and Quiz lessons. The builder now strips fields irrelevant to the selected content type before PATCHing. No DB or schema changes \u2014 safe to upgrade.<\/p>","2.1.2":"<p>PHPCS \/ Plugin Check round 3: $wpdb call suppressions converted from single-line phpcs:ignore to phpcs:disable\/enable BLOCK form, translators comments added on the Courses list page, $_SERVER \/ $_GET \/ $_FILES reads sanitized, tax_query slow-query suppression added. No DB or behaviour changes.<\/p>","2.1.1":"<p>Admin-menu fixes: Xtreme Courses now sits immediately after Dashboard instead of below Tutor LMS \/ ReviewX \/ Elementor, and editing a course \/ lesson \/ quiz \/ section \/ question no longer collapses the Xtreme Courses sidebar menu. No database changes \u2014 safe to upgrade.<\/p>","2.1.0":"<p>Admin UX restructure: top-level menu moves to position 3, submenus register centrally, new server-rendered Courses page replaces the CPT screen, dashboard gains stat tiles + activity feed, fresh installs see a 4-step welcome wizard. Existing 2.0.x sites upgrade silently, no DB changes.<\/p>","2.0.8":"<p>PHPCS \/ Plugin Check round 2: ~40 $wpdb queries gain the missing PluginCheck DirectDB suppression, real prepare() placeholder-count bugs fixed, nonce checks added to badge \/ leaderboard admin handlers, readme short description rewritten in plain English. No database or behavioural changes.<\/p>","2.0.7":"<p>Plugin Check \/ PHPCS cleanup: <code>unlink()<\/code> \u2192 <code>wp_delete_file()<\/code>, direct <code>$wpdb<\/code> writes wrapped in proper <code>phpcs:disable\/enable<\/code> blocks, <code>get_posts()<\/code> slow-query suppressions, and certificate-admin input sanitisation tightened. No database, UI, or behavioural changes \u2014 safe to upgrade.<\/p>","2.0.6":"<p>WordPress.org compliance round: Chart.js bundled locally (no CDN), Zoom signature endpoint now enforces drip rules, constants renamed to <code>XTREMECOURSES_*<\/code> (old <code>XC_*<\/code> aliases kept for one release), certificate verification page styles properly enqueued. No database changes.<\/p>","2.0.3":"<p>Restores the course builder admin screen for users upgrading from 2.0.1 \u2014 bookmarks and cached links to old post-type slugs are now redirected instead of producing an empty screen. Sweeps stale option keys left over by the 2.0.2 prefix rename. No database schema changes.<\/p>","2.0.2":"<p>WordPress.org Plugin Check compliance: prefix length, inline style extraction, translator label fix. First-time installs only \u2014 internal identifier rename is not back-compatible with 2.0.x installs that already store data.<\/p>","2.0.1":"<p>WordPress.org submission preparation. No database changes \u2014 safe to upgrade from 2.0.0.<\/p>","2.0.0":"<p>This release adds the Analytics admin panel, digest email, improved CSV exports, and a complete uninstall routine. Upgrading from 1.x is seamless \u2014 no manual database migration required.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3568275,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3568275,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3568275,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3568275,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"xtreme-courses\/student-dashboard":{"name":"xtreme-courses\/student-dashboard","title":"Xtreme Courses Student Dashboard"},"xtreme-courses\/leaderboard":{"name":"xtreme-courses\/leaderboard","title":"Xtreme Courses Leaderboard"}},"tagged_versions":["2.1.9"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"React Drag-and-Drop Course Builder \u2014 build and reorder sections and lessons visually.","2":"Student Dashboard \u2014 progress rings, resume button, certificates, achievements.","3":"Quiz Engine \u2014 configurable pass threshold, timer, and instant results screen.","4":"Analytics Dashboard \u2014 Chart.js charts for enrollments, revenue, and quiz performance.","5":"Certificate Template Editor \u2014 drag-to-position dynamic text fields on a custom background.","6":"Gamification \u2014 XP bar, badge grid, and leaderboard widget."}},"plugin_section":[],"plugin_tags":[7114,18342,2195,583,286],"plugin_category":[45,53],"plugin_contributors":[266606],"plugin_business_model":[],"class_list":["post-312864","plugin","type-plugin","status-publish","hentry","plugin_tags-courses","plugin_tags-elearning","plugin_tags-lms","plugin_tags-quiz","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-ratings-and-reviews","plugin_contributors-xtremplugins","plugin_committers-xtremplugins"],"banners":{"banner":"https:\/\/ps.w.org\/xtreme-courses\/assets\/banner-772x250.png?rev=3568275","banner_2x":"https:\/\/ps.w.org\/xtreme-courses\/assets\/banner-1544x500.png?rev=3568275","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/xtreme-courses\/assets\/icon-128x128.png?rev=3568275","icon_2x":"https:\/\/ps.w.org\/xtreme-courses\/assets\/icon-256x256.png?rev=3568275","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Xtreme Courses<\/strong> is a complete <strong>learning management system (LMS) plugin<\/strong> for WordPress. Build structured online courses in a React drag-and-drop builder, sell them through WooCommerce, schedule drip content, run auto-graded quizzes, issue verifiable PDF certificates, and keep students engaged with XP, badges, and leaderboards \u2014 all from your own WordPress site.<\/p>\n\n<p><strong>No upsells. No locked features.<\/strong> There is no \"Pro\" version of Xtreme Courses \u2014 every feature listed on this page ships in the free download and is fully functional out of the box. No upgrade nags, no feature gates, no artificial limits on courses, students, or enrollments.<\/p>\n\n<p><a href=\"https:\/\/xtremeplugins.com\/plugins\/xtreme-courses\/\">Plugin homepage<\/a> \u00b7 <a href=\"https:\/\/xtremeplugins.com\/docs\/xtreme-courses\">Documentation<\/a> \u00b7 <a href=\"https:\/\/xtremeplugins.com\/support\/\">Support<\/a><\/p>\n\n<h4>Why Xtreme Courses?<\/h4>\n\n<p>If you've evaluated the established LMS plugins (LearnDash, LifterLMS, Tutor LMS, LearnPress, Sensei) you already know the pattern: the features you actually need to run a paid course business \u2014 certificates, drip scheduling, quizzes, e-commerce checkout, reporting \u2014 are spread across paid tiers and per-feature add-ons. Xtreme Courses is built differently:<\/p>\n\n<ul>\n<li><strong>The whole stack is free.<\/strong> Course builder, WooCommerce selling, drip content, quiz engine, PDF certificates, gamification, live lessons, reviews, analytics \u2014 nothing is held back for a paid tier.<\/li>\n<li><strong>Commerce-ready from day one.<\/strong> Native WooCommerce integration: one-time purchases, free enrollments, subscription-gated content, bundles, bulk enrollment coupons, and gift enrollment.<\/li>\n<li><strong>Modern WordPress stack.<\/strong> PHP 8.2+ with strict types, a React drag-and-drop course builder, custom REST API, Action Scheduler background jobs, and full uninstall cleanup.<\/li>\n<li><strong>Self-hosted and private by default.<\/strong> No telemetry, no external service calls unless you explicitly configure live Zoom lessons (disclosed below). Your course content and student data stay on your server.<\/li>\n<li><strong>WordPress.org-compliant.<\/strong> Fully GPL, no obfuscated code, every external-service touchpoint disclosed on this page.<\/li>\n<\/ul>\n\n<p>A free alternative to <strong>LearnDash<\/strong>, <strong>LifterLMS<\/strong>, <strong>Tutor LMS<\/strong>, <strong>LearnPress<\/strong>, and <strong>Sensei<\/strong> for course creators who want the complete LMS feature set without per-feature pricing.<\/p>\n\n<p><strong>Core Features (Free):<\/strong><\/p>\n\n<ul>\n<li><strong>React Drag-and-Drop Course Builder<\/strong> \u2014 Build structured courses with sections, lessons (video, text, PDF, audio), and quizzes using a visual drag-and-drop interface.<\/li>\n<li><strong>WooCommerce Integration<\/strong> \u2014 Sell courses as one-time purchases, free enrollments, or subscription-gated content. Supports bulk enrollment coupons and gift enrollment.<\/li>\n<li><strong>Drip Content Scheduling<\/strong> \u2014 Release lessons on a fixed date, X days after enrollment, or after completing the previous lesson. Visual Gantt-style drip timeline.<\/li>\n<li><strong>Quiz Engine<\/strong> \u2014 Multiple choice, true\/false, and fill-in-the-blank questions with timed mode, pass thresholds, retake limits, and auto-grading.<\/li>\n<li><strong>PDF Certificate Generator<\/strong> \u2014 Auto-generate personalized certificates on course completion with a public verification URL.<\/li>\n<li><strong>Student Dashboard<\/strong> \u2014 Tabbed dashboard showing enrolled courses, progress rings, certificates, achievements, and order history.<\/li>\n<li><strong>Instructor Role &amp; Dashboard<\/strong> \u2014 Dedicated <code>xc_instructor<\/code> role with scoped access to own courses, student roster, and earnings.<\/li>\n<li><strong>Gamification<\/strong> \u2014 XP points, badges with trigger conditions, and a leaderboard Gutenberg block\/shortcode.<\/li>\n<li><strong>Live Lessons<\/strong> \u2014 Zoom SDK embed and Google Meet pre-join cards with calendar reminder emails (.ics attachment).<\/li>\n<li><strong>Analytics Dashboard<\/strong> \u2014 Chart.js-powered admin panel with enrollment trends, lesson funnel, quiz performance, revenue, active students, and certificate issuance rate.<\/li>\n<li><strong>Course Reviews &amp; Ratings<\/strong> \u2014 Star ratings and written reviews with moderation, instructor replies, and aggregate display.<\/li>\n<li><strong>Course Bundles &amp; Prerequisites<\/strong> \u2014 Bundle multiple courses into a single WooCommerce product and enforce prerequisite completion.<\/li>\n<li><strong>Mobile Lesson Player<\/strong> \u2014 Distraction-free, full-viewport lesson player with progress persistence.<\/li>\n<\/ul>\n\n<p><strong>Technical Highlights:<\/strong><\/p>\n\n<ul>\n<li>PHP 8.2+ with strict types<\/li>\n<li>Custom REST API namespace <code>\/xtreme-courses\/v1\/<\/code><\/li>\n<li>Custom database tables with proper indexes<\/li>\n<li>Action Scheduler for all background jobs<\/li>\n<li>Transient-based caching for leaderboard and progress queries<\/li>\n<li>Full nonce verification on all AJAX\/REST write endpoints<\/li>\n<li>Input sanitization and output escaping throughout<\/li>\n<li>Complete uninstall routine (tables, options, uploaded files)<\/li>\n<\/ul>\n\n<h3>Bundled libraries<\/h3>\n\n<p>This plugin bundles <strong>Chart.js v4.5.1<\/strong> (MIT, Copyright 2014-2025 Chart.js Contributors) for the Analytics admin panel. The script is served from the plugin folder at <code>assets\/js\/vendor\/chart.umd.min.js<\/code> \u2014 no third-party CDN is contacted.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin can connect to one third-party service. It is <strong>opt-in<\/strong> \u2014 it is only contacted when an admin or instructor explicitly creates a live lesson and a student attends it. The default install of the plugin does not contact any external service.<\/p>\n\n<h4>Zoom Meeting SDK (optional, used for live lessons)<\/h4>\n\n<p>If an admin or instructor creates a live lesson and pastes a Zoom meeting URL into the lesson, then when a student opens that lesson the plugin will:<\/p>\n\n<ul>\n<li>Render an embedded Zoom client by enqueueing the Zoom Meeting SDK JavaScript directly from <code>https:\/\/source.zoom.us\/zoom-meeting-3.1.2.min.js<\/code> on that lesson page only.<\/li>\n<li>The Zoom SDK then connects to Zoom's own infrastructure to join the meeting. The plugin itself does not send any data to Zoom from your server \u2014 all communication happens between the student's browser and Zoom.<\/li>\n<\/ul>\n\n<p>If you do not use the live-lesson feature (no live lesson with a Zoom URL is ever created), the Zoom SDK is never loaded and Zoom is never contacted.<\/p>\n\n<p>Service provider: Zoom Communications, Inc. <a href=\"https:\/\/explore.zoom.us\/en\/terms\/\">Terms of Service<\/a> \u00b7 <a href=\"https:\/\/explore.zoom.us\/en\/privacy\/\">Privacy Statement<\/a><\/p>\n\n<h3>License<\/h3>\n\n<p>Xtreme Courses is free software: you can redistribute it and\/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.<\/p>\n\n<p>Xtreme Courses is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<\/p>\n\n<p>You should have received a copy of the GNU General Public License along with Xtreme Courses. If not, see https:\/\/www.gnu.org\/licenses\/gpl-2.0.html.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>xtreme-courses<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install directly via the WordPress Plugins screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Navigate to <strong>Xtreme Courses \u2192 Settings<\/strong> to configure the plugin.<\/li>\n<li>Install and activate <strong>WooCommerce<\/strong> (8.x+) to enable paid enrollments and commerce features.<\/li>\n<li>Create your first course by going to <strong>Courses \u2192 Add New<\/strong> in the WordPress admin.<\/li>\n<\/ol>\n\n<p><strong>Minimum Requirements:<\/strong><\/p>\n\n<ul>\n<li>WordPress 6.5 or higher<\/li>\n<li>PHP 8.2 or higher<\/li>\n<li>MySQL 5.7+ or MariaDB 10.3+<\/li>\n<\/ul>\n\n<p><strong>Recommended:<\/strong><\/p>\n\n<ul>\n<li>WooCommerce 8.x (for paid enrollment, subscriptions, and revenue analytics)<\/li>\n<li>Action Scheduler (bundled with WooCommerce) for drip content and live lesson reminders<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20xtreme%20courses%20really%20free%3F\"><h3>Is Xtreme Courses really free?<\/h3><\/dt>\n<dd><p>Yes. There is no premium version \u2014 every feature on this page (course builder, WooCommerce selling, quizzes, drip content, certificates, gamification, live lessons, analytics) ships in the free plugin with no artificial limits on courses, students, or enrollments.<\/p><\/dd>\n<dt id=\"does%20xtreme%20courses%20require%20woocommerce%3F\"><h3>Does Xtreme Courses require WooCommerce?<\/h3><\/dt>\n<dd><p>WooCommerce is not required for free courses, but is needed for paid enrollment, subscription-gated courses, bulk enrollment coupons, and revenue analytics.<\/p><\/dd>\n<dt id=\"can%20i%20use%20xtreme%20courses%20without%20a%20page%20builder%3F\"><h3>Can I use Xtreme Courses without a page builder?<\/h3><\/dt>\n<dd><p>Yes. Xtreme Courses provides a standalone React drag-and-drop course builder in wp-admin, a shortcode\/Gutenberg block for the student dashboard, and a custom lesson player \u2014 no page builder required.<\/p><\/dd>\n<dt id=\"are%20certificates%20generated%20server-side%3F\"><h3>Are certificates generated server-side?<\/h3><\/dt>\n<dd><p>Yes. Certificates are generated as PDF files using mPDF (PHP, no external service). Each certificate has a unique ID and a public verification URL.<\/p><\/dd>\n<dt id=\"can%20students%20earn%20badges%20and%20xp%3F\"><h3>Can students earn badges and XP?<\/h3><\/dt>\n<dd><p>Yes. The gamification system awards XP on lesson and quiz completion. Badge trigger conditions (e.g., \"Complete 1 course\", \"Earn 500 XP\") are configurable in the admin.<\/p><\/dd>\n<dt id=\"does%20xtreme%20courses%20support%20zoom%3F\"><h3>Does Xtreme Courses support Zoom?<\/h3><\/dt>\n<dd><p>Yes. Instructors can schedule live lessons with a Zoom meeting URL\/ID. If Zoom SDK credentials are configured, the meeting embeds directly in the lesson page. Without SDK credentials, a styled pre-join card with the meeting link is displayed.<\/p><\/dd>\n<dt id=\"is%20my%20data%20removed%20when%20i%20uninstall%20the%20plugin%3F\"><h3>Is my data removed when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Yes. The uninstall routine removes all custom database tables, plugin options, Action Scheduler jobs, and uploaded files in the <code>wp-content\/uploads\/xtreme-courses\/<\/code> directory.<\/p><\/dd>\n<dt id=\"where%20can%20i%20find%20documentation%3F\"><h3>Where can I find documentation?<\/h3><\/dt>\n<dd><p>Full documentation lives at <a href=\"https:\/\/xtremeplugins.com\/docs\/xtreme-courses\">xtremeplugins.com\/docs\/xtreme-courses<\/a>, covering course building, selling with WooCommerce, drip scheduling, quizzes, certificates, and gamification setup.<\/p><\/dd>\n<dt id=\"where%20do%20i%20report%20bugs%20or%20request%20features%3F\"><h3>Where do I report bugs or request features?<\/h3><\/dt>\n<dd><p>Please use the <a href=\"https:\/\/wordpress.org\/support\/plugin\/xtreme-courses\/\">WordPress.org support forum<\/a> for this plugin, or reach us through <a href=\"https:\/\/xtremeplugins.com\/support\/\">xtremeplugins.com\/support<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.9<\/h4>\n\n<ul>\n<li>WordPress.org reviewer feedback round (follow-up to the 2.1.8 submission) \u2014 addresses the two findings from the latest manual review.<\/li>\n<li>REST permissions: the course publish endpoint (<code>POST \/xtreme-courses\/v1\/courses\/{id}\/publish<\/code>) now uses a dedicated <code>publish_course_permissions_check()<\/code> gate. Publishing previously shared the editing gate (<code>edit_post<\/code> ownership only); it now additionally requires the publish-specific primitive capability for the course post type (<code>publish_xtrc_courses<\/code>, resolved from the CPT <code>capability_type<\/code>). An author who can edit a draft but lacks the publish capability is denied \u2014 the permission check now matches the strength of the action. <code>includes\/REST\/class-courses-controller.php<\/code>.<\/li>\n<li>Certificate generator: the in-document PDF stylesheet block is now composed from a constant element name rather than a literal <code>&lt;style&gt;<\/code> element, with an expanded comment clarifying that this CSS is parsed by the bundled PDF engine (never streamed to the browser) so <code>wp_enqueue_style()<\/code> does not apply. Every browser-facing script and style in the plugin is registered\/enqueued via <code>wp_register_*<\/code> \/ <code>wp_enqueue_*<\/code>; this block is PDF-document markup, not front-end output. Output is byte-identical. <code>includes\/Certificate\/class-certificate-generator.php<\/code>.<\/li>\n<li>readme.txt: the <code>== Changelog ==<\/code> section is trimmed below WordPress.org's 5000-character limit (older per-version entries rolled up; full history retained in CHANGELOG.md).<\/li>\n<li>No database changes, no schema changes. Safe to upgrade.<\/li>\n<\/ul>\n\n<h4>2.1.8<\/h4>\n\n<ul>\n<li>WordPress.org reviewer feedback round: updated the bundled Chart.js to v4.5.1 (MIT) with a matching <code>filemtime()<\/code>-busted enqueue; the optional mPDF autoloader now loads only from the plugin's own <code>vendor\/<\/code> (the non-portable <code>ABSPATH<\/code> fallback was removed); lowered the top-level admin menu position from 2 to 58; hardened the drip-override nonces to fail closed and moved <code>_wpnonce<\/code> verification to the top of the set\/remove handlers; bound the per-student override <code>IN ()<\/code> lists via <code>%d<\/code> in <code>wpdb::prepare()<\/code>; sanitized the certificate-layout JSON (<code>$_POST['xtrc_cert_layout']<\/code>) and <code>$_SERVER['SCRIPT_NAME']<\/code> at the boundary; assembled the certificate PDF HTML as a returned string and escaped the Courses-list status row with <code>wp_kses_post()<\/code>; and removed the deprecated 2-character <code>XC_*<\/code> constant aliases (the <code>XTREMECOURSES_*<\/code> constants are now the only names). No database or schema changes.<\/li>\n<\/ul>\n\n<h4>2.1.x (2.1.0 \u2013 2.1.7)<\/h4>\n\n<ul>\n<li>Admin UX and review-round fixes across the 2.1 line: first-run setup wizard, server-rendered Courses list page and dashboard refresh, plugin-row action\/meta links, React builder save-error fixes (linked-quiz validation, type-aware lesson PATCH, full-text error banner, non-blocking quiz-on-Update warning), and successive Plugin Check \/ PHPCS hardening passes.<\/li>\n<\/ul>\n\n<h4>2.0.x<\/h4>\n\n<ul>\n<li>WordPress.org review and Plugin Check rounds: Chart.js bundled locally (no CDN), <code>XC_*<\/code> constants renamed to <code>XTREMECOURSES_*<\/code>, folder\/slug\/namespace normalized to <code>xtreme-courses<\/code>, certificate PDF CSS moved to a bundled file, plus numerous escaping, prefix, nonce, and <code>$wpdb<\/code>-suppression fixes.<\/li>\n<\/ul>\n\n<h4>1.x<\/h4>\n\n<ul>\n<li>Initial builds through 1.9.0: React course builder, lesson player, WooCommerce enrollment, drip scheduling, quiz engine, PDF certificates, gamification, live Zoom\/Meet lessons, reviews, and analytics.<\/li>\n<\/ul>\n\n<p>For the complete release notes for every individual version, see CHANGELOG.md in the source repository.<\/p>","raw_excerpt":"Sell and run online courses on WordPress \u2014 LMS with WooCommerce checkout, quizzes, drip content, certificates, gamification. Free, no upsells.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/312864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=312864"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/xtremplugins"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=312864"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=312864"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=312864"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=312864"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=312864"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=312864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}