April 20, 2016

We would like to thank the sponsor of today’s show, Gravity Flow. Gravity Flow allows sites to automate business processes for internal routing, scheduling, reporting and more. You can go to GravityFlow.io to learn more.


In today’s podcast, we’ll update you on what’s been happening, we’ll discuss some of the great changes that go along with the WordPress 4.5 update, and we’ll talk about the common condition of imposter syndrome.

Brad’s Update

Brad recently returned from his trip to Costa Rica. It was the first time in four years that he and his wife had been able to get away without this kids, and they had a great time kayaking at the base of a volcano and hiking up a steep, dormant volcano. He purposely took only his tablet, which is uncomfortable to work on, so he’d have a deterrent to spending too much time trying to get work done while on vacation.

While he was away, his company released the free version of WP Migrate dB 0.8. He expected that Migrate 1.6 Pro would be releasing by the time this podcast came out. Ian from Delicious Brains put up a long tutorial post about Backbone JS, which is great to refer to for more information about this. The other Iain, aka “Beardy,” wrote a post about using Codeception to automate WordPress plugin testing, which is another valuable resource.

Pippin’s Update

Last weekend was pretty eventful, as Pippin discovered a big bug in a recurrent payments plugin. This was an emergency situation requiring an immediate fix: There was a fatal error in an upgrade routine that led to incorrectly assigning customer IDs within the accounts of customers using Stripe to make payments. Between finding the problem, fixing the code, contacting the affected customers and cancelling the affected orders, the problem took over 48 man-hours to solve. The good news is that it is finally solved, and no further reports of the problem have been made.

Pippin says that in this case, hindsight was 20/20, as it was one line in the coding that was the culprit. Braces were not used on a condition, which is a simple enough error to make, but one that had serious consequences.

More pleasant big news is that Easy Digital Downloads just celebrated their four-year anniversary! Pippin wrote a post about it on the Pippin’s Plugins blog. Occurring at about the same time was the one millionth download for EDD!

In This Episode

  • Some of the great new features in WP 4.5. These include the capability to have custom logos, filters to add devices, a way to toggle between different screen sizes, better image compression and so much more. We highly recommend reading through the WP 4.5 field guide by Aaron Jorbin and checking out the support forums at WordPress.org to find out even more.
  • All about imposter syndrome, which is the idea that you are an imposter, or inferior to others in your field. This is so prevalent among WP developers, and in many other industries as well.

Links and Resources:

If you’re enjoying the show we sure would appreciate a Review in iTunes. Thanks!


INTRO: Welcome to Apply Filters, the podcast all about WordPress development. Now here’s your hosts, Pippin Williamson and Brad Touesnard.

BRAD: Welcome to Episode 59. This time Pippin and I will be talking about what we’ve been up to, we’ll dig into WordPress 4.5, and we’ll talk a little bit about something called imposter syndrome. But first–

PIPPIN: This episode is sponsored by Gravity Flow, an advanced add-on for Gravity Forms that allows you to automate your business processes whether you need to set up workflows for purchase orders, job applications, admission forms, project initiations, vacation requests, or any other kind of workflow that involves advanced feedback loops, approvals, et cetera. Gravity Flow allows you to do this easily while also leveraging the power of Gravity Forms. You can find out more at GravityFlow.io and once again thank them very much for sponsoring this episode.

BRAD: Whoo.

PIPPIN: All right. Brad, I believe you just got back from Costa Rica. Why don’t you take a few minutes and give us the rundown on how that went?

BRAD: Yeah, so it was my first time in Costa Rica, and it was the first time in four years that my wife and I had gone on a trip together without our kids. We were able to do things like kayaking Lake Arenal at the base of a volcano and hiking up a super steep dormant volcano. Some pretty cool stuff, right? You’ve been to Costa Rica, right?

PIPPIN: I have, and I went to Mount Arenal when I was there. Was it active?

BRAD: It was. You’re not allowed on Mount Arenal. I think it’s just called Arenal Volcano.

PIPPIN: Yeah, I think that’s right. Yeah, when we were there, we were staying in a little kind of resort at the bottom or somewhere near the bottom of it. I remember just sitting on the back patio and watch as some of the lava rocks come flying down, and it was pretty cool.

BRAD: What?!

PIPPIN: Especially at night.

BRAD: Oh, you were there at a good time then. The volcano must have been very active. It’s active in that it’s still dangerous enough that no one is allowed on the volcano, but, yeah, I don’t think you can see any lava flow or anything these days.

PIPPIN: Oh, yeah. Okay. We could at night. We didn’t necessarily see any during the day. During the day it was just smoking. But, at night we would see little trickles, and we’d see rocks come down every now and then.

BRAD: How long ago were you there?

PIPPIN: It was when I was in high school. I was 16, so about 10 years ago.

