BuddyPress bbPress Opinion


I’m going to say, with emphasis, what I think everyone is probably thinking…

LoopConf is what you wish most WordCamps were

Here’s my gist:

  • Live streaming quality was excellent, because a professional crew was on-tap to handle all of it
  • The logistical planning of the entire conference felt very smooth – almost invisible, really
  • Vendor tables were in a single isle, making them impossible to miss and easily approachable because they needed to be constantly staffed
  • Speaker quality was excellent, and I predict we will see a few presentations remixed and repackaged by others for WordCamps this year and next
  • I never want to follow John O’Nolan (of Ghost fame) in a speaker lineup ever again – he is a well-prepared stage performer with relatable personality and charisma, and will easily make you second guess your own experience & abilities
  • Andy Nacin’s talk was revealing, and even still, is only really half of the story
  • Jeremy Felt is much more comfortable on stage than he used to be, and his Multisite presentation was spot on
  • So many mentions of the REST API, but not a lot of truly practical usages yet – everyone is building WordPress minus WordPress instead of replacing existing piecemeal AJAX calls or iteratively improving WordPress itself

Full disclosure: after O’Nolan’s talk, the reality of being the last session of an intense 3 day conference became very apparent, so I trimmed 10 slides from my presentation talking about code and stuck to the high-level overview of my perspective of what building (and maintaining) big plugins is like and means to me.

It didn’t help either that vendors started breaking down their tables & displays in the middle of the talk before mine. It confirmed my suspicions that at least some people were ready to be done with the event, and demotivated me enough to cut my talk a few minutes short so everyone could call LoopConf done-done and move on to reflecting rather than ingesting. I know some events penalize vendors for this, and I’m not exactly endorsing that, but I can say in my experience that it certainly influenced my mood on stage.

Going back to the WordCamp vs. LoopConf angle, I like that WordCamps are casual and inviting, and I like that conferences like LoopConf and the VIP Workshop strive to achieve something more professional. I think there will be some WordCamps that try to upgrade themselves to compete, and others that will purposely stay intimate and niche. And I love that event planners have the freedom to choose what they think is best for their audiences, and that attendees are able to tweak their own experiences within the WordPress specific conference space.

LoopConf in general was super great event. It felt well executed, with plenty to do, learn, and accomplish afterwards. I hope I’m invited back next year to go more in-depth about something niche and interesting happening in the WordPress community, and if so, that I don’t end up following that O’Nolan chap again.

P.S. – here’s the recording of my talk, if you’re interested

BuddyPress WordPress

"I’m too busy"

TL;DR – If you ping me directly for help with something, you will probably get it.

BuddyPress & bbPress recently switched from IRC to Slack for real time synchronous communication. Philosophically, I prefer the openness of IRC, but I do appreciate how convenient Slack is for everyone, and it’s anecdotally a more inviting and active environment & experience. For some, Slack might actually be overly convenient to the point of annoying or obtrusive, but I think like any communication tool, it requires a bit of wrangling and tuning to suit your needs.

What won’t happen, in Slack or otherwise, is any response from me that boils down to “I’m too busy” even if it’s true.

Let’s imagine that I am actually too busy to help you; you still won’t hear me say so. Instead, you’ll get any number of different replies that are considerate of you and your time:

  • “I’d love to help but won’t be able to for X number of hours.”
  • “Sorry; I have a bunch of things going on and won’t be able to get to this for a while.”
  • “I took a quick look and found this; check it out and let me know how it goes.”
  • “I can’t help right now, but maybe Frank is around and can take a look with you.”

My emphasis is on being polite and considerate of how the recipient could perceive my attitude & demeanor, and making sure to convey genuine concern for their situation even if it does not directly influence my life or priorities in any way.

Conversely, when I reach out to ask for help, it’s only because I’ve reached a point where it is no longer efficient or appropriate to continue on my own; I’ve done everything I am aware of and is in my scope of influence to do, and for any number of reasons I’m choosing to include someone else into my situation.

One place this happens quite frequently is WordPress Trac. As an example, let’s again imagine that I’m working on BuddyPress or bbPress, and I believe I’ve identified a bug in WordPress core. There’s a priority-ordered list of things I’ll go through before I include anyone else into my problem:

  • Run the PHPUnit tests to ensure I didn’t break something on my own
  • Duplicate the bug in a completely vanilla installation without any modifications
  • Confirm bug is real
  • Attempt to fix bug in WordPress core codebase by modifying as few lines as possible
  • Test and retest fix to confirm results, and confirm PHPUnit tests still pass
  • Search the internet for anyone else with this problem, and drill down into any relevant results to learn as much as I can about what anyone else is experiencing
  • Search WordPress Trac for any existing tickets related to any surrounding code, usually by searching for function or method names, variables, component names, etc…

