Template Overrides
Free & ProLearnomy 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
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.php
Your override: wp-content/themes/your-theme/learnomy/course/partials/enroll-card.php
Learnomy 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
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.php
Your override: wp-content/themes/your-theme/learnomy/frontend-builder/partials/quiz-editor.php
One convention, everywhere: {theme}/learnomy/<same-path-as-the-plugin-file>.
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
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
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
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
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
| 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
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
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
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
catalog/partials/results.php, catalog/partials/access-notice.php,
catalog/partials/search-suggest.php, partials/curriculum.php,
partials/curriculum-drawer.php.
Navigation & miscellaneous
partials/instructor-nav.php, partials/pagination.php, partials/lesson-locked.php,
partials/membership-invoice-row.php.
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
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/)
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/)
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
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
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.