University of Mary Washington

October 12th, 2011 by Curtiss Grymala
The home page of the new UMW website

I am extremely proud to announce that the new University of Mary Washington website has gone public. The entire university website uses WordPress as the content management system, and is made up of 213 separate WordPress sites within 33 WordPress “networks”. Thanks to the Networks+ plugin from Ron and Andrea Rennick, all of this is managed from a single installation of WordPress. While this project is not a Ten-321 Enterprises project, it was performed by Curtiss Grymala as part of his duties as the University Webmaster at UMW.

The design for this project, as well as the custom WordPress theme were created by Category 4 in Charlottesville, VA. We also consulted multiple times with Ron and Andrea Rennick to discuss the best practices and recommendations for setting up a complex WordPress system like this. Ron also developed a new plugin specifically for our project, allowing us to manage all of our downloadable documents from a single site within the installation. He released the plugin to the public as the Document Repository plugin.

Public Plugins

Within the installation, we are using the following public plugins (some premium, others free) to help improve our management experience and the user experience:

  • BackupBuddy – This plugin makes it really simple to backup our entire installation, allows us to duplicate sites within the install, migrate the entire installation to a new domain and/or server (because of our unique situation, I had to write a custom import script that finishes the job) and also includes a lot of other great management features.
  • DisplayBuddy Accordion – This plugin offers a really nice interface to manage JavaScript accordions as widgets or shortcodes. The accordion on the UMW home page, as well as the navigation accordion in the sidebar of the Undergraduate Admissions home page are both implemented with this Accordion plugin.
    We first attempted to use a plugin called Tabbed Widgets, which seemed to work really nicely, but caused PHP and JavaScript conflicts throughout the administration area of WordPress.
  • DisplayBuddy Featured Posts – This plugin allowed us to implement a really nice carousel of featured posts. The home page of the News site uses this plugin to display some of the featured news stories at the top.
  • Active Directory Authentication Integration – This plugin allows us to handle all WordPress user authentication through our Active Directory server.
  • Active Directory Employee List – This plugin allows us to use our Active Directory server to display lists of employees and to enable people search. You can test this feature by using the “People” search on any page. This plugin also allows us to post information about specific employees in any widgetized area.
  • Post Content Shortcodes – This plugin allows to show lists of posts in widgetized areas, excerpts from posts within pages, and even allows us to pull content from a post on one site into a post or page within another site. You can check out the post list function by visiting the home page of the News site and looking at the list of recent stories underneath the Featured Posts slider.
  • Networks+ – This plugin allows us to use subdomains as separate WordPress networks and subdirectory sites within each of those networks. In addition to offering us the mix of subdomains and subdirectories within a single WordPress installation, this also gives us greater control over the permissions for large areas of the university website.
  • Broken Link Checker – This plugin automatically scans each WordPress site and provides a report of any links that don’t resolve properly. This has helped us already, and will help us even more in the future, to identify any broken links within each site. This plugin needs to be activated and configured on each site individually; it cannot be network-activated. Also, be aware that this plugin adds 3 new tables for each site.
  • BWP Google XML Sitemaps – This plugin makes it extremely simple to generate XML sitemaps for the entire installation. The plugin can be network-activated safely, and includes some really nice features specifically for multisite installations.
  • CMS Tree Page View – This plugin allows us to easily reorganize the pages and posts within each site. Rather than having to explicitly enter an ordinal number for each page to re-order them, you can use a drag and drop interface. This plugin does cause minor JavaScript conflicts with some other plugins, but it’s not anything that stops us from being able to do what needs to be done.
  • Document Repository – As mentioned above, this plugin was developed specifically for UMW by Ron Rennick. It allows us to manage all of our downloadable documents from a single site within our installation, then insert links to those documents anywhere else in the install. Each document has its own permalink, so any new versions of the documents don’t cause old links to break.
  • Google Calendar Events – This awesome plugin allows us to import and aggregate multiple Google Calendars on our site. With some minor modifications that I put together in a custom plugin (without modifying the Google Calendar Events core at all), we are able to use a single site to manage all of the calendars, then use those calendars throughout the entire installation. You can see some examples of the Google Calendar Events plugin in action within the UMW Events portion of the accordion on the university home page and on the Events site.
  • Gravity Forms – This is an amazing plugin that allows our site managers to easily create complex, interactive Web-based forms with very little hassle.
  • MCE Table Buttons – This plugin simply enables the TinyMCE table editing buttons. Since the university site uses tabular data in quite a few places, we needed a simple way to implement them. While I have used (and really liked) plugins like WP Table Reloaded in the past, it seemed like overkill for most of our users.
  • Network Privacy – This plugin allows us to mark some of our sites as private, so only registered, logged in users are able to view the contents of the site. This plugin could even conceivably be used to implement a simple WordPress intranet.
  • Page Link Manager – Although this plugin hasn’t been updated in quite a while, it is still an invaluable addition to our system. This allows us to check off which pages on our site should be included in navigation menus, making it easy to hide pages from normal navigation and to help us prune long, unwieldy navigation menus. I did end up needing to write an extension for this plugin, simply because it uses the old method of creating widgets (which sort of conflicted with other plugins we’re using), but the foundation of the plugin is still extremely solid and useful.
  • Page Links To – This is a very simplistic but extremely powerful plugin that lets you create redirect pages in WordPress.
  • Regenerate Thumbnails – This is another utility plugin that, while you probably won’t use it very often; you will be grateful you have it when you need it. This plugin allows you to regenerate all of your dynamically-sized images within a site. When you add a new image size to WordPress, WP doesn’t automatically go back and make sure that all of your images are available at that size. This plugin allows you to do that with a single click.
  • Social Media Widget – At this point in time, we are using this plugin to display icons/links to our various social media accounts throughout the site. The interface for this widget is a bit overbearing, though, so be forewarned.
  • TypePad AntiSpam – This is a free anti-spam plugin very similar to Akismet. This plugin is still considered to be in beta (which is possibly why it’s still free); and can be extremely vigilant (much more than Akismet) against comment spam.
  • Networkwide Menu – We are using a slightly modified version of this plugin (edited by Category 4 for us) to make it work in the multi-network installation. This plugin allows us to set up a custom navigation menu within a single site, and use that navigation menu on other sites throughout the installation.
  • Viper’s Video Quicktags – From Viper007Bond, the main coder behind the WordPress oEmbed system, comes this awesome plugin that lets our users quickly and easily insert videos from all kinds of services; some supported by oEmbed and some that aren’t. The plugin is incredibly powerful, easy to use, well-planned and extremely flexible.
  • WP Super Cache – This plugin allows us to rest a little easier about the amount of visitors we receive by caching each page for a few minutes at a time; showing visitors a static version of each page rather than using PHP and MySQL to generate each page each time it’s visited.
    When we initially launched, we didn’t have things configured quite right; and WP Super Cache was not serving up any cached pages (putting a bit of a strain on the server). After doing a little digging, though, I discovered that the code we were using to implement Google Search on the website was setting a default GET variable; which was causing WP Super Cache to think the page had changed each time it loaded. In addition, since we are working across multiple subdomains (and need to be prepared to work across multiple top-level domains in the future), our Analytics code was configured to track cross-domain visits; which was appending extra GET information to each cross-domain link. I edited the Google Search code to stop setting the default GET variable; and I modified the JavaScript that was appending the cross-domain information for Analytics so that it uses a hash instead of a GET request.
  • WP Touch Pro – This plugin allows us to make our entire site mobile-friendly with a single click. It also grants us the capability to customize that mobile site down the road.

