What a review of my WordPress LMS Plug-in found

A line-by-line review of my WordPress LMS plugin found finished students locked out, blank answers marked right, and no way for other plugins to join in.

AccessNow LMS: what a review of my LMS found. Three serious bugs fixed and thirteen places for other plugins to plug in.

AccessNow LMS is the small WordPress LMS plugin I use to run online courses: units, lessons, quizzes, progress tracking and certificates, with no page builder and nothing phoning home. I first wrote it to help train referees for the 2026 Soke Cup, after a major rewrite of the tournament rules meant every referee, judge and coach had to relearn them. It needed a Japanese version right from the very beginning. The rules course has 24 lessons, 20 quizzes and 145 questions. Until this month the plugin was called Simple LMS, and it runs on only a couple of sites, including that one.

Before putting it on wordpress.org for anyone to install, I had the code reviewed line by line and compared with the big names: LearnDash, Tutor LMS, LearnPress, LifterLMS, Sensei and half a dozen others. This is what that review found, what I changed, and the one problem I hadn’t thought of at all.

The review started with good news, which decided what not to touch. AccessNow LMS can ask students to redo a lesson when you change it, which none of the major free LMS plugins does out of the box; for a rules course that matters, because someone who passed last year’s rules hasn’t learned this year’s. It keeps each student’s history when they retake a course, and it stays light: no upsell banners, and your data kept unless you choose to delete it.

Students who finished were locked out

The worst bug only showed up after success. A student who completed a course could still open it, but every lesson they had finished showed as not done, their quiz history was blank, and pressing Mark complete told them they weren’t enrolled. Different screens were asking two different questions: one asked “is this person enrolled?”, the rest asked “are they enrolled and still working on it?”. For a finished student the answers disagreed.

It was worse than untidy. Because finished students looked like strangers, they could never redo a lesson I had changed, so the feature I was proudest of didn’t work for exactly the people it was for. Now finished students keep full access. If a lesson changes or a new one is added, their course quietly goes back to “in progress”, and it completes again when they catch up, with the same certificate and no second congratulations email.

A blank answer could be marked right

In a multiple-choice question the choices are numbered from zero, and an unanswered question also came through as zero. So when the right answer happened to be the first option, or “True”, a blank was marked correct. That isn’t rare: when a timed quiz runs out it submits whatever is there, half-answered questions included. A blank is now always wrong.

A time limit only the browser knew about

Quizzes can have a time limit, but the clock lived in the student’s browser. Opening the quiz in a new tab, or clearing the browser’s memory, started it again. Now the website keeps the time. The clock starts the moment the quiz is first opened and carries on through reloads and new tabs.

Two details took some thought. Browsers slow down timers in background tabs, by up to a minute, so an answer that arrives up to 60 seconds late still counts; later than that scores zero. And a student could have let the time run out without submitting, then come back for a fresh clock and as long as they liked with the questions. Walking away now counts as an attempt scoring zero, marked Timed out so it doesn’t look like a string of wrong answers.

A plugin nothing else could talk to

The finding I hadn’t thought of at all: AccessNow LMS had no way for any other plugin to join in. Most of what the bigger LMS plugins sell, such as taking payment before someone can enrol, opening lessons a week at a time, or telling a mailing list when someone finishes, is built on small, published places where another plugin can listen or have its say. AccessNow LMS had none.

Diagram: when a student finishes a course, the LMS announces it and its certificate, points and email act on it, as can another plugin; when someone presses Enrol Now, a payments or prerequisite plugin can say not yet, and if nobody objects they are in.
Thirteen places for other plugins to join in. The LMS’s own certificate, points and emails now use the same ones.

So now it announces things as they happen: a student enrolled, finished a lesson, submitted a quiz, completed a course, earned a certificate. And it asks before it lets something through: may this person enrol, may they open this lesson, should this email go out. A payments plugin can answer “not until they’ve paid” without a single change to the LMS.

I moved the plugin’s own emails and points onto those same announcements rather than keeping them as special cases, so they are tested every time anyone uses a course. That paid off immediately: it showed that clicking Enrol twice had always sent the welcome email twice.

The checks that said everything passed

I wrote automated checks for each fix, which run the real plugin on a throwaway test course with throwaway students. The traps here were my own. Halfway through, three checks failed and the script still announced “all passed”: a mistake in the checking script itself, which had hidden nothing so far but would have hidden everything. And the instructions that build the plugin’s database tables turned out to be written in a way WordPress could only use once, so any future change to them would have reached new sites and silently skipped every existing one.

Fixing that one turned up something real. I checked a copy of the one live site still running the old Simple LMS, without touching the site itself, and found it was missing the safeguard that stops points being counted twice. An earlier upgrade had skipped a step. The new version puts it back when it’s installed, tidying any duplicates first.

There are 177 of those checks now, and they run before every change.

What happens next

The review also listed what the free competitors have that AccessNow LMS didn’t. The five I built before launch, from blocks to quiz explanations, are in Five things my LMS needed before launch. Its help articles are already up.

Everything about the plugin, including how to get it, is on the AccessNow LMS project page. It’s on its way to wordpress.org, and I’ll post here when you can install it from Plugins → Add New.

To see it working, take the free beginner’s guitar course built with it, as a student would. The same course is on the project page as a download, to import into your own site.

martin Avatar

Written by

Previous post
Next post

More from the blog