The LifterLMS Pricing Table: Block, Shortcode and Layouts
How the LifterLMS pricing table decides what to show, how to place it with the Pricing Table block or shortcode, how to structure plans that convert…
Read articleThe 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.
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 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.
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.
Catalog Sorting offers five options:
| Option | What it does | When to use it |
|---|---|---|
| Order (Low to High) | Sorts by each course's menu order, then by title | You want full control over which course appears first |
| Order (High to Low) | The same, reversed | Rarely; useful if you number new courses upward |
| Title (A - Z) | Alphabetical | Large catalogs that visitors scan by name |
| Title (Z - A) | Reverse alphabetical | Rarely needed |
| Most Recent | Newest courses first | Sites 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.
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:
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.
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.
| Attribute | What it does | Default |
|---|---|---|
category | Limits the list to a course category, by its slug | All categories |
id | Shows specific courses, as a comma-separated list of IDs | All courses |
mine | Shows the current student's courses: any, enrolled, cancelled or expired | no |
hidden | Whether to include courses set to Hidden | yes (included) |
posts_per_page | Number of courses | -1 (all) |
order / orderby | Sort direction and field, as in a WordPress query | ASC / 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.
By default a course tile shows, from top to bottom:
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.
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.
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.
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.
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.
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.
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.
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.
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.
How the LifterLMS pricing table decides what to show, how to place it with the Pricing Table block or shortcode, how to structure plans that convert…
Read article
Every LifterLMS block in the WordPress block editor, what each one shows, where it works, how enrollment visibility controls work, and practical…
Read article
How to export a LifterLMS course to a JSON file, import it on another site, clone a course in one click, and reuse lessons with Add Existing Lesson…
Read articleSkip the trial and error. Get specialist LifterLMS help and ship faster.