I believe we’ve developed a pretty solid pattern for making WordPress do what faculty want and making that happen pretty quickly. We have high goals in terms of taking on additional challenging work while also supporting a lot of things and a lot of people so we’ve had to be fairly pragmatic in terms of workflow.
There are three types of development we tend to do. I’ll list them below in terms of escalating complexity/time. I’ll explain what plugins and patterns we use to make this work. I know I’ve hashed through this plenty of times before in individual explanations but felt that putting in together in one place might help people, myself included, see the big picture.
On the Fly
These are changes we can usually make within minutes and often do with the faculty there with us or based on an email request. These types of requests are usually around tweaking themes (hide something or show something extra) or creating simple content-creation workflows for students. These are all things that could be addressed with custom themes/plugins but if they are relatively minimal and unlikely to be replicated by others, we go with what’s already in existence.
Theme Tweak Patterns
Since WordPress started allowing custom CSS in the customizer, that’s been a straightforward path for removing things people don’t like. Our good friend display: none; takes care of many things.1 I often2 take the customized CSS and throw in a gist with the URL of the site in the notes.
Data Display/Navigation Construction
The other common pattern is the desire to display certain content on a page/post based on categories, tags, or page structure. It’s usually the desire to build something like a magazine front page or automatically build some internal page navigation.
If the desired content are posts, then Bill Erickson’s Display Posts shortcode plugin is your best friend. The display parameters let you do just about anything you can think of. You can see two recent examples of how I use Display Posts in this post. This post shows a more complex implementation that blends Gravity Forms and Display Posts to build content on the fly.
When the content you’re looking to tie in is pages, I rely on the Page List plugin. Alan tipped me off to this one way back when and it’s very useful especially as many faculty intuitively build sites based on pages. This is another plugin that has an amazing number of shortcode options.
Guided Content Creation
We often have faculty or students trying to get people to write structured content. The goal is usually to have a consistent look to the posts as well as scaffolding the thought going into creating the content. I’ve written a ton of posts on this site on how to do this with Gravity Forms. The form submission to post workflow and templating options are limited only by your imagination. The conditional content display template shortcodes are incredibly useful. The ability to dynamically populate fields via shortcode or url parameters is also highly useful. The URL path is something I used in our Field Botany course and demonstrate in Gravity Forms and in Google Forms in this post.
Part of the positives for using Gravity Forms this way is that faculty can modify the form without needing technical skills. It’s also a form that can be used for lots
Custom Plugins and Themes
For the longest time, I made custom themes/plugins only as an absolute last resort.3 As I got better at programming4 and Jeff and Matt joined the team we began to do this more regularly. At this point we usually have a couple of custom themes in development at any moment and have built out quite a few plugins. Not that scale is a great measure for success here but you can see around 90 repositories on our GitHub.
The majority of these themes are what I’d consider level one. With themes, it’s not a fully bespoke creation. It’s usually just an extension of what WordPress normally does. The customization is focused more on display and basic data structures with accompanying changes in backend authoring patterns. With plugins, we’re extending something internal to WordPress already, integrating a library from another source, or creating something that expands an existing plugin/theme interaction.
We use Understrap as a starter theme and Advanced Custom Fields for backend authoring structure/display tweaks. While we’re still a small team adding consistency in these realms has helped increase speed and reduce confusion when collaborating.
Using Understrap gives us an established and well thought5 out structure for the theme and how the files are organized. When we create a custom post type and generate a new template, there is a consistent pattern to it that we all know and can all follow. Understrap is also based on Bootstrap which, while a pain in some ways,6 gives us a consistent setup that each person knows pretty well. Just those two things make a pretty big difference as we share or pass-off projects. And to take it a bit deeper, that’s what WordPress gives us as well. It’s a fairly well understood system for development and for the authoring of content.
ACF shapes the backend authoring experience while the custom theme provides larger data structures like custom post types and displays the information ACF provides from the backend. We also entwine some workflows with Gravity Forms or Advanced Forms to provide ways to enter structured information without needing to go to the backend of the site. In many cases we could make this into a regular PHP form but I often don’t. Relying on a plugin like Gravity Forms adds some complication but also lowers some technical barriers and provides some longer term flexibility. It may also be that I really dislike writing forms.
Since, I’ve pointed out Gravity Forms options previously I’ll also point you towards a post on how to do this with Advanced Forms which is a pretty solid option as well.
There are times when we want to solidify a pattern or create something that is beyond the realm of a basic expansion of WordPress.
Solidification generally occurs after we’ve either built out a lot of very similar theme tweaks or we’ve seen a need to further tighten up a level one theme. Solidification generally means removing external plugin reliance and setting the pattern more rigidly. Minor user-choice is built in but 95%+ is set. We don’t do a ton of these.
There are also projects that push the boundaries of what we can do. WordPress is relevant but doesn’t matter a huge amount. It’s more a means to an end, a path to writing and storing data that’s familiar. These types of developments take longer because the path is often unknown and the technologies are often new as well.
I started reading PHP Objects, Patterns, and Practice which is a dive into object oriented programming. I didn’t talk about patterns like that, our GitHub workflow, or staging vs production. Trying get all this stuff to work and work well is a challenge but it’s trivial compared to having interested people eager to do good work and to keep pushing that bar higher. I’m lucky to work with two solid people and we collaborate with a really impressive group of faculty and students. The rest is just secondary details and pretty useless without that base.
2 I wish this word was always.
3 Nonprogramistan was a simpler time. I do miss it.
4 Progress is relative.
5 “Well thought out” means someone applied some sort of logic that I can sort of follow rather than coming with something on my own.
6 I could say this for everything I do. Just imagine I whisper it in your ear with each decision I describe.