The LifterLMS Course Catalog: Setup, Sorting and Custom Layouts

Set up the LifterLMS course catalog page, control sorting, pagination and which courses appear, then customize the course tiles with shortcodes, blocks, hooks and template overrides without breaking updates.

  • Add as a preferred source on Google
Illustration for “The LifterLMS Course Catalog: Setup, Sorting and Custom Layouts”

The LifterLMS course catalog is the page that lists every course you sell or offer. For many course sites it is the second most visited page after the home page, and it is often the first place a visitor decides whether your courses look worth paying for.

This tutorial is for site owners and developers who want the catalog to do more than show a default grid. You will set up the catalog page, control the order and number of courses, decide which courses appear, build filtered course lists elsewhere on the site, and change what each course tile shows. Every setting and hook below was checked against the LifterLMS 10.3 source.

If you have not created a course yet, start with our guide to creating a course in LifterLMS and come back once you have two or three to list.

How the LifterLMS course catalog works

The catalog is not a block or a shortcode you place on a page. It is the archive of the course post type, and LifterLMS lets you choose which WordPress page acts as that archive. Once you assign a page, the course archive takes that page's URL, so a page with the slug courses serves the catalog at /courses/.

Three things follow from that design:

  • The grid is generated automatically. You do not add the course list to the page yourself. LifterLMS outputs it below whatever content the page contains.
  • The page content becomes an introduction. Text, images or a video you add to the catalog page in the editor appear above the grid.
  • Category, tag, track and difficulty archives behave the same way. They use the catalog's sorting and pagination settings. If a term has a description, that description is shown instead of the catalog page's content.

The setup wizard creates a page called Courses and assigns it for you. If you skipped the wizard or deleted that page, the steps below put it back.

Set up the catalog page

  1. Create a normal WordPress page, for example "Courses". Leave the content empty for now or add a short introduction.
  2. Go to LifterLMS > Settings > Courses and scroll to Course Catalog Settings.
  3. In Course Catalog, select the page you created.
  4. Set Courses per page. The default is 9. Enter -1 to show every course on one page.
  5. Choose a Catalog Sorting option, covered in the next section.
  6. Click Save Changes, then visit the page while logged out to see what visitors see.

Do not use the same page for the course catalog and the memberships page, the checkout page or the student dashboard. Each of those pages has its own job, and sharing one page between them produces confusing results. The LifterLMS course catalog documentation gives the same advice.

If the catalog URL returns a 404 after you change the page or its slug, go to Settings > Permalinks and click Save Changes to rebuild the rewrite rules. The same screen has a LifterLMS Permalinks section where the course, lesson and taxonomy URL bases are set.

Sorting and pagination

Catalog Sorting offers five options:

OptionWhat it doesWhen to use it
Order (Low to High)Sorts by each course's menu order, then by titleYou want full control over which course appears first
Order (High to Low)The same, reversedRarely; useful if you number new courses upward
Title (A - Z)AlphabeticalLarge catalogs that visitors scan by name
Title (Z - A)Reverse alphabeticalRarely needed
Most RecentNewest courses firstSites that publish courses often and want new ones seen

The menu order is the Order field in the Page Attributes panel of the course editor. Give your flagship course a low number such as 1, and leave gaps (10, 20, 30) so you can slot new courses in later without renumbering everything. Courses with the same number fall back to alphabetical order.

For pagination, nine courses fits the default three-column grid in three rows. If you change the number of columns, pick a per-page number that divides evenly so the last row is not half empty. Showing every course with -1 is fine for a catalog of 20 or 30 courses; beyond that, a long single page gets slow to load and hard to scan.

Control which courses appear

Every course and membership has a Catalog visibility setting in the Publish box of the editor. Click Edit next to it and choose one of four options:

  • Catalog & Search: listed in the catalog and in site search results. This is the default.
  • Catalog only: listed in the catalog but excluded from site search.
  • Search only: found by site search but not listed in the catalog.
  • Hidden: listed in neither.

Visibility only controls listings. A hidden course is still reachable at its own URL, and anyone with the link can see its sales page and buy it. That makes Hidden the right choice for a course you sell only through a private link, a course that is bundled inside a membership, or a corporate course you deliver to one client. It is not a way to make a course private. If nobody should buy it, remove its access plans or use a restricted enrollment method.

Drafts never appear in the catalog, so you do not need to hide a course while you are still building it.

Build filtered course lists with the Courses block and shortcode

The catalog page shows everything. Often you also want a smaller list elsewhere: three featured courses on the home page, all courses in one category on a landing page, or a student's own courses on a welcome page. Use the Courses block (in the LifterLMS block category) or its shortcode equivalent, [lifterlms_courses]. Both output the same course tiles as the catalog.

AttributeWhat it doesDefault
categoryLimits the list to a course category, by its slugAll categories
idShows specific courses, as a comma-separated list of IDsAll courses
mineShows the current student's courses: any, enrolled, cancelled or expiredno
hiddenWhether to include courses set to Hiddenyes (included)
posts_per_pageNumber of courses-1 (all)
order / orderbySort direction and field, as in a WordPress queryASC / title

Two details catch people out. First, the block and shortcode include hidden courses unless you say otherwise, which is the opposite of the catalog. Add hidden="no" (or switch the matching block setting off) when a hidden course should stay out of a public list. Second, the block and shortcode ignore the catalog's Courses per page and Catalog Sorting settings; they use their own attributes.

Some practical examples:

[lifterlms_courses category="photography" hidden="no" orderby="menu_order"]

[lifterlms_courses id="412,398,377" orderby="post__in"]

[lifterlms_courses mine="enrolled"]