Custom Plugins

In addition to those publicly available plugins, I wrote about 20 custom plugins for use on the site. Some of them are full-fledged plugins; others are simple functions that I’ve added to our mu-plugins folder. Some of the custom items I added include:

  • A Document Repository widget – this allows us to display a list of documents that match specific criteria within a widgetized area.
  • Google Calendar Extended – this is an extension I wrote for Ross Hanney’s Google Calendar Events plugin. This extension adds a calendar button to the visual editor allowing people to easily insert calendars into their posts and pages. It also makes the plugin compatible with our multisite/multinetwork setup; so that all of the calendar feeds are managed from our root site, but are available to all sites in the installation.
  • Google Custom Search – this is installed as a mu-plugin, and sets up our search. When you visit the site, you’ll notice that there are 3 different search options: “UMW”, “This Site” and “People” (on the home page, you only have the first and third options). Those search options are handled through this custom Google search code. If you choose “UMW” or “This Site”, the search is performed by a Google Custom Search Engine. The first option searches all of UMW’s sites (including UMW Blogs) and returns results related to your search parameters. The second option searches only the current domain you’re viewing by adding a “site:” parameter to your search. The third option invokes the native search that I’ve built into the Active Directory Employee List plugin.
  • Meet the Faculty data – The UMW website includes a media resource guide that displays information about each faculty member; including bio text, their degrees and credentials, their contact information and their titles at the university. This plugin (installed as a mu-plugin) separates the faculty information into 2 areas. The information that faculty members can edit themselves is included in their WordPress profiles. Other information that needs to be reviewed and modified at a higher level in the organization is managed through a custom post type. When the information is displayed on the website, this plugin merges all of that data together. The custom posts are managed from a single site, and then broadcast out through a widget or shortcode wherever that information needs to be displayed. The topics, areas of expertise and university departments and divisions are also managed through a single site.
  • MultiNetwork Functions – I wrote up a handful of mu-plugins that add some additional functionality to a multi-network environment. Some of the things these plugins do are:
    • Add a “Multi-network Activate” and “Multi-network Deactivate” link to plugins when viewing the plugin management screen. These links will activate or deactivate the selected plugin on all of the networks in the installation at once. They should be safe to use on any plugin that supports network-activation.
    • Add a “Multi-network enable” and “Activate on all sites” link to themes on the theme management page. The latter should be used with great care, as it will do exactly what it says; activate that theme on all sites in the entire installation. If you have any sites that are using themes other than your default, you’ll have to go to those sites and change them back once you click that link.
    • Add a new table for global data. Where a multisite installation has the sitemeta table that holds global data; that sitemeta table is no longer really global in scope when you have multiple “sites” (or networks, as they are called now). Therefore, this table adds that functionality back in, allowing you to store data that should be quickly and easily accessible to all sites across the entire installation. The table is added to the global scope of the WPDB object, so you can access its name by simply using the $wpdb->mnetworkmeta property (in case you want to query it directly).
      This part of the plugin also implements the following new functions: add_mnetwork_option(), update_mnetwork_option(), get_mnetwork_option() and delete_mnetwork_option(). Those functions act extremely similarly to the add_site_option(), update_site_option(), get_site_option() and delete_site_option() functions, except that they add data to the mnetworkmeta table instead of the sitemeta table.
      In the near future, I plan to add transient option functions for that table, too.
    • Adds a function to check whether or not this is a multinetwork installation. The is_multinetwork() function runs through various checks to see if you’re running a multinetwork install, and then returns boolean true or false depending on the results.
    • There are rudimentary functions to check to see if a plugin is network-active on all networks; but this function hasn’t really been used or tested yet, so I’m not sure how well or efficiently it works.
    • There are also functions to handle the way Super Admins are removed from the database. By default, none of the multi-network plugins actually go through and remove a user from the list of Super Admins on any network except the one you used to initiate the delete action. Therefore, if someone were to come back and register with the same username that that old user had, they are automatically granted Super Admin privileges everywhere the old user had them.
      The functions built into this plugin do 2 things: they check to see if you are allowed to delete the Super Admin (if you’re a Super Admin on a single network, and you try to delete someone that’s a Super Admin on all networks, it shouldn’t let you go through with it); and they make sure any Super Admin user that’s deleted from the database also gets removed from all of the lists of Super Admins.
    • I also added a file that implements some of our default options and settings whenever a new network or site is created.
  • My Sites Dashboard Widget – this plugin takes a slightly modified version of the “My Sites” list and displays it as a widget on the administrative dashboard (both Site Admin and Network Admin). Since the “My Sites” list in the Admin Bar can get a little unwieldy at times (mine only shows about half of my sites, as the rest run off the bottom of the page), we implemented this widget to make it easier to find the links to your admin pages. The function that displays the widget can accept a WordPress capability as a parameter; so if you only wanted to list sites on which the current user is able to “publish_posts”, you could send that capability to the function, and only those sites would show up in the widget.
  • A modified version of the Page Link Manager widget – since the Page Link Manager plugin uses the old method of creating widgets, I went ahead and wrote an extension for it that modernizes the way its widgets are created.
  • Widget shortcodes – Based on the concept behind the amr shortcode any widget plugin, I wrote a plugin that allows us to drag widgets into a special widgetized area on the Widget management screen, then insert those widgets into any post or page using a specialized shortcode.