BRAD: Oh, yeah. Okay. I did read some comments from 2008, I think, and you could still see lava and stuff then. But, yeah, when I was there I’m pretty sure there — anyway, I didn’t know about it, so we didn’t see any of that. But, yeah, we did that and just went on some hikes and stuff and saw lots of animals and stuff, so it was pretty awesome and, yeah, a much needed vacation.

I only took my tablet with me. I’ve got a ten-inch Samsung tablet, and I just took that with me, so I was just working on that. It was a great deterrent to not work because it’s tiny, a tiny screen. And the keyboard, I have an external keyboard for it, but the keyboard kind of sucks. It’s like plastic, cheap plastic, and it’s small and cramped. I kind of did that intentionally so that I don’t like using it.

PIPPIN: Yeah, you’re not tempted to work.

BRAD: Yeah, exactly.

PIPPIN: I found that I actually really, really enjoy working on a tablet in certain environments. Number one, in places where I’m not supposed to be doing a lot of work and maybe just have a few very focused tasks to do because it takes away so many potential distractions. Because you’re limited in what you can do, you kind of get done what needs to be done and that’s it.

BRAD: Yeah. I found it good for just keeping up with emails and keeping up with the conversations that are going on in Slack, just kind of keeping up, in general, but not really producing a whole lot so that when I came back, I didn’t have this mountain of stuff to go through. It worked out pretty good.

While I was away, we actually released 0.8 of WP Migrate DB, the free version. And, by the time that this airs, actually, we’ll probably have released Migrate DB Pro 1.6, which is a big UI update, so check that out.

We’ve been blogging, as usual. Ian wrote a great post about backbone JS and building a dashboard widget using Backbone and using just the ajax, typical ajax endpoint in WordPress. What is that called? Admin ajax, admin-ajax, right? Yeah. Check that out. It’s pretty cool, especially if you haven’t done a lot of Backbone. It’s a great primer for getting into Backbone.

PIPPIN: It’s a massively long post too.

BRAD: It is a very long post. It is what you would call a tutorial post because it’s one of those ones that you might want to break it up and do it on several sittings. But it’s cool. It’s got all kinds of code samples and stuff, and he explains things really, really clearly, so it’s good.

Then we had another Ian–Beardy, we call him–he did a post called Using Codeception to Automate WordPress Plugin Testing, which is pretty neat. Codeception allows you to automate some of the manual tests that you would run. So, unlike unit tests, tests like log into this thing and do this action with your mouse, that kind of thing, Codeception allows you to basically script those actions. It’ll perform them and then test to see if the result is what is expected. He dives into that and kind of shows how to set it up, so it’s pretty cool.

PIPPIN: Very cool.

BRAD: Yeah. Anyway, what have you been up to?

PIPPIN: Well, last weekend we discovered a severe bug in one of our plugins, in our Recurrent Payments plugin, actually, for EDD. It was one of those that you discovered on a Sunday night, and you realize this doesn’t wait until Monday. We have to fix this immediately.

It took us until Monday evening or Tuesday to actually get it fixed. I think it was late Monday, so we had an upgrade routine that ran on our new version. The upgrade routine only applied to people that had been running previous versions of it. The new version was 2.4. It only applied to people that were running 2.3 or earlier for an extended period of time, and also only applied if you were running our Stripe payment gateway.

In our upgrade routine, we had this process that looped through and recreated new subscription records. Our new version of the plugin introduced a whole new database for subscription records, and we had to pull all the old data and put it into the new database. And so, in that process, we would query it. We would query all customers, and then we would loop through each one and create the subscription records as necessary.

Well, we had a fatal error. I don’t mean like an exception type error in PHP. I mean a fatal oops in our upgrade routine where we had a variable that referred to the ID of the customer inside of a Stripe account. That variable did not get reset on each loop or each iteration of the loop. It didn’t get reset because, on every single beginning of every single iteration of the loop, we actually re-queried that variable.

Well, we discovered that there was a particular case or two cases, actually, where that query, to get a new customer ID or get the customer ID for this particular subscription record, didn’t happen, such as a customer that had paid through PayPal standard or, for whatever reason, their customer ID in Stripe couldn’t be discovered. What happened is we accidentally assigned the same customer ID to multiple records in our database.

Then what would happen is, let’s say that one of those customers who had the incorrect ID assigned to them went to make a purchase. Their new subscription that they purchased would get assigned to the wrong customer in the Stripe account. Also, their debit or credit card would get added to the wrong customer in Stripe as well. Oops!

We discovered that on a Sunday evening, and we realized, uh-oh, we have to fix this immediately. This is not something that can be delayed. This is not a minor fix. This is immediately we are onboard until we have this fixed, and we did.

We fixed it. Not only did we fix it; we also wrote an upgrade routine that went through and resolved it for any customer record that was affected. We sent out a detailed email to every single customer of the plugin and said, "Hey, here’s how you know if you’re affected. Here’s what you do if you need to fix it, et cetera. Here are the possible consequences and worst-case scenario."

