I have a site where I teach courses. I want to have my courses run each quarter. So I would have

Course 1 - Fall 2019
Course 1 - Winter 2019
Course 1 - Spring 2020
Course 1 - Summer 2020

The course content exists as one collection of posts (each content type a custom post type - so course, lesson, topic). For instance

Course 1
   Lesson 1
      Topic 1
      Topic 2
   Lesson 2

So I need a way to enroll students into a course during a quarter of their choosing. Also, each course and its quarter has separate forums (announcements, class discussions, assignment) and I need to control forum access based on the groups.

How to handle this? I thought maybe best way, conceptually is

  1. Upon course creation, create 4 groups corresponding to quarters, as well as forums. There would be table

group_id    course_id    start_date

I am using BBPress, and so I would have table (or post meta data) associating a forum with a group, like

group_id      forum_id

  1. Show available quarters on course registration page. Show 4 at a time. Periodically run cron job, to see if a new quarter has come about and add a new group if needed. This way visitors always see next 4 quarters.

  2. When user enrolls in selected quarter, add them to group. So there would be table


id     user_id     group_id

As far as routing,

  1. When user goes to a course page courses.com/course1 check their group and determine access based on group.

Or would you recommend different approach? I am trying to avoid query vars in the url. I don't want to use courses.com/fall2019/course1.

And here is major wild card - the first lesson in a course is always free. That means for guest visitors, when they are on courses.com/lesson1 they see Course1->Lesson1 content, with forum links for the course forums corresponding to current quarter.

Anyway, before I work all this out, curious what you recommend.



1 Answer 1


This question points out a general problem that business stakeholders have when trying to source software. You have ideas in your head, but you don't know how to transfer the IDEA into an actionable specification.

I recommend you try Behavior Driven Development. Figure out what you want first, then detail the system in terms of "should" statements. i.e.

"The students should be able to access the course on Monday."

These "should" statements can be handed to a professional developer to turn it into a prototype of an actual working software package.

  • This isn't a massive project - just a site for me to teach guitar lessons. I've already done most of the customization which amounted to about 3000 lines of code, just need to get group based access control set up as final stretch and am curious if my proposed approach is sensible. If so, implementing is not a show stopper and will take me a few days to code. I stepped through PHPStorm debugger and found the necessary hooks and filters that the LMS uses for access control, so modifying the system's behavior looks pretty straight forward. Mainly I am interested in my proposed table structure.
    – Brian
    Commented Dec 9, 2019 at 19:02
  • Well.. There are 30k lines of code in WordPress TOTAL, so your "not a massive project" is already 10% of the entire codebase. From what you described, it should be more like 30 lines of code, not 3000. Hire a dev. :)
    – John Dee
    Commented Dec 9, 2019 at 19:31
  • Keep in mind,CSS adds up,etc, as well as views/templates.And spaces between lines - so we are not talking 3000 pure lines.In total, with no 3rd party plugins, having already coded a sockets-based real time student notification system via Pusher library;course task/grade tracker; numerous custom fields/meta boxes (not using junk like ACF, etc);custom Gutenberg React blocks;Stripe payments/webhooks; Mailchimp course group sync; notification triggers/crons integrated across email, Pusher, OneSignal library;Zoom webinar webhooks, why on earth would I hire a dev to this coding step? Bizarre logic.
    – Brian
    Commented Dec 10, 2019 at 9:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.