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.