We worked directly with several customers to get it fixed on their site as kind of a beta test for it. Hindsight is 20/20. The entire problem was resolved by one little line of code to reset a variable. It makes you realize why there are standardization rules in development environments, things like why we have guidelines that say you always use braces around conditionals as opposed to the non-brace style conditionals in PHP.

BRAD: Would those have avoided this?


BRAD: Oh. How so?

PIPPIN: Well, not braces in this case, but all we had to do was to say, "Profile ID = empty string," at the beginning of the loop and the problem would have never occurred. And so, if we had either reset all of our variables that we were setting up on each loop at the beginning or unset them at the end, the problem would have never occurred. And so, it was a one-line mistake.

Now, the crazy thing about it is that in order to fix that one line that we didn’t put in, it took over 450 lines of code and 37 to 48 man-hours of development. For us, it was a good reminder and lesson of: These are why rules that sometimes may seem silly exist. It reminded me of about a year or so ago when the big Apple security flaw came out, and it was discovered that it was due to somebody who had not used the braces on a conditional. When you look at it and it seems perfectly fine, but then you discover that, I mean, it’s why we have defensive coding is things like this.

BRAD: Right.

PIPPIN: That was fun.

BRAD: Did you say it was about 48 hours, it took?

PIPPIN: I think it took — from the time that we realized exactly what it was to when we had it fixed and deployed was about 48 hours.

BRAD: Most of the work there involves trying to figure out a way to fix everybody’s install that got kind of screwed up. Is that right?

PIPPIN: Right. It was how do we fix anybody who was affected by the bug and go through and update customer records to make sure they’re correct, make sure that no charges can be put on incorrect cards, make sure that if there was a subscription purchased that got assigned to the wrong customer in Stripe, make sure that that is removed and they don’t accidentally have a subscription that, to them, came out of nowhere, all of those things.

BRAD: Right. Was that running as a background process, or do they have to run that actively?

PIPPIN: No, it was a manual upgrade. We gave a notice that says, "Hey, you need to update this database, and you’re going to see it run."

BRAD: Right. You’re going to sit here until it’s done.

PIPPIN: Right. Well, so one of the unfortunate caveats of it, and it’s one of the reasons why it actually made it such a bad bug to fix was, let’s just say that a customer purchased a subscription and their subscription got assigned to the wrong customer in Stripe. That subscription actually had to be cancelled in Stripe because there’s no way to move a subscription from one customer to another. And so, one of the problems that we spent the most time trying to figure out is how do you identify subscriptions in the Stripe account that are incorrect. So, how do we ensure that we don’t accidentally cancel a subscription that shouldn’t be cancelled?

My worst nightmare, and it made me literally not sleep at night, was the possibility of us going through all of these subscription records on a site and discovering that we cancelled 100 subscriptions that weren’t supposed to be cancelled. Those are the types of things that took a long time to work out and make sure that were not happening.

BRAD: Were there moments where, in the discovery process when you first discovered the bug, where you were just like, "Oh, my God! Oh, my God!" whereas, "I don’t think we’ll be able to come back from this!" and then you eventually figured it out?

PIPPIN: Well, originally, we got the first hint of something wrong about a week before we tracked down what the bug actually was. It was simply through a customer support ticket of somebody saying, "Hey, I had this weird behavior happen," and annoyingly it’s one of those things that, if we had caught it that day, we could have immediately pushed a fix and it would have only affected a very small number of users, but we didn’t. We didn’t recognize what it was immediately.

We recognized it a week later when one of our guys pinged me and said, "Hey, I’m sitting down to work on this minor issue." I said, "Hey, I think we might have another issue you should go look at," and so he dives in and looks at it. Then a few moments later it settles in my mind exactly what the bug was, and I think I remember telling him, "We have a problem and it has to be fixed immediately. Whatever you’re doing, drop it." It’s just one of those moments.

It occurred to me that if we fixed it wrong, and we ended up canceling a ton of subscriptions that we weren’t supposed to, we might be affecting businesses in the tens of thousands of dollars or more. That would be pretty hard to swallow.

BRAD: Right. Because they’re subscriptions, you might not even know about it until later on when they start to renew or something, right? Did you guys work basically nonstop for 48 hours, or people sleep? How did that go?

PIPPIN: Chris started it and then did a lot of the legwork, and then it just happened that it was also a day that I was gone.

BRAD: Chris Klowski?


BRAD: Okay, because you have two Chrises, right?

PIPPIN: That’s right, we do have two Chrises. Then I took over, and we worked until pretty late at night and then got a little bit of sleep. We kind of went to a point where we thought we had it done and it was working, and then said, "Okay. Now we’re going to sleep on it. We’re going to come back. We’re going to test it more in the morning," which is a good thing that we did because we ended up finding, like, five extra edge cases that we had to account for.

BRAD: Nice.

PIPPIN: Then it took about another 12 hours to finalize it.

BRAD: Yeah, sometimes it’s better to go a little slower.

PIPPIN: Yeah, absolutely. Don’t ever push an urgent fix that you’ve been working on for 18 hours at 2:00 in the morning.

