Template Overrides
Template Overrides
Section titled “Template Overrides”Learnomy renders its front end from PHP templates you can override from your theme — the same pattern WooCommerce uses. You never edit the plugin; you drop a copy of the template into your theme and change that copy. Your version survives plugin updates.
How it works
Section titled “How it works”There is one rule: copy the plugin template into your theme under learnomy/,
keeping the same path, and edit the copy.
Plugin file: wp-content/plugins/learnomy/templates/course/partials/enroll-card.phpYour override: wp-content/themes/your-theme/learnomy/course/partials/enroll-card.phpLearnomy checks your theme first and falls back to its own copy, so you only override the files you want to change — never the whole set. Use a child theme so your overrides are not lost when the parent theme updates.
The exact override path is also printed for you in Learnomy → Settings → (the template path is shown there), so you never have to guess.
One root for Free and Pro
Section titled “One root for Free and Pro”The same rule covers Pro. Pro’s front-end course builder templates live in the Pro plugin, but they override under the same theme root, namespaced by the extension:
Plugin file: …/learnomy-pro/…/frontend-builder/templates/partials/quiz-editor.phpYour override: wp-content/themes/your-theme/learnomy/frontend-builder/partials/quiz-editor.phpOne convention, everywhere: {theme}/learnomy/<same-path-as-the-plugin-file>.
Blocks are not overridden as files
Section titled “Blocks are not overridden as files”You do not override Gutenberg blocks by copying a block file. There is nothing extra to learn, because a block’s look comes from the same partials you already override:
- The Course Card, Course Grid and Course Catalog blocks all render
partials/course-card.php. - The Progress Bar, My Progress and Student Dashboard blocks render
partials/progress-bar.php.
So overriding partials/course-card.php (Tier 1) updates every course-card block on the
site automatically — one override, everywhere. A block’s layout and options (columns,
counts, what to show) are set where you place it, in the block editor.
Most developers only need Tier 1. The lists further down are a complete reference, not a to-do.
Choosing the right file: layouts
Section titled “Choosing the right file: layouts”The three most-overridden surfaces — course archive, single course, and single lesson — each ship in more than one layout style, and you can only override the file for the style your site is actually using. Copying a different layout’s file does nothing, which is the number-one reason an override “doesn’t work.”
Your active layout is set in Learnomy → Settings → Layouts. Match it to the file:
| Surface | Layout (Settings → Layouts) | File to override (under {theme}/learnomy/) |
|---|---|---|
| Course archive | Grid (default) | catalog/grid.php |
| Filter sidebar | catalog/sidebar.php |
|
| Single course | Classic (default) | course/classic.php |
| Hero / landing | course/hero.php |
|
| Focused | course/focused.php |
|
| Split / magazine | course/split.php |
|
| Single lesson | Focus (default) | lesson/focus.php |
| Embedded in theme | lesson/embedded.php |
Example: if your course archive is set to Filter sidebar, override
{theme}/learnomy/catalog/sidebar.php — not catalog/grid.php. The shared partials
each layout pulls in (enroll-card, breadcrumb, course-card, the lesson player content)
are the same across layouts, so overriding a partial works no matter which layout you run.
What you keep when you override
Section titled “What you keep when you override”A template is just markup plus the data Learnomy hands it. When you override one:
- Keep the variables it reads (
$course,$lesson, the arrays it loops). They come from Learnomy — if you remove them, the template renders blank. - Keep the
do_action()/apply_filters()hooks inside it. Other features (and Pro) attach to them; drop a hook and you silently disable something. - Keep
data-wp-*attributes on interactive templates (quiz player, lesson player). They wire the front-end behaviour; without them the interaction stops working. - Restyle freely: markup, classes, order, your own HTML around Learnomy’s.
Tier 1: Commonly overridden
Section titled “Tier 1: Commonly overridden”The branded, customer-facing surfaces. This is where almost all real customization happens — mostly markup and styling, low risk.
| Surface | Override path (under {theme}/learnomy/) |
What it is |
|---|---|---|
| Course page layout | course/classic.php, course/split.php, course/hero.php, course/focused.php |
The single-course page. One file per layout style; override the one your courses use. |
| Enroll / buy card | course/partials/enroll-card.php |
The sidebar card with the price and the enroll / buy button. |
| Mobile buy bar | course/partials/sticky-buy-bar.php |
The sticky buy button on mobile. |
| Course hero | course/partials/hero.php |
The course header (title, meta, image). |
| Intro video | course/partials/intro-video.php |
The course preview / promo video block. |
| Course body | course/partials/body.php |
The course description + curriculum body. |
| Catalog grid | catalog/grid.php |
The course archive grid. |
| Catalog sidebar | catalog/sidebar.php |
The catalog filters. |
| Category archive | category-archive.php |
A single course-category page. |
| Course card | partials/course-card.php |
The course tile shown in every listing. The most reused branded element. |
| Certificate page | certificate-verify.php |
The public certificate verification page. |
| Membership pricing | membership-pricing.php |
The membership plans / pricing page. |
| Membership manage | membership-manage.php |
The member’s manage-subscription page. |
| Membership plan card | partials/membership-plan-card.php |
A single plan card in the pricing table. |
| Breadcrumb | partials/breadcrumb.php |
The breadcrumb shown across course and account pages (Free + Pro). |
| Account nav | partials/account-nav.php |
The account-area side navigation. |
| Account page header | partials/account-page-header.php |
The header row on account pages. |
| Review card | partials/review-card.php |
A single course review. |
| Review form | partials/review-form.php |
The leave-a-review form. |
| Progress bar | partials/progress-bar.php |
The course-progress bar. |
| Course completion | partials/course-completion.php |
The “course complete” state. |
| Student registration | register-student.php |
The student sign-up page. |
| Instructor registration | register-instructor.php |
The instructor sign-up page. |
| Become an instructor | become-instructor.php |
The instructor application page. |
Tier 2: Advanced
Section titled “Tier 2: Advanced”Functional templates with a real data contract. You can override them, but read the plugin file first and keep the variables and hooks it uses.
Dashboards & account pages
Section titled “Dashboards & account pages”| Override path | What it is |
|---|---|
student-dashboard.php |
Student dashboard shell. |
instructor-dashboard.php |
Instructor dashboard shell. |
instructor-profile.php |
Public instructor profile. |
instructor-section.php |
An instructor-dashboard section. |
instructor-students.php |
The instructor’s students list. |
account-billing.php |
Account → billing. |
account-certificates.php |
Account → certificates. |
account-courses.php |
Account → my courses. |
account-details.php |
Account → details. |
account-instructor-profile.php |
Account → instructor profile edit. |
account-quiz-results.php |
Account → quiz results. |
Dashboard widgets are grouped separately — see Dashboard widgets below.
Lesson player
Section titled “Lesson player”lesson/embedded.php, lesson/focus.php, lesson/partials/completion.php,
lesson/partials/curriculum-sidebar.php, lesson/partials/media.php,
lesson/partials/player-content.php, lesson/partials/surface.php,
lesson/partials/side-nav-item.php.
The player is driven by the WordPress Interactivity API. Keep the
data-wp-*attributes or lesson navigation and completion stop working.
Quiz player
Section titled “Quiz player”single-quiz.php, quiz/classic.php, quiz/focused.php, quiz/sectioned.php,
quiz/conversational.php, quiz/review-board.php, partials/quiz-attempt-review.php,
partials/quiz-resume-banner.php, partials/quiz-start-screen.php,
partials/quiz-gate.php.
Same Interactivity-API caveat as the lesson player.
Checkout
Section titled “Checkout”checkout.php, checkout-thank-you.php, checkout-cancelled.php.
Safe to restyle. Do not remove the gateway fields or hooks — payment breaks silently.
Catalog & curriculum internals
Section titled “Catalog & curriculum internals”catalog/partials/results.php, catalog/partials/access-notice.php,
catalog/partials/search-suggest.php, partials/curriculum.php,
partials/curriculum-drawer.php.
Navigation & miscellaneous
Section titled “Navigation & miscellaneous”partials/instructor-nav.php, partials/pagination.php, partials/lesson-locked.php,
partials/membership-invoice-row.php.
Tier 3 — Internal (not recommended)
Section titled “Tier 3 — Internal (not recommended)”These resolve through the same override system — nothing is special-cased — but they are plumbing, not branded surfaces. Overriding them usually breaks something. Listed here only so the map is complete; leave them alone unless you know exactly why.
| Override path | What it is / why to leave it |
|---|---|
partials/skeleton-course-card.php |
Loading placeholder. Nothing to brand. |
partials/skeleton-table-row.php |
Loading placeholder. |
partials/lrn-action.php |
The shared button/link renderer. Change it and every button shifts. |
partials/dashboard-widget-shell.php |
Structural wrapper around every widget. |
partials/instructor-dashboard-ctx.php |
Context bootstrap; emits no visible markup. |
partials/stat-card.php |
Generic stat tile reused across many screens — override once, change everywhere unexpectedly. |
partials/quiz-question.php |
Interactivity-bound question renderer; part of the quiz engine. |
partials/notification-bell.php |
JavaScript-driven widget. |
partials/admin-empty-state-pro.php |
Admin-side upsell notice. |
offline.php |
PWA offline fallback page. |
my-spaces-stub.php |
Internal stub. |
Dashboard widgets
Section titled “Dashboard widgets”Every dashboard widget renders from a data array Learnomy passes it. Each is overridable at
{theme}/learnomy/dashboard-widgets/<role>/<name>.php, but they are advanced — keep the
data the widget reads. Front-end dashboards are the student and instructor widgets;
the admin widgets render inside wp-admin, which themes rarely restyle.
Student widgets (dashboard-widgets/student/)
Section titled “Student widgets (dashboard-widgets/student/)”announcements.php, certificates.php, continue-learning.php, courses-preview.php,
enrollments.php, membership.php, quiz-scores.php, recent-activity.php,
recommendations.php, streak.php, today-agenda.php.
Instructor widgets (dashboard-widgets/instructor/)
Section titled “Instructor widgets (dashboard-widgets/instructor/)”awaiting-grading.php, compose-announcement.php, earnings.php, engagement.php,
funnel.php, my-courses.php, my-courses-rows.php, pending-reviews.php,
qa-inbox.php, recent-enrollments.php, revenue-trend.php, students-at-risk.php.
Admin widgets (dashboard-widgets/admin/) — wp-admin, rarely overridden
Section titled “Admin widgets (dashboard-widgets/admin/) — wp-admin, rarely overridden”completion-top-courses.php, demo-alert.php, email-log-summary.php, new-signups.php,
onboarding.php, pending-applications.php, quick-actions.php, recent-transactions.php,
refund-overview.php, stats.php, system-health.php, top-instructors.php, trends.php,
view-frontend.php.
Pro front-end builder
Section titled “Pro front-end builder”The Pro course builder (the instructor’s front-end authoring UI) overrides under the same
root, namespaced frontend-builder/:
frontend-builder/course-builder.php, frontend-builder/course-editor.php,
frontend-builder/lesson-edit.php, frontend-builder/quiz-edit.php,
frontend-builder/partials/lesson-editor.php, frontend-builder/partials/lesson-live-fields.php,
frontend-builder/partials/quiz-editor.php.
The builder is heavily JavaScript-driven. Override only for cosmetic tweaks, and keep the element IDs and
data-*attributes the builder scripts depend on.

