For developers
The public interfaces POM LMS offers to themes and integrations: the access helpers, the completion helpers, the video helpers, the filters that let you extend courses and settings, and the template hooks.
In this chapter
| Topic | Article |
|---|---|
| Courses, lessons and where their data lives | The content model |
| The rule every integration must follow | The access control contract |
| Checking course access | The course access helper |
| Checking lesson access | The lesson access helper |
| Evaluating a permission rule | The permission access helper |
| Checking a purchase | The purchase access helper |
| Reading and writing progress | Completion helpers |
| Rendering lesson videos | Video helpers |
| Adding fields to courses and lessons | Extending the course metabox |
| Adding settings sections | Extending the settings |
| Working with the My courses endpoint | My courses endpoint integration |
| Finding courses and lessons | Queries and URL helpers |
| Rendering inside course and lesson pages | Template integration |
| Handling student data responsibly | Security and data handling |
What is stable
The interfaces documented in this chapter: the pom_lms_* helper functions described here, the two filters, and the theme's post-single template actions.
Anything not documented here — internal classes, template file structure, script handles, the shape of stored values — can change between releases. If you need something that is not covered, ask before building on it.
Requirements
POM LMS requires POM Theme, and its access helpers require the theme's permission-rule support. Purchase-based access requires WooCommerce, and subscription conditions additionally require the WooCommerce subscriptions extension.
Guard your integrations accordingly:
if ( ! function_exists( 'pom_lms_user_can_access_course' ) ) {
return;
}
A function_exists() check is the supported way to detect POM LMS. There is no version constant to branch on in your own code.
The one rule
If your integration renders course or lesson content anywhere — a shortcode, a widget, a REST response, an email — it must call the access helper first. See The access control contract.
Everything else in this chapter is convenience. That one is not.