BRAD: You could end up doing more harm than good sometimes.

PIPPIN: Oh, and we absolutely would have.

BRAD: Yeah.

PIPPIN: Anyway, that was good. I don’t know if it’s luckily or just because we worked really hard at it or whatever, but everything has ended up really, really well. We haven’t had a single report, a problem of it. All for the better, and it was a nice lesson in defensive coding. That’s for sure.

Other than that, my other little update is that today is our fourth anniversary for Easy Digital Downloads, which is kind of fun. I ended up writing up a big blog post about it at PippinsPlugins.com that got published this morning. We’ll talk a little bit about it at the end of this episode. But, if you’re interested in reading it, you can go find it at PippinsPlugins.com. It covers a few things.

The other kind of fun fact, and we’re hoping that this actually happens–it will have happened by the time this episode airs, but while we’re recording it–is that we’re going to hit one million downloads for EDD, and we’re really hoping that it’s today on the fourth anniversary. It’s a vanity metric, but it’s kind of fun to have the two coincide.

BRAD: Yeah. Congrats on four years, man.

PIPPIN: Thanks, man. It’s been a journey.

BRAD: Yeah, it always is with entrepreneurship.

PIPPIN: Yeah, absolutely.

BRAD: It usually is. We’re hitting three years for Migrate DB Pro tomorrow, actually.

PIPPIN: That’s great.

BRAD: I’m not sure what it is about April and launches.

PIPPIN: Well, our Affiliate WP two-year anniversary was last week.

BRAD: Right.

PIPPIN: Apparently we have something for April as well.

BRAD: It’s spring.

PIPPIN: I think you get antsy in winter, and spring. Yeah, time to build new things.

BRAD: Yeah, everything is growing and blossoming. It’s when you want to push something new out into the world, just like nature is doing.

PIPPIN: You know, it’s kind of cheesy, but it’s totally true.

BRAD: There might be something there.

PIPPIN: Yeah. All right, let’s chat about WordPress 4.5. This launched on–what day did this go out–two days ago, Tuesday, three days ago, Tuesday or Wednesday. WordPress 4.5 launched and was led by Mike Schroder. Mike, a sincere thank you from myself and everyone else for all of the work that you do and did on 4.5 and every other release. Mike has been a long time contributor to core.

BRAD: Yeah.

PIPPIN: And is, yeah, a great asset to the WordPress community.

BRAD: Yeah.

PIPPIN: Mike, thank you.

BRAD: Thanks, everybody else, who contributed to core.

PIPPIN: Yeah, there’s a ton of contributors, just a ton.

BRAD: Yeah, tons, so it’s a team effort. But, I have to say, though, from what I’ve heard from lead devs, Mike needs an all expenses paid vacation for like a week right now.

PIPPIN: Oh, I’m sure.

BRAD: Maybe for future WordPress core leads, we can do an Indiegogo or something for them. Send them away for a week because it’s a pretty rough kind of sprint to the finish, I guess, for release leads.

PIPPIN: Yeah. It is not an easy job by any means.

BRAD: Yeah.

PIPPIN: There’s some pretty cool stuff in 4.5. Should we go through them real quick?

BRAD: Yeah. I’ll start with the first one. In line link editing is kind of like the first thing. It’s a UI improvement to the WYSIWIG. Do people call it something different now? The Visual Editor, I think some people call it.

PIPPIN: I think it’s just Visual.

BRAD: Yeah. Anyway, the non-HTML editor. Anyway, it’s just a UI update to that, but it’s a really nice update. It just adds a better UI for inserting, like highlighting texts and inserting a link. It’s just a little bit less. I think, before, it was like a model, a modal popup that came up.

PIPPIN: It was, yes.

BRAD: Yeah, and this, it’s no longer a modal popup. It’s just kind of something that’s just more compact and less intrusive, I guess, so it’s a kind of nice feature.

What else do we got?

PIPPIN: We’ve got — there are new shortcuts for some formatting. If you haven’t seen it yet, one of the really nice improvements in 4.4 was that if you wanted to make a bullet list or I believe there are block quotes, headers, et cetera, you can use some of the standard formatting from Markdown and the Visual Editor will automatically convert it into the HTML.

In 4.5, you can use back ticks to insert a code block. Let’s say if you’re writing a dev post and you want to type the name of a function, and you want it to highlight in the way that it would in Markdown, like you might be familiar with on GitHub or WordPress.org or other places, you could just do a back tick, do your code, do another back tick, and core will automatically format that inside of code tags. Then it also supports the same thing for horizontal rules.

BRAD: Right. Three dashes, I think, and it converts it into an HR.

PIPPIN: I believe that’s right.

BRAD: Yeah, so that’s pretty cool. What else? We’ve got desktop, tablet, and mobile toggles in the customizer that were added, so you can do a live preview of your theme in different screen sizes, which is kind of cool.