All this, and no one else but me has any idea I’ve been hunting down Carmen Sandiego for the past hour or two. What happens next generally depends on the severity of the issue, and whether or not I feel comfortable pinging someone directly and risk interrupting whatever they’re working on for a consult. In my experience, anytime the urgency and prioritization of two separate parties converges, it requires even more clear & concise communication than normal. If someone gets frustrated by being interrupted, or you haven’t come fully prepared, the person(s) you ping are not going to be receptive now, and will be less receptive in the future.

Even after all of this research, preparation, and with years of experience doing this in a professional setting, it still isn’t easy, and positive & productive results are not guaranteed. I think if you value other people’s time more than your own, do your due-diligence, and are considerate of how your interruptions may impact their lives, you will generally get the same in return. And if you’re always constantly too busy to be interrupted (to the point of forgetting to be polite about it) it might not be the outside world and their lack of so-and-so that’s the problem.

BuddyPress Software Crowd Funding

January thoughts, BuddyPress 2.2

With each new software release that I’m fortunate enough to contribute to, I usually take some time (or lots of time) to reflect on a few different things that I think are critical to the project and myself:

  • What went right?
  • What went wrong?
  • What did I learn?
  • What can I do better?

With BuddyPress 2.2 imminent, here’s a brain-dump of my random and unrelated thoughts for January 2015, in no particular order:

  • Significant improvements have been made to cache-coverage, but many more are necessary, and some of our existing implementations are not ideal.
  • User statuses are pretty messy. A user’s status is a numeric value in the users database table, and there is no API in WordPress for interacting with it. Just like post statuses, anyone concerned with workflow (or activation flow in this case) is pretty much on their own.
  • The Member Type API is sweet, and I’m excited to see how developers use it. Hopefully I get to use it myself soon.
  • It seems like each ticket takes longer to test, confirm, fix, patch, and push.
  • How strictly do we enforce cache coverage, unit-test overage, inline documentation coverage, and all of the other nuances? I fear we are over-complicating each others lives with anti-progress and slowly forgetting what made BuddyPress fun to work on in the first place.
  • I need to write more unit tests.
  • I need to increase cache coverage.
  • I need to write more inline documenta… Ehh… maybe I’m okay here.
  • I sure wish PHPUnit were faster and easier to run. Netbeans has decent integration, but I haven’t figured out how to efficiently implement it into my workflow.
  • It’s been really great not juggling immense client and customer expectations in January, thanks to the funders of my recent IndieGogo campaign.
  • The old BuddyPress Default and Legacy templates are starting to look really out-of-date to me now. I wish we didn’t have so many templates to style and that creating themes was easier.
  • I continue to struggle with the cost of switching contexts during the day, between writing code, impromptu meetings, and random pings. Working nights used to help with this, and I need to come up with a healthy plan to improve my ability to come back to things once I switch away from them. I feel like I used to be better at this when I was younger.
  • That squirrel outside my window is looking pretty well fed considering it’s January.
  • I bought too much Lego over Christmas.
  • I need to take more small breaks and be more physically active during the day.
  • I need to prioritize blogging.
  • I need a nap, and it’s only 11am.
  • BuddyPress 2.2 is going to be sweet.
  • Boone did a really good job juggling both WordPress and BuddyPress core development. Note: be more like Boone, at least in this capacity (I don’t think I can eat that much pizza anymore.)
  • I’m excited for a vacation my wife and I are planning in March to celebrate our wedding anniversary. It will probably be much needed by then.
  • I broke my ankle 1 year ago, and it’s still not quite right. Likely won’t ever be the same I suppose. Guess I’ll never play the piano again.
  • Penny (our new rescue puppy) tested positive for heart-worm. Poor thing. Hopefully it’s not too bad and we get her all fixed up.
  • You are great. <3
BuddyPress Uncategorized

BuddyPress Notifications

Today, with a little help from my friends, the first new component to BuddyPress in several years saw it’s first commit into trunk this morning.

BuddyPress Notifications
First pass UI for BuddyPress Notifications

BuddyPress’s new Notifications component is something I’ve had in my imagination since BuddyPress 1.0. It works identically to the previous core notifications functionality, and offers key features I’ve always wanted in our notifications:

  • The notifications component can now be deactivated.
  • Individual notifications can be marked as read/unread.
  • A user interface for previously read notifications.
  • A solid foundation for future notifications improvements (notification meta!).

For the curious, you can follow along with Notifications development on ticket #5148. This feature is slated for BuddyPress 1.9, coming near the end of November.

BuddyPress bbPress WordPress Uncategorized

