#ocTEL- an open online course recipe using WordPress

Having recently posted the ingredients card for ocTEL I thought I flesh out some of the details and give ‘mama’s secret recipe’. Like most recipes it’s not perfect and I encourage you to try it yourself and refine where necessary. Also it’s worth remembering that even though the course is in progress the recipe is being continually refined so it might be worth tracking the code and developments announced here.

Look and feel (child theme)

Starting with the basics, ocTEL gets it’s appearance from the Responsive Theme. The advantage of this is it automatically gives us a mobile and desktop friendly interface. Because we were planning a number of customisations we created a child theme (more info. on child themes). Child themeing works well but one issue is as we have customised some of the templates we are now locked into an older version of the parent theme, version 1.8.9.3 (the parent theme is now version 1.9.3).

Registration

Within ocTEL my life is made a little harder because registration is entirely separate to the WordPress site. Ideally I’d just use the Theme My Login and enable the ‘Enable User Moderation’ and ‘Enable Custom E-mail’ modules then moderate new users using admin approval. In Settings > General you would also need to set Membership to ‘Anyone can register’ and ‘New User Default Role’ as Subscriber). In the Theme My Login custom email options I’d direct new users to complete their profile (within ocTEL we use bbPress (a forum plugin) which gives us a nice profile page – I’ll detail how we customise this later).

In ocTEL we still use Theme My Login mainly for a front-end login screen and instead to create the accounts we use the Add Multiple Users (AMU) plugin. When creating usernames the rule of thumb we used was to use the person’s twitter username or combination of firstNameLastName. The reason for using the twitter handle is FeedWordPress (the aggregation plugin we use) tries to match authors to existing user accounts “with the same name as either (1) their login, (2) their display name, (3) their e-mail address (if given), or (4) one of the “aliases” listed in the user’s profile” [Ref].

By using a Twitter handle gives FeedWordPress another dimension to match authors using the theory that your twitter handle may be your ‘nom de plume’ for 3rd party services, hence trying to avoid the situation of users being ‘analytically cloaked’ (Suthers & Rosen, 2011). Logins and passwords generated by AMU were exported back to ALT to allow them to distribute via their mail merge system.

Some additional complication is in the original offsite registration form was that users were asked if they a) wanted to be publically listed, b) receive course related emails. To display course participants we use Author Avatar List which allows you to list users based on role. So by using User Role Editor we duplicated the ‘Subscriber’ role as ‘Subscriber Unlisted’. As AMU lets you define the role for each new user the import data was reshaped in Excel to include this.

As part of the course related emails we were keen where possible to automatically subscribe users to the ‘daily newsletter’. The newsletter is distributed using the MailPress plugin which does have a built-in add-on to synchronise its mailing list with the site users. The problem is there is no easy way to batch subscribe a subset of users who opted for email correspondence, instead you have to dig into the guts of the SQL database (to get easy access to this we use Adminer) and do an import from there. If the course was configured so that the default was you got the daily newsletter but you could opt out on an individual basis this would have been a lot easier as there is a tickbox in the MailPress Settings for newsletter Subscriptions for default on.

Feed aggregation

Like many other similar courses we are using the FeedWordPress plugin to pull data from external feeds. Most of the setting are left as default. Where we perhaps do something different is in the Categories & Tags settings we’ve switched of ‘Match feed categories’ for Categories and then assign the default custom Categories Reader and child category Blog posts.

There are a couple of reasons for doing this. In the Course Reader is programmed to render any posts with the ’Reader’ parent category and when users self-register blogs we wanted them to automatically be assigned these categories. When we register other data feeds like Delicious bookmarks we override the site settings and ‘file’ the feed into a different child category of Reader.

We also use Ada FeedWordPress Keyword Filters which means we avoid the issues of finding participant feeds for particular tags or categories. Instead we instruct participants to include the course tag in their post content or title and then filter using OR ocTEL,octel,OCTEL (the filter is case-sensitive hence the variations)

Registering a blog feed

As part of the profile page we also get users to register their a blog feed, if they have one. I’ve cued up this video clip to show how the process works (you can watch for whole clip to see other profile features). Feed registration is notoriously difficult, feeds aren’t always visible, low general awareness of RSS etc. etc. The solution we’ve come up with is based on Martha Burtis’ Perfecting the Syndicated Blog Sign-Up. The process for doing this is in two parts. On the frontend we attach some jQuery/JavaScript to add some additional functionality to the form fields. When a blog url is entered and a button is clicked an ajax call is made to try auto-detect the RSS feed (the core stolen from Alan Levine). This creates a dropdown list of feed sources which is rendered in the profile edit page. When the profile_update is triggered as well as updating the listed/unlisted status we add the blog rss feed url to the WordPress Links database (see FeedWordPress Basic Concepts). This is done using a modification of Martha’s make_link function. The rough workflow is get the category for FeedWordPress links and build the link item. If a link hasn’t been submitted before (this is recorded in the user’s metadata) insert the link using the build in wp_insert_function (to avoid the stripslashes issue Martha talks about in her post this link is updated with a SQL call). If the user has already submitted a link we overwrite the existing one.

Individual Course Reader Submissions

Other open courses have employed a number of techniques for capturing thoughts, ideas, activity from off the rss beaten track (the ds106 assignment bank immediate springs to mind). Early on in ocTEL we got a request to add someone’s Storyify to the Course Reader. As this had no RSS feed in the user’s profile page we created an individual item submission form. The form uses the User Submitted Posts plugin. In the end it might have been quicker to code this from scratch because the plugin has a number of settings that have to be configured and custom hooks applied.

If this is something you want to use in your own course activate the plugin and in the settings show:

Post URL

Post Title

Post Content

Use the HTML5 form, don’t include JavaScript or targeted loading (we call the form building function in the template). Ignore the category selection for now - I’ll got into how we structured our categories later. Don’t worry about the set assigned author. We chose to publish immediately but you might want to moderate new submissions. An important part is the ‘Use registered user info’. Make sure you tick:

Use registered username for author

Use a hidden field for submitted category

In the category ID you need to find the ID of your chosen categories (you could use the Uncategorised’ ID because as part of our custom processing hook we modify/add it)

Forums

As mentioned earlier we use the bbPress forum plugin in the course. Originally this was included to allow an alternative discussion space for people who were not big users of other social media channels. Beyond some new templates for profile pages the only other code customisation is the integration of a users WP Favorite Posts. Several bbPress specific add-ons are used to improve functionality listed in the ocTEL recipe card, denoted by bbPress or bbP (one additional plugin recently added is bbPress Pencil Unread). These plugins are mainly used to enable extra functionality for administration, navigation and notification. Within the forum settings (Settings > Forum) with these plugins enabled gives you some extra control. For the next iteration of this one change we’d probably make is flip the threaded reply order to newest first.

MailPress custom theme

A big aspect of our course configuration is the daily newsletter summary of course activity. This is handled by the MailPress plugin. MailPress includes a number of additional add-ons which you can selectively enable (Plugins > MailPress Add-ons). The ones we have on are:

Disclaimer

The views I express here are mine alone and do not necessarily reflect the views of my employer or any other party.

All code, applications and templates on this site are distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.