PIPPIN: Yeah. For anybody who uses the customer a lot, that’s going to be huge. I know one of the features that I really like in Chrome, and I believe a couple other browsers–I’m sure Firefox has it and maybe Safari– is in the developer tools is the toggles to switch to different screen sizes. You can immediately go to phone size or tablet size, and it just resizes your view port in the browser. It’s a super handy feature when developing anything front-end that you need to make sure is responsive. It’s just one more way of being able to preview your site across devices without actually using all the different devices.

BRAD: Yeah. I think it’s a pretty nice little feature. What’s also nice for developers, theme developers, is that they can add a filter that adds additional devices. Say you have a client that wants to be able to preview on–I don’t know–let’s say a 7-inch tablet for some reason, maybe a 7.8-inch tablet. You could do that, right? You could add another control for that specific size, which is kind of neat that it’s extendable like that.

PIPPIN: That is very cool.

BRAD: What else?

PIPPIN: Let’s see. There’s now support for custom logos. I think this is a kind of fascinating feature. I think it’s a good feature as well, so they added. There’s now a dedicated way to add logos through the customizer, and just in general, inside of WordPress, and themes can register support for logos and there’s a dedicated helper function for outputting the logo on the front end.

Personally, I think it’s a little — I don’t want to say it’s unfortunate or disappointing or anything. I’m thrilled that this feature is in now. I think it is a feature that would have benefitted being in eight years ago. Simply the reason being is that it is a feature that in order for sites to take advantage of it, in order for plugin developers to take advantage of it, themes have to adopt it. At the rate that we have right now, only brand new themes are going to have it, which is true of any theme feature, whatever the feature is, whether it was post formats, whether it’s audio, multimedia, responsive images, or any basically front end feature that has to be implemented through themes. The adoption is going to be a little bit slower, so we’re going to have thousands and thousand and thousands of themes out there that will not have support for this.

Now, it’s going to be awesome to have it in new themes. But, let’s say that as a plugin developer, you wanted to do something that affected logos. Maybe you’re an A/B testing plugin and you automatically swap the logos between two versions or something. In order to do that, for plugin developers, you have to have a wide adoption of that feature. It’ll be a while before we can do it. I’m thrilled that it’s in, but it is something that I wish we had had a long time ago. Better late than never.

BRAD: Yeah. It should be interesting to see how adopt goes for this because I’m pretty sure most themes that need a logo customized, they already have an option in their framework for that. And so, will those themes discard their current UI for this new thing and then have to deal with all the customers asking them, "Where do I customize the logo?"

PIPPIN: Well, you know, I think it’s related to custom headers and custom background features. Those are features that have to be implemented in a theme in order to be utilized. I think it’s right. I think that is the right way to do it. It just means that sometimes those are features that are a bit slower at adoption.

BRAD: Right. Yeah, and that’s probably all right.

PIPPIN: Yeah. That is in no way a reason to say, "Oh, that’s a stupid feature," or, "Why would you do that?" No, because those are features that we need. We need to have that standardization. Right now if you look at themes, there are a thousand different ways that theme developers add logos to sites. Let’s be real. Every single site, with very few exceptions, has a logo of some kind, even if it’s just a tagline. To me, that immediately says, "Oh, that should be standardized or have a standard way to do it. Sure, you can still do it a different way if you want," so I’m glad it’s in.

BRAD: Yep. One thing I noticed today — I was poking around the customizer. I very rarely use it, but I notice that it goes full screen, and I mean full screen. It gets rid of the nav on the left side and the toolbar, the admin toolbar at the top. It almost looks like WordPress just disappears. Then you have to actually X out of it at the top. I never really noticed that that was the case, but I found it really interesting because I don’t think I’ve ever seen a plugin do that.

But, I think some plugins probably should do that because let’s say if you’re a forms plugin, for example, and the user is editing a form. Well, do I need all these? If I’m in the mode of editing a form, why do I need all these nav links on the top of my screen and on the sides? I should be able to focus on that task of creating a form and then exit out of it, just similar to how you’re customizing your site and then you’re exiting out of it. It’s a very kind of specific task that probably takes a good chunk of time, so it’s worth having a focused experience.

I’d love to see more plugins adopt that, that kind of UI, I think. Yeah, it would be interesting to see. If anybody knows other plugins that do that, let me know in the comments because I would love to check them out.

What else is new in 4.5?

PIPPIN: There’s a new function called WP Add Inline Script, which is very handy. We’ve had one called WP Add Inline Style for a long time, and it’s for outputting inline scripts. It’s a very aptly named function, and it just uses the internal APIs to register and output that script inside the page. So, if you are doing anything with inline scripts in your plugin, whether it’s in a short code or elsewhere, start looking at and considering using WP Add Inline Script.

BRAD: Yeah. It’s interesting how you can pair it using the handle, like when you do, let’s say, WP Enqueue Script, like you would define some kind of handle like My Script or whatever. You would use that same handle, and then it will include your inline script right underneath the enqueued script when it does its output, which is important because if you’re, for example, doing type kit, which is the example they use on the Make blog.