Contributing to WordPress, BuddyPress, & bbPress

Siobhan McKeown recently authored an amazing post at Smashing Magazine about contributing to WordPress. I was fortunate enough to have the opportunity to share some of my own thoughts, mostly surrounding BuddyPress and bbPress.

If you’re a part of the WordPress community, this is a great read, with ideas and suggestions from a few of the most iconic WordPress contributors. I’ll leave you with my two favorite snippets from my pals Matt and Mark:

The number one skill you need for just about any job, but specifically working on open source, is communication skills. You need to have clarity, consistency, compassion, relatability, a little bit of a thick skin and a decent sense of humor. — Mark Jaquith

You can’t knock on the door at Google and say, “Hey, do you mind if I help you out with your home page? I have some ideas for you.” But you could come to us and say, “Hey, I have some ideas for your dashboard, and here are some patches.” — Matt Mullenweg

BuddyPress bbPress Software WordPress

SLASH Architecture – My approach to building WordPress plugins

I’ve fallen into a routine when building WordPress plugins; a few general rules are:

  • Avoid creating new PHP globals.
  • Avoid executing PHP code in the global scope.
  • Generous use of Actions and Filters.

I’ve decided to name the pattern I use Slash, which stands for:

  • Singletons
  • Loaders
  • Actions
  • Screens
  • Handlers


I didn’t love singletons in PHP at first, and I’m still not convinced they are ideal, but they work well at avoiding yet-another-WordPress-related Global variable. bbPress is a good example.

The benefit of using PHP singleton’s in WordPress is they don’t create an additional PHP global to worry about getting stomped. They also allow your plugin to always exist in memory, without another plugin being able to unset it, while still working like a traditional PHP class.


These are basically bootstrap functions. Their only responsibility is to jumpstart a singleton, and put it in a place for easy access. See the bbpress() function in the above bbPress link. Loaders allow you to reference your Singleton without needing to use a global variable, or pass an instance around into functions and method calls. Used like: bbpress()->foo = 'bar';


By hooking everything into WordPress core actions, bbPress never runs any code inline in the global scope, other than the above loader function. Also, bbPress comes with it’s own sub-actions to piggyback WordPress’s, making writing bbPress specific plugins safe and simple.

This also includes WordPress Filters. The major difference with Filters is that they are generally more risky to use; you have to assume other plugins are already using them, and those same plugins aren’t designed to handle whatever you’re trying to do too.


Derived from BuddyPress, screens are basically “Views” if you’re familiar with MVC. They are how we output markup to the browser from inside PHP, WordPress, and our plugins. Screens can be modular (again, see bbPress) allowing them to work with shortcodes, widgets, and template parts. Screens typically contain all of the translatable strings and HTML markup, and sanitize any variables for output.


Handlers are the equivalent of controllers in MVC. They are responsible for containing the logic that comes from requests like forms, AJAX, JSON, XML-RPC, etc… They “handle” whatever the request is, performing capability checks, validating input data, and also checking for nonces.

Why not use MVC?

Honestly? No reason. Slash isn’t intended to compete or replace anything, and like anything else it’s constantly evolved over time to become what it is today, and will likely change tomorrow too. MVC and other architectures work really well, and Slash is just an approach that’s worked well for me. Putting a name on the routine should help it grow, or educate me on better approaches.

It’s also worth noting that Slash isn’t really anything new, but rather an assembly of separate methodologies combined into a single process that helps me translate my thoughts into code.

The best way to see the Slash approach in action is to browse through the BuddyPress and bbPress codebases. If you’re an experienced developer, I’m always looking for feedback. If you’re just starting out, maybe give the Slash approach a try. Take what’s in bbPress and remix it for your own use, and let me know how it goes.

BuddyPress Software WordPress

Custom Plugin Header Image Label