There are a handful of other functions and plugins I wrote, but they’re so specialized, there’s not much point in mentioning them here.

The folks at Category 4 also wrote a handful of plugins for us to use on the site. They include some specialized widgets, an “A to Z links” widget and shortcode (one part of it displays the letters A-Z with links attached to each; and the other part is a shortcode that queries the database for the requested letter) and a custom slideshow plugin (which is currently being used to display the carousel on the university home page).


Before I close out this post, I want to take a moment to thank some of the people that were instrumental in taking this project to fruition.

  • Ross Hanney, the developer of the Google Calendar Events plugin. Ross was always extremely supportive and quick to respond when I had questions about his plugin, and usually implemented my feature requests extremely quickly. For instance, when you view an event on the university website, there is a link to “Add this event to your calendar”. That leads to an ICS (iCal) file that you can then add to your Google, Outlook, iCal or just about any other calendar system very easily. This link was not possible to create when we started using GCE; but Ross implemented the ability to create this link within days of my request. Although it sounds kind of simple, the integration of Google Calendars was a huge desire for this website, and it wouldn’t have been possible without Ross’ assistance.
  • Ron and Andrea Rennick – Seriously, these guys were an immense help in getting this project off the ground. Not only did they provide us with a handful of pre-built plugins (including the one that enables the multinetwork portion of WordPress), they also created the Document Repository plugin specifically for us, helped us review some of our code and gave us invaluable advice throughout the project. In fact, Andrea was one of the catalysts that pushed the university in the right direction for this project last year.
  • Jim Groom – he’s the reason I applied for the job, he’s one of the ones that brought WordPress to the university in the first place, and he’s been a huge help throughout the process. His ideas are visionary, and his enthusiasm is unmatched. He and Martha Burtis were also a huge help when we hit the final crunch to get content migrated and set up on the new site. The site would have little more than a home page and a handful of subsites ready for public consumption if they hadn’t pitched in as much as they did.
  • Cathy Derecki – my supervisor. Cathy managed this project from day-one, and continues to do so. She organized everything related to the project, and spent many sleepless nights making sure things were working the way they should. She kept me on task, told me what features were priorities, helped import and develop the content and kept everything straight throughout the entire project cycle. She has been an amazing project manager.
  • Category 4 – as mentioned above, this is the group that designed the site for us, and put together the custom theme. The theme is based on the Genesis framework, and includes a lot of nice bells and whistles. Their design work is absolutely stunning, and we couldn’t have asked for a better product. We even earned a spot in the StudioPress showcase, thanks to their awesome design.
  • Ipstenu and Viper007Bond – These two helped me with a lot of late night questions on Twitter, and even helped me test things occasionally when I couldn’t figure out why WordPress was doing something it shouldn’t have been doing.
  • Anyone else I’m forgetting – I know there were probably 100 other people I should have thanked here, but I just can’t think of them right now. To all of you that I might have forgotten, I apologize.

Before and After

Below is a gallery showing some before and after shots.


With all of that out of the way, I want to take a brief moment to reiterate that WordPress is a viable CMS. At Ten-321 Enterprises, we use it almost exclusively to power the sites we create. Most of the time, people think of WordPress as a viable CMS for small projects, but dismiss it out-of-hand when talking about larger projects. The new UMW website is an experiment to prove to the world that WordPress can hang with the big boys, too.

There is still a lot of work to be done optimizing things, adding features and tweaking things where necessary; but, for the most part, we are extremely proud and a little astonished by the way the site turned out.

If you have any questions about the plugins or custom functions we’re using, or you have any questions about the project in general, please feel free to comment below.


The University of Mary Washington project was performed as part of Curtiss Grymala’s official duties as the University Webmaster at UMW. This was not a Ten-321 Enterprises project. It is simply highlighted here in the Ten-321 Enterprises portfolio as an example of the kind of work the principals at Ten-321 have done.

Return to the Portfolio

« | »

2 Responses to “University of Mary Washington”

  1. Aaron Riddle says:

    Outstanding work, Curtiss! University of Mary Washington has to be amazed with your talents as I have always been. Keep up the great work!

Leave a Reply