Type kit, if you enqueue the type kit script, like the JS script, and then it has a little bit of inline script that you also need to include, so then you could use this function to include that. That’s a pretty neat little addition. There was really no great way to do that before. I think most people used the WP head hook to do that.

PIPPIN: Mm-hmm.

BRAD: Anyway, I nice addition.

PIPPIN: For sure. Embed PHP is also new. It’s the standard template file for the O-embed endpoint for content. So, if you want to customize how the O-embed looks, you can use embed.php, and all of your standard template tags work inside of there.

BRAD: Right. They’ve got a bunch, actually. It’s embed.php, embed-404.php, embed-content.php, header-embed, and footer-embed, so you can really get granular with it if you want. That’s kind of neat.

There’s a new function that was added: wpgetuploaddir (directory). It’s just a better performing version of wpuploaddir. Apparently wpupload_dir was going through the folder structure and looking for if the folder existed and then trying to create it if it didn’t exist, which is a pretty intensive process, right? They spotted that performance inefficiency while they were working on responsive images in 3.4, I think, and so this was the effort to make that more performant, so that’s pretty cool that they fixed that up.

It’s nice also to know about that new function. Themes should really use that new function instead of using wpuploaddir because it’ll just be better, better performance for themes.

PIPPIN: We also have new performance improvements and better image compression, which is kind of cool. I actually have not read into this too much. Do you know more about it?

BRAD: I do know a bit about it because I was kind of following along when the responsive image stuff was happening. What happened, so the responsive image stuff that went into 3.4 was a feature plugin called the RICG Responsive Images plugin. What was a part of that plugin was improvement in image compression and resizing.

What happened was, when 3.4 came along, it wasn’t quite ready, that part of it. The image compression stuff wasn’t quite ready. The responsive stuff was, so they just split them and just included the responsive stuff in 3.4. But now, for 3.5, they’ve gotten it ready and got in the resizing improvements.

The default quality of resize images has gone from 90 to 82. That’s on a scale of zero to 100, so zero being the top, the highest compression and the worst quality, and 100 being the best quality and almost no compression. Actually, probably zero compression. So, 82 basically makes it slightly worse quality, but it’s not a discernible difference. They did a ton of testing to figure out if the human eye could see the difference.

PIPPIN: Right, so it’s not discernible to humans, but absolutely important when it comes to size of files.

BRAD: Exactly, so the size of the resized images are going to be greatly reduced. I don’t know if "greatly" might be a bit strong – significantly reduced, we’ll say. If you’re using the Image Magic extension on your server, so the other option would be GD, the GD library for images, if you’re using Image Magic, which I think most people are, it’ll strip out any irrelevant metadata when it creates the resized images as well, so it will further reduce the sizes of the resized images.

This whole thing started when a guy named Dave Newton wrote a post on the Smashing magazine about improving imagery sizing with Image Magic. It’s a really exhaustive post, and he’s got a ton of tests in there and stuff. It was super interesting if you want to get into the nitty-gritty details.

Then Joe McGill kind of took that and kind of ran with it to do some more work on it. There are other people involved, too, but I’m not going to get into listing names. We’ll be here all day. Lots of people had a hand in this. We know that for sure.

What else?

PIPPIN: We have a 4.5 field guide, which we will link in the show notes. Basically, it is a complete overview of 4.5 posted by Aaron Jorbin on the Make.WordPress.org/core site, and it covers a lot of things in detail. It also covers some of the breaking changes that were made. It’s definitely a good rundown post to go look at.

BRAD: Yeah. Yeah, the notable ones are Backbone and UnderscoreJS. Those libraries were updated, and I guess they have breaking changes in them, in those libraries themselves. Apparently jQuery, which was also updated in this release to 1.12.3, has some breaking changes as well, but I didn’t realize this until we were just talking today, Pippin.

PIPPIN: Yeah, so there is a breaking change in it that it’s only breaking because it corrected — I don’t know. You could say it corrected a bug in previous versions. It used to be that there was a syntax you could use that was not supposed to work, but it did. They fixed it so that you can’t do that anymore, and so anybody who was using that syntax has seen jQuery errors pop up.

