Skip to content
Learnomy

Template Overrides

Free & Pro

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

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.