The second example uses orderby="post__in" so the courses appear in the order you listed the IDs, which is the easiest way to hand-pick a "featured courses" row. The third shows a logged-in student their enrolled courses and a login prompt to everyone else. For the full student area, see our student dashboard guide.

Core has no front-end filter bar where visitors pick a category or difficulty and the grid updates. The usual workaround is a set of links to the category archives, which LifterLMS creates automatically at /course-category/your-category/. Our guide to organizing courses with categories, tags and difficulty covers how to plan those terms. A live, filterable catalog is custom development or a third-party plugin.

What each course tile shows, and how to change it

By default a course tile shows, from top to bottom:

  • The featured video, if Display Featured Video on Course Tile is checked in the course's General settings.
  • The featured image. Set it in the course editor's featured image panel; use the same aspect ratio for every course so the grid lines up.
  • A progress bar, for logged-in students.
  • The title, the author, the Course Length text, the difficulty and the lesson count.
  • The Featured Pricing Information text, which you write yourself in the course's General settings, for example "From $49" or a struck-through old price next to a sale price.

Featured pricing is free text, not a live price. If you change an access plan, update this field too, or your catalog will advertise a price you no longer charge.

Change tiles with hooks

Each tile element is added with an action, so you can remove, reorder or add elements from a small custom plugin or a child theme. The tile template fires lifterlms_before_loop_item, lifterlms_before_loop_item_title, lifterlms_after_loop_item_title and lifterlms_after_loop_item. This example switches the grid to two columns, removes the author and lesson count, and adds a short line of text under the title:

<?php
/**
 * Plugin Name: LLMSX Catalog Tweaks
 */

// Two columns instead of three.
add_filter( 'lifterlms_loop_columns', function () {
	return 2;
} );

add_action( 'init', function () {
	// Remove the author and the lesson count from course tiles.
	remove_action( 'lifterlms_after_loop_item_title', 'lifterlms_template_loop_author', 10 );
	remove_action( 'lifterlms_after_loop_item_title', 'lifterlms_template_loop_lesson_count', 22 );
} );

// Show the course excerpt under the title, on course tiles only.
add_action( 'lifterlms_after_loop_item_title', 'llmsx_tile_excerpt', 12 );
function llmsx_tile_excerpt() {
	if ( 'course' !== get_post_type() ) {
		return;
	}
	$excerpt = get_the_excerpt();
	if ( $excerpt ) {
		echo '<p class="llmsx-tile-excerpt">' . esc_html( wp_trim_words( $excerpt, 18 ) ) . '</p>';
	}
}

These hooks also run on the memberships catalog, which is why the example checks the post type. Some default themes set their own column count through the same filter, so if your change does not take effect, give your filter a later priority.

Change tiles with a template override

When you need different markup, not just different elements, copy templates/loop/content.php from the plugin into lifterlms/loop/content.php in your child theme and edit the copy. Overrides survive plugin updates but not template changes inside them, so check them after each major LifterLMS release. Our article on LifterLMS template overrides explains how to keep them maintainable.

On a block theme, the catalog uses a block template that wraps the same PHP output, so the hooks and overrides above still apply. You can edit the header, footer and surrounding layout of that template in the Site Editor.

Common catalog mistakes

  • Building the grid by hand on the catalog page. Adding a Courses block to the assigned catalog page shows the courses twice. Use the page content for an introduction only.
  • Using a page builder layout on the catalog page. Builders sometimes replace the archive output entirely. If the grid disappears, check the builder's own template settings for archives, or use a separate landing page with the Courses block.
  • Stale featured pricing. The catalog shows what you typed, not what the access plan charges.
  • Mismatched images. Tiles with portrait, landscape and square images make the grid look broken. Pick one size, such as 1200 by 675 pixels, and stick to it.
  • Expecting Hidden to protect a course. It only removes it from listings.
  • Cached catalog pages showing old progress bars. If a page cache serves the catalog to logged-in students, progress bars can show someone else's data or none at all. Exclude logged-in users from page caching.

Frequently asked questions

Can I have more than one course catalog?

Only one page can be the official catalog. You can build as many additional course lists as you like with the Courses block or the [lifterlms_courses] shortcode, filtered by category or by a list of IDs.

How do I hide a course from the catalog but still sell it?

Set its Catalog visibility to Hidden. The course drops out of the catalog and search, but its sales page and checkout still work for anyone with the link.

Why does my catalog show nine courses when I have more?

That is the default Courses per page value. The rest are on page two. Raise the number, or enter -1 to show all courses on one page.

Can visitors filter the catalog by category or price?

Not in core. Category, tag, track and difficulty archive pages give you filtered lists you can link to. An interactive filter needs a third-party plugin or custom code.

Does the catalog work with Elementor, Divi or a block theme?

Yes. The catalog output is standard PHP that the theme wraps. Page builders differ in how they handle archive templates, so test after changing builder settings.

What to do next

Get the basics right first: one catalog page, a deliberate sort order using the Order field, consistent images, and accurate featured pricing. That alone fixes most catalogs that look unfinished. Then decide whether you need filtered lists on landing pages, and whether the tiles should show different information.

If you sell memberships as well as courses, set up the matching page with our guide to the LifterLMS membership catalog. If you want a catalog with filters, search, custom tiles or a layout that matches the rest of your brand, that is the kind of work our LifterLMS customization service handles. Tell us what you have in mind and we will suggest the simplest way to build it.

Add LifterLMS Expert to your preferred sources

Add lifterlmsexpert.com as a preferred source on Google, or open this article in your AI assistant to use it as a source.

  • Add as a preferred source on Google
Free consultation

Prefer expert help over DIY?

Skip the trial and error. Get specialist LifterLMS help and ship faster.

Talk to a LifterLMS Expert Explore our services

Replies within one business day