We actually got affected by this because one of our old, old EDD themes that was written three and a half years ago or so actually used the old syntax. All it is, let’s say that you are trying to target an element in jQuery, and you’re trying to target it based on maybe an attribute or something like that. And so, you use the syntax something like — let’s say that you’re targeting anything, all anchor tags that have a specific href. You say: a[href= in the ID there. Well, that’s supposed to have quotes around it in the href=. In previous versions, you could actually do it without quotes. Now you have to use quotes for setting that, what the href value is or whatever the attribute value is. If you weren’t, it creates a JavaScript error. And so, if that’s what you’re experiencing, a JavaScript error, that’s probably why.

BRAD: It might be why. Is this related? I know there was, like, at a certain point jQuery kind of split into two files. One was called the Migrate, jQuery Migrate or something. Do you know what I’m talking about? Is this making any sense?

PIPPIN: I do know what you are talking about. I don’t know how….

BRAD: Much about it, yeah. I don’t. I was just thinking maybe they just dropped that migrate thing in this release or something, but I really don’t know. Anyway, the bottom line is there are breaking changes, so beware.

PIPPIN: Yep. There is also a really good post on WordPress.org support forums that covers a lot of details. It also covers a lot of issues discovered in popular plugins with fixes included. So, if you are experiencing any issue with 4.5, go check out those first.

BRAD: Okay. We should include that in the show notes for sure then.

PIPPIN: Yeah, I’ll dig up a link to it.

BRAD: Okay. All right, I guess there is one more breaking change in 4.5. The Term Edit Screen has been separated out from the Term List Screen. We’ll link the details of that in the show notes. It doesn’t sound like too many people are going to have an issue with breaking things there, but if your plugin does deal with the term page, then you should probably check it out.

Should we talk about imposter syndrome and what that means?

PIPPIN: Yeah, let’s do it.

BRAD: All right. What does it mean?

PIPPIN: Imposter syndrome is the idea or the mentality or however else you want to describe it of feeling like you are an imposter, feeling like you’re not actually good at what you do, feeling like everybody else is obviously better than you. A lot of times you may be reluctant to share your work because you feel inferior or the work or the things that everyone else is doing are so much better. You see them reaching so much further, much better success, et cetera, and so you feel like an imposter, especially an imposter among peers.

And so let’s say within the WordPress community. There have been quite a few people that have written about it, feeling like, okay, I am the creator of a product, but everybody else’s products do so much better than mine. It makes me feel like mine isn’t very good. It makes me question myself. Maybe I’m not a very good developer. Maybe I’m not a very good product creator, et cetera. That’s kind of the gist of imposter syndrome.

We’re talking about this today because I just published a blog post this morning announcing the four-year anniversary for Easy Digital Downloads. I kind of went through some of the highlights, some of the struggles, some of the victories, et cetera. One of the biggest struggles that I wanted to put out is that every single one of us is an imposter or feels like it at times.

The example that I went through is that, throughout these four years of building EDD, I feel like we’ve done some really cool things. I think we’ve done pretty well for ourselves. We’ve built a good team around the product. We’ve built a good company out of it. We’ve seen some pretty good success when it comes to revenue, with taking care of ourselves. All of these things have been quite successful for us overall.

But then, I wanted to reflect a little bit on how it’s very easy for us, even with all of those highlights and those accolades, et cetera, to still feel like, dang, we’re not succeeding. We’re not progressing as far as we need to because we see other projects. We see other people doing things so much further and beyond us that clearly we must be doing something wrong. Clearly we’re not good at our job.

The examples that I gave were: Why is Woo Themes and WooCommerce so successful and so large on their scale and we’re not? Let’s take our good friends at WP Ninjas that create Ninja Forms. They started some time after us and yet they have vastly surpassed us in the number of installs, in the number of customers that they have. It’s very easy to say, well, why? Why don’t we have that? This is an effect of the imposter syndrome.

This was kind of my personal confession saying, "Yes, I understand that I have a pretty good reputation and status within the WordPress development community, and there are a lot of people that look up to the Easy Digital Downloads project, look up to what we’ve built, look up to me, et cetera. But, even with that, we still feel like imposters every single day." It was a good reflection for me to do that and also, I think, a reminder for everybody to say, "Look. It’s okay because everybody feels this way," was kind of where I was going with it.

Brad, do you have any thoughts on any of it?

BRAD: Yeah. It’s interesting. It’s like — I don’t know. Yeah, I was just looking up the definition of imposter syndrome, actually. It’s interesting. I’m going to read it because it’s a term that is a clinical term coined in 1978 by clinical psychologist Dr. Pauline R. Clance and Suzanne A. Imes referring to high achieving individuals marked by an inability to internalize their accomplishments and a persistent fear of being exposed as a fraud.

That’s really interesting to me, that definition, because I think I had this when I was working on WP App Store. It was probably when I had it the most. It’s like who am I to be doing this. You know what I mean? Like, who am I?

Going to the first PressNomics and hanging out with the Woo Themes guys and these big, heavy hitters in the WordPress world that have been at it for years and have huge businesses, and I’m here as a startup, basically an unknown guy trying to do this big thing. Yeah, I felt like an imposter for sure during that conference. And so, yeah, it’s difficult, right? It’s difficult to deal with. But, I think, at that point I was probably more justified feeling like an imposter because I hadn’t really accomplished anything yet.

I think imposter syndrome is when you have all these accomplishments and you dismiss them as not really accomplishments. Is that kind of what you were getting at?

PIPPIN: Yeah, absolutely. Let me give you an example, and this is one that I included in my blog post as well. About a year ago, I had a friend say to me that we’re miles and miles and years behind Woo Themes in the e-commerce world and, because of that, if we want to succeed, we need to partner with somebody who can propel us forward. That was one of the first times that I had kind of looked at it as, like, I thought we had been doing great. I was very pleased with where we were.

Then this comment is made and it makes me start to second-guess myself. It’s like, well, maybe we haven’t achieved anything. Maybe we haven’t. What does 40,000 websites mean? That’s not that many. What does X dollars in revenue mean? They have all of this, these ridiculous numbers. Okay, so clearly I’ve failed. It was kind of that, my response to that comment.

BRAD: Right. Like, what does success actually mean?

PIPPIN: Right. Right, because clearly in those eyes I haven’t succeeded.

BRAD: Right. Up until that point, you felt like you probably had.

PIPPIN: Yeah, I felt great.

BRAD: Then they kind of upset the bar that you had set for yourself.

PIPPIN: Totally screwed up my happy little world.

BRAD: Yeah, right.

PIPPIN: And it took me a while to come to terms with what that really meant. Here’s what I ended up deciding. This is what I wrote more about this morning is that it doesn’t matter, and you have to come to terms with that because every single one of us builds our own definitions of success. I have realized that my goal and my definition of success is not the same as the friend that made that comment. It is not.

I have no aspirations to become bigger or better or larger or anything like that as WooCommerce. As an e-commerce platform, that is not my goal. It is not my goal to be the default platform or the best platform or anything like that.

I have revenue goals, but it doesn’t necessarily matter. What really matters is that everybody has their own definitions and what they’re striving for and what they’re trying to achieve. And that’s okay. That’s great. Just because someone looks at your own definitions and says, "Well, those don’t match mine," doesn’t make you wrong, doesn’t belittle your own success in any shape or form.

BRAD: Right. I like the idea of setting the bar at — looking at a big competitor or a big player in the space and saying, "I’m going to be better at X than them. That’s going to be my goal. They’re huge, and they’re successful and everything, but I’m just going to be better at this small part of what they do," or something like that.

Kind of carve out your own niche kind of within what that big player does. I think a lot of companies have started like that and have been very successful in building a business that way. Then it sets that bar kind of at a better level.

PIPPIN: You know who I bet had severe imposter syndrome?

BRAD: Who?

PIPPIN: The collision brothers.

BRAD: Collision brothers?

PIPPIN: That’s not right. That’s not the right pronunciation. The two brothers behind Stripe: I bet you when they first started, the shadows of Authorize.net, PayPal, everyone else, and look where they are today. I don’t know of any evidence or blog posts that they’ve ever written that says that they did, but I bet you they did because they were starting.

They were taking on literally giants, and they have dominated. It’s because they did, they carved out their niche. They said we’re going to make payment processing easy for developers, and we are going to win at that. That striving with that focus has led them to be now one of the most dominant players in the world.

BRAD: Yeah. I love that. I love that story of just saying that you’re going to be better, you know, better at this very specific thing and then tackling it that way. Then who knows where that will take you? You never know, right? You could end up displacing the big player. I feel like Stripe is on their way to doing that.

PIPPIN: I think they’ve already displaced a bunch of them.

BRAD: Oh, no doubt.

PIPPIN: If not, I guarantee you that Stripe is on the radar of every single credit card processor.

BRAD: Yeah.

PIPPIN: At least the ones that are not blind and foolish.

BRAD: Yeah, and PayPal, I think, is still the dominant one, right? But, I wouldn’t be surprised if Stripe was in second place right now because I feel like wherever I go to buy something, there’s kind of the credit card form and still PayPal.

PIPPIN: Oh, always.

BRAD: There’s always….

PIPPIN: I think that’s going to be the same way for a long time.

BRAD: Yeah, because PayPal, people know PayPal. People are comfortable with PayPal. They trust it, and they look for it. If you don’t have PayPal on your checkout, I think people, a lot of people you will lose, and you’ll also get lots of requests. We’ve never had the gall to take off PayPal to see what happens.

PIPPIN: My brother tested it on their CG Cookie website, and they’ve actually stuck with it. They have left PayPal off completely. But, he tells me that they still get a lot of requests to pay with PayPal. Their method has been, "We’ll send you a manual invoice for it if you really want to do it."

BRAD: Did he ever discuss his reasons for getting rid of PayPal?

PIPPIN: There was a whole number of reasons. Some of them have to do with measuring metrics. Some of them have to do with just subscription management. Get everything inside of one API so that you don’t have to worry about working through two different processors, things like that.

BRAD: Right. Yeah, I mean PayPal has a bad track record of freezing accounts and stuff, too, so that hasn’t helped them either.

PIPPIN: Right.

BRAD: Anyhoo, we should probably wrap it up.

PIPPIN: Yep. If anybody has comments on any of this, feel free to drop us a note on the blog or ping us on Twitter or any other method you feel like getting in touch with us. I would like to leave you just one more note that if you have ever felt like an imposter, remember that everybody else does too.

BRAD: Awesome. Talk to you next time.

PIPPIN: Later.