Courses & the library
Academia never registers a course content type of its own. A theme that owned your courses would take them with it when you changed theme, so the theme only reads — through an adapter that resolves one source per request, in this order:
| Priority | Source | What you get on a card |
|---|---|---|
| 1 | Academia Library (academia_course) |
Everything: level, duration, lessons, price, offer price, instructor, rating, reviews |
| 2 | An LMS — Tutor, LifterLMS, Sensei, LearnDash | Whatever that plugin records, mapped onto the same fields |
| 3 | Plain posts in a courses category |
Title, excerpt, image, author, and reading time in place of duration |
All three render through the same card, so switching source changes the data and not the design.
Academia Library
The free companion plugin. It adds:
- a Course content type, with a Subjects and a Levels taxonomy
- eight fields — duration, lessons, level, price, offer price, instructor, rating, reviews — all exposed to the REST API and individually sanitised
- sortable Level, Duration and Price columns on the courses list
- Tools → Academia courses, which creates nine example courses across three subjects and three levels so no section is empty while you build
- the enhanced course browser: filtering, searching, sorting and pagination with no page load
Download it from the Academia page. It updates through the Plugins screen like anything else.
Adding a course
Courses → Add course. The title, the editor and the featured image work as they do for a post. The Course details panel on the right holds the eight fields; every one is optional, and a card only shows the facts it actually has.
Leave Price empty for a free course — that is different from entering 0,
which is a course priced at zero. A card shows Free for the former.
The course browser
[academia_course_browser] renders the search box, the subject and level
selects, the sort control and the results. It is the Courses: filter and search pattern, and it is already on the Courses page every starter builds.
It works without JavaScript. The server renders the finished result for whatever is in the query string, and the script only intercepts the form to avoid the reload. With scripts blocked you get a visible Apply filters button and ordinary page loads.
Putting courses on a page
Two shortcodes, both usable in any page or post:
[academia_courses number="6" columns="3"]
[academia_courses number="3" columns="3" category="design" level="beginner" orderby="price"]
[academia_course_browser number="9" columns="3"]
Shortcodes rather than blocks for a reason: starter sites and the front-page setup expand patterns into real post content so you can edit the words, and PHP inside stored content never runs. A shortcode is stored as text and executed every time the page renders, so it keeps working wherever it ends up.
Course URLs
With the plugin active:
- the archive is at
/courses/ - a course is at
/courses/{slug}/ - a subject is at
/subject/{slug}/ - a level is at
/level/{slug}/
If you want a different base, change the rewrite slug with the
register_post_type_args filter and flush your permalinks.
Academia will not let a starter create a page whose slug collides with the
course archive — a "Courses" page at /courses/ would be unreachable behind the
archive, so the starter links the menu at the archive instead.