My friend Allie Nimmons asked recently if anyone would read a WordCamp US 2019 recap were she to publish now, and the feedback was highly positive. So much to the point that Allie published her WordCamp US Recap that same day, and inspired me to write one myself. I am not quite as quick as getting things published π
Community and Diversity
Allie devotes a good portion of her post to talking about community, which if you already know me, know is one of the topics that I can discuss to the point of making people tired. That’s not a joke, by the way. I have twice had people tell me (once anonymously, once not so much) that I spend too much of my stage time talking about community.
I joined Allie, Jill Binder, and Aurooba Ahmed in giving a workshop on improving diversity at events, with a focus on improving diversity of speakers. More information on the workshop (as well as how to run it in your own community!) can be found at the Make WordPress site, and you can also get the workbook that Aurooba put together for us.
Personal Scheduling
This was one of the most highly scheduled WordCamps I’ve ever attended. I had a tight schedule already, arriving late the night before and leaving the morning of contributor day. In between I had volunteer orientation and a few volunteer shifts, a SiteGround meeting, an organizer meeting, and of course the workshop and my own presentation, The Power of CSS.
My one regret this time around was the sessions that I had to miss. I was told that I got some shoutouts from Tantek Γelik during his talk, “Take Back Your Web”. I absolutely would have attended that regardless of a shoutout, considering how integral Tantek has been to the IndieWeb movement that I’m trying to become more involved in.
Similarly, The Web We Want did a session discussing changes that users would like to see on the web and how we as a community could work to make them happen. The idea looks great on the whole, and I would love to see it expanded in ways to be more accessible to people who aren’t able to attend a few large events or have heavy development skills. I submitted a few suggestions prior to the event, but due to scheduling was unable to be there in person to hear other ideas and see the panel discussion.
My connection to WordPress events revolves almost entirely around people. Whether that’s meeting new people or spending time with friends met online or via past events, I try to devote most of my time to conversations. That was easy to do with most of the jobs that I had, but even in this regard I didn’t fully succeed. As an example, I briefly got to meet david Shanske of the IndieWeb community as he introduced himself to me prior to our workshop, but I was unable to connect again until after the event. When a barrier to community involvement is not exactly knowing where you fit in and how to help, having conversations and finding allies is important. I aim to do so in the future so that one day I feel a bit less like an outsider imposter.
A Shift in WordPress
I won’t be the first to say that the WordPress Community and events have changed a fair amount over the past year. There are a variety of reasons given for this, and I imagine that it’s a combination of factors. WordCamp US certainly felt a bit more corporate than it has in years past, though that’s not really a bad thing to me for an event of this size.
I do think that the disconnect between funding (both the decline in sponsors and rules/limitations) and the volunteer nature of the event are also a cause for concern. I still have yet to get a good answer to a question that I had stemming from a conversation about WordPress Global Sponsors from over a year ago, and part of my concern is that I seem unable to
Highlights
Finally, a quick rundown of some of my favorite parts of the event.
Meeting Jean Perpillant for coffee before the event, freezing my hands in the cold to get a picture of the Arch during the sunrise.
Chatting with Cami Kaos and Courtney PK about some non-WordPress things for a change, like gardening, pets, XOXO Fest, and their love for Portland.
Checking Twitter after my lightning talk and workshop to see a lot of positive tweets, helping to slightly alleviate the worry that I did a poor job.
The talks that I did attend! Like
Spending time with the SiteGround crew! This included a dinner in which I overstuffed myself before entrees even arrived, a productive meeting, and catching up with more people about work and life outside of the conference.
One of the things that I handle for clients at FixUpFox is site speed optimization. I also help with performance optimization, which I almost lumped into this post, but I think that it deserves its own overview at a later date.
I also began blogging more regularly on this personal site, thanks to the support from the Blogging Accountability Group that I formed with a few members of the WordPress Orlando Meetup. One of the things that I want to do is to improve the theme that I use on the site, and one of the ways that I want to do that is to improve site speed.
There are quite a few reasons to want to improve the speed of a site. Most concerning to me are based around resource usage and visitor experience. Loading a smaller page does a lot of good, including:
Less bandwidth and resource usage for visitors, improving loading speed and battery life
Lighter energy usage footprint, reducing ecological impact slightly
Here’s a quick overview of what I did for my personal site, which can be what I do for a client site, depending on their needs. I have to note that I don’t do much in terms of tracking on my site, and I don’t run ads. Those are often the two biggest blockers that I have to increase page performance for clients.
A baseline of performance
The first thing that I do is establish a baseline of the site. That lets me get an idea of what improvement that I end up with, but also places to start looking at making changes.
Performance grade: C β 77 Page size: 1.1 MB Load time: 1.37 s Requests: 56
The above indicates that I loaded 1.1MB worth of data on this page, taking an average of 1.37 seconds over their tests, and that 56 separate files were requested to load this page.
This isn’t terrible, but I had a feeling that I could do better with a few simple changes.
Removing Unused Scripts, Styles, and Fonts
First, I started by reviewing external requests. That includes any JavaScript files, CSS stylesheets, and fonts that load along with the rest of the page. I had 56 requests being made to load that page, which is far from unusual, but a bit high for a personal post about a trip on my non-monetized site.
Boilerplate Scripts
A plugin that I use to manage things like my Speaking custom post type was made with the WordPress Plugin Boilerplate. That helped save time in setting the plugin up, but it also added a bit of code that I didn’t need, including display script and style files which I wasn’t making use of. Eliminating the code that called those files eliminated two requests that did literally nothing at all.
jQuery Migrate
Next, I looked at jQuery Migrate. This is a script that WordPress loads to help manage old code. It acts as a bridge between the latest versions of jQuery and code that is written for very old versions of jQuery. Since my site is running up to date code in the theme and plugins, I could remove this script. I can’t always say that it is possible to remove it, but you can try and see if anything breaks on your site. Most current themes and plugins have no need for it, so I removed it with the following code taken from this Dotlayer article.
//Remove JQuery migratefunctionremove_jquery_migrate($scripts){
if (!is_admin() && isset($scripts->registered['jquery'])) {
$script = $scripts->registered['jquery'];
if ($script->deps) { // Check whether the script has any dependencies
$script->deps = array_diff($script->deps, array(
'jquery-migrate'
));
}
}
}
add_action('wp_default_scripts', 'remove_jquery_migrate');
Code language:PHP(php)
FontAwesome
Next, I looked at FontAwesome. loading the script to enable that on my site was the largest file, accounting for around 25% of the page load size.
I really like FontAwesome. It’s made it a great way to get social icons and other useful site iconography without having to find and load new pictures for each. Plus, it flows smoothly between code, the content editor, and stylesheets.
It turns out that I was only using three icons from FontAwesome across the entirety of my site: the hamburger mobile menu icon, the X close icon when the mobile menu was open, and the moon icon for the basic night-mode that I have a feeling no one even realizes is for that purpose (more on that in the future).
Since I didn’t have a lot of icons to replace, I decided to rebuild those in CSS only. There are a variety of places to find tutorials on drawing in CSS, something that I hope to do in the future as well. For now, I redid those icons in CSS and removed reference to FontAwesome from the theme, saving a lot of the page size in the process.
WP Emoji
WordPress has its own emoji loading, which is useful for the amount of times that I like inserting a πΊor a πΎ or a πinto what I’m writing. But you can see from the previous sentence and my bio at the end of posts that I still have them displaying with system defaults of pretty much every device that would view my site without having to load them.
I’ve used the following code to blanket remove the WordPress emoji from my site load, though you might have reasons for keeping some of these on.
I realized that a lot of images were returning too large on my site. This means that I had a space where an image would load, say an 80px square for a profile icon, yet a larger 512px square was loading for it.
In this case the issue was Webmentions, which I was handling via an IndieWeb plugin. I was showcasing people who liked or retweeted my post on Twitter, as well as those who commented on it.
A whole discussion should be had about the display of metrics, the privacy of individual interaction, and a need to prove popularity through that interaction. For now, my focus was on speed, and I’ve turned off profile image loading. I’m going to be reviewing my usage of this type of interaction demonstration, while still showcasing some cool features that IndieWeb proponents have given us.
Resizing default media sizes
The large image size on my site was set to the default of constraining to a box of 1024px by 1024px. This is a good default for some sites, but for me I had nowhere that images were displaying that large generally, even on wide screens. There were images loading that had to be resized by the browser and ended up loading larger files than needed.
If you are on your site dashboard, you can go to the Settings panel on the left sidebar and select the Media page. There you can change the default media settings to sizes that make sense for you. In my case, I made thumbnails a different size to fit my design. They ended up being larger than the default, but allowed me to avoid having to crop to fit featured images manually, and are smaller than the medium size that I would have otherwise loaded. I also made large images constrained to an 800px by 800px box, which is around 61% of the size of the original image size. This is still large enough for my theme, but saved some space in what is often the largest portion of page load.
If you change your image size on an existing website, you’ll also want to regenerate the cropped and resized image files that WordPress makes. The plugin Regenerate Thumbnails is my go-to for this task. You can even set it to only resize featured images, if those are the only ones that need to change.
Performance improvement after making changes
Now that I’ve made a handful of changes, it’s time to test the site again to see how we’ve done. I’ve gone back to tools.pingdom.com and ran the test again, being sure to select the same server location to get comparable results.
Performance grade: C β 80 Page size: 563.2 KB Load time: 442 ms Requests: 36
The performance grade has barely gone up, but that’s more of an overall estimation based on what they think is important, which doesn’t always apply to your site. What has improved is the page size, which is about half of what it was before optimization. That’s already a huge savings! It’s also loading in about a third the time, and I was able to remove 20 requests from the page load.
At this point we could probably be done and move on, but I figured I’d try a few other small things to improve page speed. I wasn’t doing any concatenation of files, and that seemed like the next best place to reduce the number of requests, increasing load speed.
What about performance optimization plugins?
I have used a few plugins for minification and concatenation in WordPress. Minification means stripping out unnecessary spaces and comments in files that make them much easier to read for humans, but aren’t needed by the computer. Concatenation is taking files and combining them together into one larger file. While it takes up more space it is one fewer request to make, which again can be a big driver in performance and speed.
Fast Velocity Minify and Autoptimize are two free plugins with a variety of free and paid extensions that you can take advantage of. I’ve never used the paid extensions to offer any insights, but the free versions work very well.
In this case I chose Fast Velocity Minify, which I installed on my site and activated with default settings only, no modification. Running the speed test again gave me the following results:
Performance grade: A β 91 Page size: 607.3 KB Load time: 443 ms Requests: 19
There’s a few things to note here. The performance grade greatly improved, and the number of requests was cut nearly in half, which is a big contributor to that score.
But we also see that load time is basically unchanged, and the page size actually increased, despite the fact that we tried shrinking the number of files that loaded.
These optimization plugins can do great things for your site, though they can also add headaches with another layer of caching and the possibility that concatenation breaks the order that scripts need to load to function. I still use them on a lot of sites, but I think it’s important to note that they aren’t a magic fix and are a bit more complex in how they handle your site content.
tl;dr β A recap of what I did to improve performance
I’m going to let the following screenshot (that I optimized, of course) from Google PageSpeed Insights speak for itself in terms of what a few minor changes that took me about an hour worth of work did for my site.
And here are the results that I got for the site at various testing times:
Before Optimization
After Optimization
After Optimization Plugin
Performance grade
C β 77
C β 80
A β 91
Page Size
1.1 MB
563.2 KB
607.3 KB
Load Speed
1.37 s
442 ms
443 ms
Requests
56
36
19
I’ll encourage you to consider deeply what optimization steps apply to your website and which don’t, but here’s a short list of things that I did that you could try.
As a reminder, I am basing this case study on a personal site that does not run ads (though it has a Patreon to support my writing and tutorials!), and uses a single Google Analytics tracking script. When it comes to sites that do extensive tracking or use advertising networks, there are a host of other things to consider.
I hope that the above gives you a place to start when you begin looking at increasing performance and speed on your site. Now go make the web faster and better!
PHP normally only displays fatal errors in the browser, or doesn’t load any page content and gives you a “White Screen of Death (WSOD)” if it has a fatal error before the page can load. A fatal error is one in which something is so wrong in the PHP code that it cannot make sense of it to gracefully fail in the background. If I forget to add chocolate chips when making cookies, I still have a perfectly tasty dough. If I forget to add baking soda though, I end up with a flat, gooey mess.
WordPress has a few features built in to make it easier to see PHP errors while you are testing. You’d want to activate these while developing a new site, theme, or plugin to ensure that you are seeing any PHP errors that come up.
As mentioned in the last post on PHP Illegal Strings, there are a few failure types in PHP including warnings, notices, and errors. Turning on WP_DEBUG will allow you to see those failure types so that you can fix them in your code.
Activating WP_DEBUG
If you have access to all of the files of your WordPress install, you’ll want to edit the wp-config.php file, which is located in the root directory, meaning the same folder that has the wp-admin, wp-content, and wp-includes folders. You’re going to go into that file and add the following line of code near the bottom of the file, but before the stop editing notice:
If that line already exists but says false, change that to true. There can be other lines of code above or below this, but as long as it’s above the comment to stop editing, it’s in the right spot.
What did we do?
We’ve now told WordPress that rather than hide PHP errors, we want them to display while viewing the site. WP_DEBUG is a PHP constant, which by convention are written in all caps. We’ve used the PHP define() function to set the value of that constant to a boolean true. Note that we didn’t surround the word true in quotes, otherwise PHP would read it as a string.
Using WP_DEBUG also allows us to see any deprecated functions that are running on our site. Deprecated functions exist in WordPress but are no longer the standard way to perform a particular tas. As an example, long ago in WordPress history you would get the ID of a category in WordPress with the function the_category_ID(), but now the function to do the same in a better way is get_the_category().
Using WP_DEBUG_LOG and WP_DEBUG_DISPLAY
There are some companions to WP_DEBUG that can be used to make it even more helpful. You may not always be able to easily see errors if they are loading behind content, or you may want to keep track of them over time to review later. Two other constants that are built into WordPress that can help are WP_DEBUG_LOG and WP_DEBUG_DISPLAY.
Using WP_DEBUG_LOG
Setting up WP_DEBUG_LOG allows you to save all of the debug errors that are getting displayed to a file in your WordPress install. That file gets saved to wp-content/debug.log by default. Whenever an error occurs that WP_DEBUG would display, it will also get saved to that file with a timestamp of when the error occured.
To turn on WP_DEBUG_LOG you’ll want to define the following constant:
You don’t have to worry about creating the debug.log file if it doesn’t already exist. WordPress will do this for you automatically as soon as it has an error to log. So hopefully not right away!
Changing WP_DEBUG_DISPLAY
By default, setting WP_DEBUG to true will display all errors on the screen in your browser, on both the visitor-facing frontend, and the admin-facing backend of your site. This is ok while you’re editing a site that isn’t live with other people using it, but you don’t really want those errors displaying to other site visitors. It will make the site look more broken than it is, and can even be a security concern.
If you want to use WP_DEBUG but don’t want to display errors to the screen, set the following constant:
Again, if you don’t set that as false, it will default to true when debug is turned on. If you are setting it to false, you’re probably also setting WP_DEBUG_LOG to true, since otherwise you won’t see the errors on the screen or in a debug log.
If you want to passively log errors for review later on a live site, just in case any come up, you can combine the three definitions above to turn on debug mode, log errors, and stop them from displaying on the site. I recommend doing this if you don’t have anything else handling these error logs for you, which you’d probably know if you did.
// Enable WP_DEBUG mode
define('WP_DEBUG', true);
// Enable Debug logging to the /wp-content/debug.log file
define('WP_DEBUG_LOG', true);
// Disable display of errors and warnings
define('WP_DEBUG_DISPLAY', false);Code language:PHP(php)
Continuing to Debug Your Site
The settings above display PHP errors, but they don’t actually do anything to fix them. You’ll need to handle that yourself. Still, they provide an invaluable source of information to determine why something is broken on your site. This won’t show all types of errors that could occur, since not all broken page or feature problems are PHP related.
What it does do is give you a good footing to begin the fun part of debugging: digging into code and squashing bugs as you find them. In this case the old proverb is true: Knowledge is Power.
I’ve been attending WordCamp Atlanta since 2013, and it’s been one of my favorite annual WordCamp events. It is larger than WordCamp Orlando, with an average of 600 attendees to our 350, but it rarely feels large with the sensible layout of the venue and separation of spaces. Everything is in one building across two floors, and all of the rooms are near each other.
The ease of getting around, and the proximity of hundreds of WordPress people without a feeling of claustrophobia makes it an ideal setting for conversations. We call the space between sponsor tables and session rooms the “Hallway Track”, since it can be a valuable session space itself. I can talk with friends that I see a handful of times per year, or find out what other companies in the space are up to.
My Workshop – Building a Plugin
Recently I’ve been having success at events teaching attendees how to build their own plugins and themes. I was under a new constraint this time, of offering my plugin workshop in a 50 minute time-slot as a lecture, where it’s been a two to three hour workshop in the past. Treating it as a lecture meant no hands on, one-on-one help, but it let me present the information at a comfortable speed.
The questions that I got, both immediately following my session and throughout the weekend, indicated that I was able to help some of the attendees. I was told by three separate people that they attended the getting started workshop the day before, and my lecture put that information in place for them in an understandable way.
I’m not always confident when I give presentations, as listening to myself drone on for more than a few minutes feels excessive to me, and I can only imagine what others think. Having thoughtful followups made me feel that I provided value.
WordCamps are a great place to learn more about WordPress, but also to learn about related topics, such as SEO and marketing, running a business, or developing applications. We hold a unique position in tech in that our tool serves users at all ends of the technical spectrum. The lower barrier of entry to starting your first WordPress site coupled with the flexibility and extensibility of the platform makes it an ideal way for people of various skills to interact on a common ground.
I only attended a handful of sessions other than my own, preferring to spend time in the Happiness Bar offering help, as well as the aforementioned conversation time. Here are a few of my highlights:
Getting confirmation from Tom McFarlin, a developer who I greatly respect, that WordPress can serve as an application foundation. I’ve wasted some time that I could have been working on a variety of projects wondering if I’m just trying to fit a peg into a WordPress shaped hole, forgetting that getting something done at all is better than an optimized nothing.
Being reminded by Adam Walker, co-owner of Sideways8, that routines, habits, and processes are key when it comes to managing your work life. I’m impressed with the number of projects that he handles while maintaining a balance that leans favorably toward family and personal life. Sometimes you just need to hear the same message in a new way or for the tenth time before it sinks in. I’m making some changes based on his presentation, which he shared on his site.
Getting some ideas on ways to automate my development workflow from Chris Wiegman, a personal friend and team lead at WP Engine. This is one of the places that I feel that I could improve most when it comes to my processes. Some of the tooling that Chris uses is beyond me currently, but I want to expand my toolset. Chris also shared his slides on his site.
The rest of the event
I got to hang out with lots of WordPress friends and meet a few new people this weekend. I try not to only talk to people that I already know, since that leaves out all of the people who would be good friends if I took the time to get to know them now. I also shared dinner, lunch, coffee breaks, and walks around town with fellow attendees.
The real value of these events for me is the personal connection, where I get to talk one-on-one with someone a step ahead of or behind me in the business and product building process. We’re all learning this as we go, and it’s good to be reminded that no one comes in with all of the knowledge, and no business starts fully-formed.
WordCamp Atlanta made these great boards for people to post tips and tricks around business, WordPress, and life. I wish I’d gotten a picture at the end of Sunday!
On the secondary value front, I won an IKEA gift card from the folks at GoDaddy Pro! I don’t usually enter contests at WordCamps, but I’m glad that I entered that one and was still in town during closing remarks. We’ve been talking about getting a new couch at home for a while, and this is the push to make that purchase happen.
A big thanks to SiteGround!
Finally, I want to thank SiteGround yet again for helping to sponsor my trip. I realize that I haven’t yet written a post on the SiteGround Ambassador program, which is something that I’m going to fix now.
I met three members of the SiteGround team that I haven’t yet had the chance to meet, spent some time at their booth, and discussed SiteGround services several times during the event. It’s very easy to do when the conversation comes up from whoever I’m talking to with general interest, and I don’t even feel like I’m giving a sales pitch. That said, I’d do a sales pitch anyway, since I truly enjoy the service and level of support.
The SiteGround team is always a great WordCamp addition!
I also got to chat with Francesca Marano, the WordPress Community Manager at SiteGround. We chat online regularly, but in person opens up new space for the kinds of conversations that don’t regularly come up online. Again, these events are a great way to catch up and form deeper connection with the people who help make this community worth sticking around for.
I greatly enjoyed WordCamp Atlanta 2019, and look forward to another fantastic event in 2020!
An update to Yoast SEO v11.1 came out yesterday, causing a few site errors relating to illegal strings in PHP. It made me dust off this post to provide some detail on what that PHP warning is, why it is happening, and how it can be fixed.
Last year I updated all existing client sites that I could to PHP version 7.2, to replace versions 5.6 and 7.0, both of which reached their end of security update lifespans in December of 2018. The current plan for WordPress v5.2 is to drop support for versions of PHP below 5.6, which is targeted to be released on 7 May. If this goes well, the minimum PHP version will be bumped to 7.0 later this year.
We’re only a few weeks away from this change, and a lot of hosts have been informing users that their version will change, or that they should opt-in to update when they can. One issue is that there are some things that work in earlier versions of PHP that will now throw warnings, notices, and errors in newer versions. One of the ones that I had to contend with on a few sites recently was the “Illegal string offset” warning.
Warning: Illegal String Offset
Here’s a few warnings that appeared on a development version of a site that I was upgrading (file path removed for readability):
__Warning:__ Illegal string offset 'menu' in [file location] on line 13
__Warning:__ Illegal string offset 'post_types' in [file location] on line 25
__Warning:__ Illegal string offset 'post_formats' in [file location] on line 36Code language:PHP(php)
I’m noting that it’s a development environment, because I had WP_DEBUG set to true in my wp-config.php file, which I don’t do on live, production environments. Basically, I ensure that on a live version of a site I don’t have PHP errors/warnings/notices displayed, even if there are some that would otherwise display.
I took a look at that file, which was a configuration file for the theme being used. The relevant lines from that file are below:
Can you spot the issue? I didn’t immediately see it myself, as I saw things like $theme['menu'] and thought “how can that be read as a string? The braces clearly indicate that we’re setting an array key.
Explicitly Declaring an Array in PHP
What I didn’t realize was that we were missing something that’s necessary as of PHP v7.1.0: an explicit declaration of the variable $theme as an array. If you take a look at the PHP.net manual entry on PHP Array Syntax Modifying, you’ll see the following note:
Note: As of PHP 7.1.0, applying the empty index operator on a string throws a fatal error. Formerly, the string was silently converted to an array.
So there’s our issue, and with it, a lead on a solution: the theme never explicitly declared the variable $theme to be an array, and so it was assumed to be a string. Since it is no longer being silently converted, we have a warning being thrown.
Fixing the Illegal String Offset Warning
The solution in this case is to add a line to the start of that block of code where we explicitly declare our variable as an array. What that looks like is this:
By adding $theme = array();, we’re telling PHP, “yes, this is an array, please treat it as such.” It doesn’t have to try to guess what we mean, which newer versions of PHP no longer do anyway.
PHP v7.0+ also introduces strict typing, which is great for being even more explicit in your PHP coding. This makes the code more secure (people can’t put different data types in than you intend), and less liable to break (you will always know what type of data to expect). If you want to learn a bit more, Eric Mann wrote a short introductory post on the topic early last year.
PHP is getting better and better all the time, but this progress sometimes causes old code to break. While this is frustrating, it can also give you the opportunity to review old code with fresh eyes. It’s not always convenient to do this, but it can overall improve your site!