Back in December of 2011, Matt and friends added the ability for WordPress plugins to have really pretty header images. For BuddyPress, I went through a few design iterations before settling on the header image pictured at the bottom of this post. I wanted it to be minimalistic and unique, so I took an hour to extend the label area with the buddies at the end. Below is the basic approach to make that happen:

  • Take a screen shot of the header image without the extended icon area.
  • Open that screen shot in Photoshop or your favorite image editor.
  • Make a new layer.
  • Fill the new layer with a black close to whatever the primary color of the label is. (#181818)
  • Hide that layer, select the background layer.
  • Magic wand the label.
  • Extend the selection to the size you want it to be (Usually 50px or so.)
  • Switch to your all black layer.
  • Right click; Select inverse; Delete.
  • Tweak the opacity of your black layer to match as closely as possible. Take your time with this; even if it’s the slightest bit off, it’s pretty noticeable.

Life BuddyPress bbPress Software WordPress

Confessions of an Open Source Workaholic

Hi, my name is John, and I’m an Open Source Software workaholic. I touched on it a bit in my WPCandy interview, and I thought I’d finish the story here with a few added thoughts.

I live in a great neighborhood on the east side of Providence, RI. I work from home, rarely drive my car (ignore the frequent road trips), and enjoy the luxury of being walking distance from food, laundry, spirits, and anything else I might need to live a happy and comfortable life.

By day, I work for Automattic. I love my job. I love my colleagues. I love everything about what I do. To say it’s a dream job is an understatement. I work on some really awesome stuff going on around, Jetpack, Gravatar, and try to poke my head into other interesting social bits as much as possible.

By night, I’m the lead developer of bbPress, BuddyPress, and maintain both of the and sites. I believe both projects are two of the strongest spokes attached to the WordPress hub, and it’s my pleasure and privilege to be so closely involved with them. I am passionate about their success and enjoy iterating and improving them both equally, and love to help their users whenever I can.

That said, I’m in a unique and misunderstood position.

I work 40+ hours at a job that I love. Most days when I’m done with work I switch gears to my hobbies; usually that’s bbPress and BuddyPress. Other days, I enjoy going to the park with my dog Paul, watching Netflix, or enjoying a nice meal with friends.

In 2010 and 2011, I had the pleasure of mentoring some really bright individuals as part of the Google Summer of Code and the Google Code In projects. Gautam Gupta, a 15 year-old student from India, placed 6th by working closely with me contributing to the first major release of bbPress in two years; helping to totally refactor bbPress into a plugin for WordPress, skyrocket its popularity, and reinvigorate something great that hadn’t had much attention in a while.

My point, is that working on the bb’s is not something I am directly paid by Automattic to do. Instead, my job at Automattic enables me the means to keep my skills sharp *and* work on the software that I love, at the same time; it allows me to spend my free time giving as much back to the community as I am willing and able to. I choose to concentrate on bbPress and BuddyPress.

While Automattic does donate the time of several full-time people directly back into WordPress, and while it benefits Automattic as a business to be coupled so closely to its active development, it is not Automattic’s responsibility to staff anyone to contribute back to any open source project anymore than it is your own to do the same.

WordPress is free and open for anyone to build off of and dedicate resources towards. The bb’s are both free and open like WordPress is, with a lower barrier of entry to make a a much larger impact. If you’ve ever been intimidated by the amount of activity happening around the development of WordPress, or have been afraid your contributions aren’t good enough: 1. you’re wrong; 2. use the bb’s as your training ground.

If you choose to stick around and help work on the bb’s, your influence carries more weight because there are fewer people contributing. Dedicated contributors walk up the ranks quickly, earning core commit access like Boone Gorges, Paul Gibbs, and I with both BuddyPress and bbPress. We’re not the founding developers, we’re the currently active ones, and we would love to have your help. From code to codex, everything is an iterative work-in-progress.

Who knows, maybe eventually you’ll be an open source workaholic, too.


BuddyPress 1.5 “Lombardi” released

Could not have said it better myself. Reblogged from Boone @ Teleogistic:

It’s finally here! After many, many months of bug squashing, refactoring, and general bloodsweatntears, BuddyPress 1.5 has been released!

This long development cycle has been frustrating in some ways and extremely rewarding in others. On balance, I’m quite proud of the work that’s been done, and quite pleased to have worked so closely and so well with JohnPaul, and all the other contributors to BuddyPress. My sincere thanks to all the users and developers who have been supportive during this dev cycle.

Most importantly, BuddyPress 1.5 itself kicks ass. The bp-default theme has seen some serious improvements, some much-needed features have been added, and the codebase has been overhauled in terms of additional internal APIs, documentation, style, and so on. If you’ve done development with BuddyPress in the past, do yourself a favor and check out BP 1.5 – you are in for an extremely pleasant surprise.

Here’s to 1.6 and beyond!

Boone and Paul, thank you both for your hard work and dedication. You are great developers and outstanding friends, and I’m excited at what we will accomplish in future versions!

BuddyPress WordCamp

I Spoke at WordCamp San Francisco!

This year I had the privilege of speaking a total of three times at WordCamp San Francisco and MC’ing the dev track all day on Friday.

The footage and slides below are from my first talk on Friday morning about BuddyPress 1.5.

[wpvideo GzqLp8uq]

[slideshare id=9052698&w=515&h=375&sc=no]

Overall I’m happy with the way things turned out. I’ve always been comfortable on stage but have fallen out of practice in recent years. I love being able to use footage like this to improve each presentation that I give, and am excited to apply what I learned this time around.