Inside a LearnPress customization project
How LearnPress stores things
LearnPress keeps courses, lessons, quizzes and questions as WordPress post types (lp_course, lp_lesson, lp_quiz, lp_question) and orders as lp_order. What a learner has enrolled in, started and finished lives in its own tables, with learnpress_user_items at the center, and the curriculum order sits in section tables. That split matters. A page builder or an SEO plugin can see the course post, but anything about progress needs a query against the LearnPress tables or a call to its API. Custom reports, CRM syncs and migrations all start there.
Theme overrides are the usual culprit
LearnPress lets a theme replace any template by placing a copy in a learnpress folder. Education themes use that heavily, which is why two LearnPress sites can look nothing alike. It is also why updates hurt: the plugin moves on, the theme copy stays as it was, and a hook the lesson page depends on never fires. On every project we diff the theme overrides against the plugin templates for the installed release and list which ones are stale. Where a change can be made with an action or filter instead of a copied file, we do that, because a hook keeps working when the template around it changes.
Selling through built-in orders or WooCommerce
LearnPress has its own cart, checkout and order records, and for a school selling single courses that is enough. It starts to strain when you want coupons with rules, tax handling per country, PDF invoices, subscriptions or bundles. At that point we usually connect WooCommerce and let it own the money side while LearnPress owns access. The decision should be made once and early, since existing order records and enrollments have to stay valid after the switch.
Fewer add-ons, each one accounted for
The free core plus add-ons model is good value until the add-on list becomes the maintenance problem. We do not remove things for the sake of it. Each add-on gets a line in a short document: what it provides, which pages or courses rely on it, when it was last updated. Three small add-ons that each add one field or one email are often cheaper to replace with a single site plugin we write and you own. A gateway or certificate add-on from the plugin author usually stays.
Testing with learner accounts
Admin accounts skip most LearnPress restrictions, so a change that looks fine to you can block a student. We test as a guest, a new learner, an enrolled learner, an instructor and a co-instructor: buy, enroll, finish a lesson, fail and retake a quiz, complete the course, download the certificate. The same script runs again on staging after each plugin or theme update.