MyListing Support – Implement the Perfmatters Optimization Plugin

Guide Overview:

In this MyListing Support guide, we show you how to further optimize your website with the Perfmatters plugin. This solution provides the functionality to help squeeze that last bit of performance from your website, increasing its speed by reducing HTTP requests, stripping out unnecessary code, and minimizing back-end component loading.

This post is essentially a case study, prompted by a client who recently reached out to us to do additional performance optimization.

We only write about solutions that we ourselves use or that we’ve found to be successful for client projects. If you decide to give Perfmatters a try for yourself, please consider using our affiliate link.

If you get value from this type of content, help us keep it free.

Current Website Optimization

CDN (Content Delivery Network)

We recommend Cloudflare’s free tier as a great place to start, for a CDN solution, and we wrote a beginner’s guide to Cloudflare for easy implementation. For our testing of Perfmatters, Cloudflare will continue to provide DNS services, but we have temporarily paused all of its optimization options.

Website Hosting

Our client’s MyListing website is hosted with our recommended vendor, Kinsta.

Since we’ll be focusing on the website’s primary Explore page, configured to call up over 11 Listing Types and load 20 listings at a time, premium hosting like Kinsta is a necessity.

Image Optimization

We put the Imagify plugin in place for this particular client, quite some time ago. While we may look to switch them over to ShortPixel in the near future, Imagify is a solid solution for now.

MyListing Optimization

The one significant optimization we’ll mention here is that we replace Contact Form 7 forms with Elementor Pro forms. Contact Form 7 notoriously loads scripts and styles on every post/page of a website, whether it has a form on it or not.

Given the above and the fact that we already use Elementor Pro on all of our websites, the decision was a big win for optimization and simplicity.

Website Performance Baseline

MyListing Explore Pages

We are focusing on the Explore page “template” because they are typically the most important pages of a MyListing website and also the most difficult to optimize.

MyListing Explore pages are highly-dynamic and should be excluded from page caching. If you think about a MyListing website with a large number of listings, you can imagine how the listings could be continuously in flux, with new information being changed, added, removed, etc.

Our Baseline Results

GTMetrix Timings Tab

The first thing we want to get out of the way is how fast Kinsta is performing where it matters most. Where people often get performance testing wrong, is to focus on grades/scores.

Looking at the results below, we can see that the server on Kinsta is responding in 31ms (TTFB), which is insanely fast. TTFB how long it takes for a server to first respond to a user’s request.

We also see that the first time content is shown to the user (Contentful paint) is 460ms. To put this in perspective, it’s extremely common to see the TTFB over 500ms and the Contentful paint 1.5s. So, again, insanely fast!

So, the key takeaway here is the server technology stack that we are working with at Kinsta, is performing quite nicely. It’s everything outside of the server (CDN, theme, plugins, etc.) that would be a potential bottleneck…if there is a bottleneck at all.

Pingdom Analysis

Before we begin with Perfmatters, we want to set a baseline for the primary Explore page. We want to see the footprint that scripts (JS) and styles (CSS) are leaving on the page, as well as the number of external requests by domain. While we prefer GTMetrix for our overall testing, Pingdom brings all of the metrics together in a nice table.

Looking at the image below, we see that scripts are adding the most weight (1.1MB) to the page, by a large margin. As for the number of requests, we once again see scripts being the biggest culprit, with styles not too far behind.

Perfmatters Configuration

Options

Disable Emojis

  • Element Description: Emojis are essentially icons that can be added to a page, outside of the icons that MyListing and Elementor provides. While these may seem cute, they are a performance hit.
  • MyListing Dependency: No.
  • Status: Not Enabled. This element is used throughout our client’s website.

Disable Embeds

  • Element Description: Embeds make it easy to place a video into a post or page, using the WP editor, by simply pasting in the link/URL.
  • MyListing Dependency: No.
  • Status: Enabled.

Remove Query Strings

  • Element Description: Query Strings exist to help developers get around potential caching issues. Keep them in place until your website is towards the end of design/development, and then remove them.
  • MyListing Dependency: No.
  • Status: Enabled.

Disable XML-RPC

  • Element Description: XML-RPC allows users and solutions to publish content to a WordPress website, without directly logging in.
  • MyListing Dependency: No.
  • Status: Enabled.

Remove jQuery Migrate

  • Element Description: jQuery Migrate allows the JavaScript library to preserve compatibility with jQuery code used in older themes and plugins. You should not need this and if you do, it’s probably time to assess what software you’re putting on your website.
  • MyListing Dependency: No.
  • Status: Enabled.

Hide WP Version

  • Element Description: Pretty simple one here. There is no need to include the version of WordPress in your website’s code.
  • MyListing Dependency: No.
  • Status: Enabled.

Remove wlwmanifest Link

  • Element Description: This link is only needed if you use the Windows Live Writer, which most people don’t these days.
  • MyListing Dependency: No.
  • Status: Enabled.

Remove RSD Link

  • Element Description: Similar to XLM-RPC, this is only needed if you edit your website using methods other than your browser.
  • MyListing Dependency: No.
  • Status: Enabled.

Remove Shortlink

  • Element Description: Shortlinks are only helpful when the “Plain” permalink structure is used, and website owners should not be using this structure. 
  • MyListing Dependency: No.
  • Status: Enabled.

Disable RSS Feeds

  • Element Description: These can be useful for websites that have an active blog, allowing people to subscribe to new content. Even then, RSS Feeds may not be needed.
  • MyListing Dependency: No.
  • Status: Enabled. The client involved in this case study has a blog, but it’s not very active at this time.

Disable RSS Feed Links

  • Element Description: Similar to how WordPress generates RSS feeds, it also generates RSS feed links for your pages/posts, comments, tags, etc. You can leave your RSS feeds enabled and still remove the RSS feed links. These are sometimes used by 3rd party services so you might want to test it out.
  • MyListing Dependency: No.
  • Status: Enabled. The client involved in this case study has a blog, but it’s not very active at this time.

Disable Self-Pingbacks

  • Element Description: Self-pingbacks are created when you link to an article within your own blog. Pingbacks are essentially nothing more than spam and simply waste resources.
  • MyListing Dependency: No.
  • Status: Enabled.

Disable REST API

  • Element Description: There are solutions that use the REST API, such as WooCommerce, Contact Form 7 and Gutenberg. While useful, the REST API does expose usernames in the code of a website.
  • MyListing Dependency: Indirectly, depending on the plugins in use, as mentioned in the description to name a few.
  • Status: Enabled (“Disable for Non-Admins”).

Remove REST API Links

  • Element Description: If you’re keeping REST API partially enabled, this should be left alone.
  • MyListing Dependency: Indirectly. See REST API.
  • Status: Not Enabled.

Disable Dashicons

  • Element Description: These are the official WordPress core admin icons. They are not needed on the front-end of your website.
  • MyListing Dependency: There is no dependency as far as the theme functioning, but we found that the icon selection in the backend “breaks” with this functionality disabled.
  • Status: Not Enabled.

Disable Google Maps

  • Element Description: For MyListing website owners, this is an obvious one. 
  • MyListing Dependency: Yes, unless you’re using Mapbox or not using Map Services at all.
  • Status: Enabled.

Disable Google Fonts

  • Element Description: This is an obvious one.
  • MyListing Notes: With this disabled, the sub-menu toggle icons will break and the shopping cart icon will break, leaving behind a super ugly navigation menu.
  • MyListing Dependency: Yes, unless you have zero sub-menu items and you do not show your shopping cart.
  • Status: Not Enabled.

Note: I’ve removed the usage (not disabled via Perfmatters) of Google Fonts on the MyListing Showcase website if you want to see what the default font looks like across the board.

To do the same you can go to Elementor > Settings and check the Disable Default Fonts box. (Note: If you have already built your site and assigned Google Fonts using Elementor, you will need to first edit a page with Elementor and toggle all of the fonts to default.).

Disable Password Strength Meter

  • Element Description: WooCommerce and WordPress core, has an integrated Password Strength Meter which forces users to use strong passwords.
  • MyListing Notes: Depending on your WooCommerce settings (WooCommerce > Accounts & Privacy > Account Creation), this element may not come into play at all. This is seen, for example, if you configure passwords to be automatically generated. 
  • MyListing Dependency: No.
  • Status: Not Enabled. The client involved in this case study does not auto-generate passwords and requires the Password Strength Meter to be in place.

Disable Comments

  • Element Description: Depending on the website, allowing comments may make sense (i.e. user engagement) and/or be required as a dependency for another part of the website (e.g. Ratings/Reviews). However, it’s not uncommon for website owners to disable comments so as to not worry about SPAM, comment moderation, etc.
  • MyListing Notes: MyListing uses the WordPress commenting system to provide Ratings/Reviews functionality.
  • MyListing Dependency: Yes.
  • Status: Not Enabled. The client involved in this case study uses Ratings/Reviews within MyListing.

Remove Comment URLs

  • Element Description: Depending on how a website is set up (theme, plugins, post/page config, etc.), a visitor may be able to link out to their own website. While these links are nofollow (i.e. Google ignores them), visitors will still sometimes leave comments solely for the purpose of getting this link.
  • MyListing Notes: While MyListing uses the WordPress commenting system to provide Ratings/Reviews functionality, the default Review form does not allow these links to be created.
  • MyListing Dependency: No.
  • Status: Enabled. The client involved in this case study does not use a custom Review form that would allow links.

Disable Heartbeat

  • Element Description: The WordPress Heartbeat API generates AJAX calls, which can cause high CPU usage and a significant number of PHP calls. If you leave your WordPress dashboard open for example, WordPress will keep sending POST requests to the admin-ajax.php file, every 15 seconds.
  • MyListing Dependency: No.
  • Status: Enabled (Only Allow When Editing Posts/Pages).

Heartbeat Frequency

  • Element Description: The WordPress Heartbeat runs every 15 seconds by default.
  • MyListing Dependency: No.
  • Status: Set this to the max allowance of 60 seconds.

Limit Post Revisions

  • Element Description: Every time you save a post/page, WordPress creates a new, saved version for rollback purposes. While this is a great feature, WordPress does not place a limit on revisions, by default, which is bad news for your database if you don’t get this under control.
  • MyListing Notes: Listing Types have their own revision management process and Permatters can’t touch those. We created a post for those looking to corral their Listing Type revisions.
  • MyListing Dependency: No.
  • Status: Set this to 3 revisions.

Autosave Interval

  • Element Description: WordPress automatically saves a draft every 60 seconds, by default. We prefer to increase the interval to prevent the browser from “hanging” and to reduce the number of writes to the database.
  • MyListing Dependency: No.
  • Status: Set this to 5 minutes.

Change Login URL

  • Element Description: If the default WordPress login URLs are not changed, it’s one less thing that “hackers” need to attempt to guess. In short, the left unchanged, the Login URLs are a security risk. We change these URLs on every website we manage, using the WPS Hide Login plugin as one of the very first steps. With Perfmatters, we’re able to reduce the number of plugins, by one.
  • MyListing Dependency: No.
  • Status: Set this to a complex value as this is something you should never need to memorize and it will be transparent to your users.

Options > WooCommerce

Disable Scripts

  • Element Description: WooCommerce by default loads scripts and styles on every page of your WordPress site, whether they are needed or not.
  • MyListing Notes: Looking at the code for the Explore page, we see a combination of 11 scripts/styles loaded. With this setting enabled in Perfmatters, that number drops to only 3. However…
  • MyListing Dependency: Yes, if you are using Paid Listings or are selling using other methods on your website. We found multiple issues with the shopping cart.
  • Status: Not Enabled.

Disable Cart Fragmentation

  • Element Description: This feature is used by  WooCommerce to update the cart totals without refreshing the page (AJAX). This is a performance hit and depending on your theme, may not be used/needed. However…
  • MyListing Dependency: Yes, if you are using Paid Listings or are selling using other methods on your website. We found multiple issues with the shopping cart.
  • Status: Not Enabled.

Disable Status Meta Box

  • Element Description: By default, WooCommerce loads a status meta box (widget) in the WordPress dashboard. A lot of times this isn’t used, and while it can be hidden using Screen Options, it’s better to disable it to speed up the admin area.
  • MyListing Dependency: No.
  • Status: Enabled.

Disable Widgets

  • Element Description: WooCommerce by default comes with a lot of widgets installed. A lot of times these aren’t used anywhere as themes have their own code to display products. They can add backend load and front-end load if you have them in sidebars or footers.
  • MyListing Dependency: Depends. If you’re utilizing the Shop page and have added WooCommerce widgets (WordPress > Appearance > Widgets) to it, then a dependency does exist.
  • Status: Not Enabled. 

CDN

Since our client uses (will use) Cloudflare, we can skip this tab. This is because Cloudflare is not an actual CDN, technology-wise, and is more of a reverse proxy that takes over all traffic and serves cached versions from a nearby location.

Google Analytics

Enable Local Analytics

  • Element Description: Hosting Google Analytics locally can help speed up your site by reducing extra DNS lookups and resolve the “leverage browser caching” issue from their script. It also allows you to load the analytics script over a single HTTP/2 connection.
  • MyListing Notes: It’s fairly common for ML website owners to drop their Google Analytics tracking info into the theme (Theme Tools > Theme Options > Raw Code). When they do this, ML loads the tracking script in the Footer. While this is a fine practice, we can improve upon this with Permatters.
  • MyListing Dependency: No.
  • Status: Enabled. The client involved in this case study had their tracking info added to MyListing. We have removed that code.

Analytics needs can greatly vary from website to website. Some website owners may only use the basic Google Analytics tracking, some may use the more advanced Google Tag Manager practices, etc.

If analytics are critical to the success of your business, please take time to fully under the settings under Perfmatters. We’ve also provided some of our guides for more information.

Google Analytics for Beginners
Google Tag Manager for Beginners

Detailed Settings

  • Tracking ID: Enter your Google Analytics tracking ID.
  • Tracking Code Position: Footer.
  • Disable Display Features: Enabled. This is more on the advanced side, but if you are not actively working with the Advertising features of Google Analytics, this should be disabled.
  • Anonymize IP: Enabled. This is more on the advanced side, but if you fall under GDPR governance, you’ll probably want to enable this.
  • Track Logged In Admins: Not Enabled. Not sure why this is even an option. You should never track admin activity as far as analytics go, as that would pollute your stats.
  • Adjusted Bounce Rate: Enabled. Set to 30 (30 seconds).
  • Use MonsterInsights: Not Enabled. The client involved in this case study does not use the MonsterInsights plugin. Otherwise, we would have enabled this setting.

Extras > Script Manager

We enabled this setting, which unlocks the ability to manage the loading of scripts (JavaScript) and styles (CSS) on a per post/page basis. 

Note: Since Script Manager uses the admin bar, we highly recommend using it only in incognito mode, to avoid caching the admin bar and inadvertently making the bar available to non-admins.

Script Manager can be accessed using one of the methods listed below.

  • From the back-end, by hovering over a post/page and choosing Script Manager.
  • By appending “?perfmatters” to any URL. while logged into your website.
  • From the back-end or front-end, by pulling up a post/page and using the WordPress admin bar. (Note: Even if you have the admin bar disabled for your admin account, appending “?perfmatterswill invoke it. So, again, it’s important to work in incognito mode.).

Script Manager - Testing Process

The steps below should be followed when working with and testing any changes you make with Script Manager.

IMPORTANT: In order to use Script Manager on Explore pages, you must temporarily toggle on the Disable live url update? setting for the 27 > Explore Listings widget.

  1. Using your preferred website performance testing tool (we recommend GTMetrix), scan your website in order to create a baseline.
  2. Login into your website, using incognito mode.
  3. Access Script Manager for your post/page using one of the methods outlined above.
  4. Make your changes and save.
  5. Clear your website’s cache.
  6. Scan your website again, ensuring that the script/style has been removed.
  7. Clear your browser’s cache.
  8. Ensure that nothing is broken on your website.
  9. Move onto other settings, repeating the above.

Script Manager - Explore Page Optimization

This particular client has a main Explore page (Explore All), as well as individual Explore page for each Listing Type. So, rather than optimizing each Explore page one by one, we’re going to target all Explore pages in one swoop. We do this by using the Regex option of Script Manager.

Before we get started, we run the main Explore page, as well as one of the other Explore pages, against GTMetrix to get our baselines. This allows us to see that Regex is working as expected, which is to say it’s applying the settings across all Explore pages.

So, at this point, we have our baselines, we have temporarily disabled the Live URL updating, and we’re now in the Script Manager screen for our Explore page.

The first item up was ​Custom Facebook Feed Pro Business. We don’t need to load this plugin at all, let alone it’s related scripts or styles. So, we toggle the entire plugin OFF. Under the “Disabled” area, we choose the Regex option, enter “(explore)”, and save our changes.

Entering “(explore)” for the Regex option, tells Perfmatters that any URL containing the word “explore”, should NOT load the Custom Facebook Feed Pro plugin. In looking at our client’s pages, we confirmed that every Explore pages include the word “Explore” in the URL.

As we continue on with our testing, we’ll simply list the plugin and the settings with chose. The approach will be exactly the same as we did for the Facebook plugin, in terms of using Regex.

  • Plugins > Elementor Pro: Plugin Disabled.
  • Plugins > Elementor > Swiper (JS): Disabled.
  • Plugins > Instagram Feed Pro Business: Plugin Disabled.
  • Misc > Admin Bar (JS and CSS): Disabled.

Extras > DNS Prefetch

The simple way to think of this feature is to think of how Google Maps works on your phone. Rather than enter your home address each time as the return destination, Google stores your address for you, to help speed up the process.

This is what DNS Prefetch does. It stores the addresses (domains) that you anticipate visiting often, to speed up the lookup process. Unlike Google Maps, these entries are manual, but you just need to enter them once.

So, how do you know which domains to prefetch? Using GTMetrix, you can use the Waterfall tab, and sort the entries using the Domain column. Any domain listed, other than your own, is a good candidate to be prefetched since your website is calling for it.

However, the only domains we want to prefetch are those that load early on the page loading process, causing possible contention with the other elements loading on the page. 

Determine Domains to Prefetch

  1. Run GTMetrix and browse to the Waterfall tab.
  2. Click on “CSS” and “JS” to filter out all other elements.
  3. Scrolling top to bottom, identify any domain other than your own, that has activity starting before the green line.

Note: Once you get towards the bottom of your Waterfall, the need to DNS Prefetch the domains isn’t needed. Looking at the image below, we see analytics.js, sdk.js, etc. start to load and the only elements loaded below it are more scripts and a non-critical style (CSS). Long story short, loading scripts at the end is preferred/optimal, so we can just let these be.

Go

But wait…you don’t want to “double prefetch” domains…

Depending on your theme or plugins, the developers may have already coded the software to DNS Prefetch the domains they know will be called upon. When we viewed the source code (Chrome > Right-click on the page > View Source Code) of the Explore page, we see the following domains already being prefetched.

  • api.tiles.mapbox.com
  • apis.google.com
  • fonts.googleapis.com
  • maxcdn.bootstrapcdn.com (Font Awesome)
  • s.w.org (WordPress.org)

The only domain missing from the list of domains already being prefetched was for Calendly. We included that domain by adding it to Perfmatters and prepending “//” in front of it.

  • //assets.calendly.com

An exception to the rule is those using true CDNs, would want to include their CDN domain (//cdn.cdn-domain.com) in their DNS Prefetching list.

IMPORTANT: This is NOT a set it and forget it thing. As you add/change/remove solutions and settings, you will most likely need to adjust your DNS Prefetch entries. For example, if you decide to not use Google Fonts, you want to stop prefetching that domain. You don’t want your server making calls when it’s not necessary.

Extras > Preconnect

Preconnect picks up where the DNS Prefetch analogy leaves off. Meaning, rather than Google Maps just storing your address, it actually starts mapping out the directions in the background. So, when you’re ready to start your navigation, the route is already mapped out.

Everything we documented for DNS Prefetch applies here, as far as how to determine what to domains to target, caution targeting too many domains, etc. The only difference is the underlying process. 

We prefer DNS Prefetching over Preconnect, due to the potential performance hit that comes from “missing” on preconnect attempts.

Case Study Wrap Up

Pingdom Results

Looking at the image below, we were able to reduce our external Script requests by 10 and our external CSS requests by 7. Overall we saw our total requests reduced from 118 to 100.

What Could Have Been

Depending on the website, there are other opportunities that Perfmatters would have been able to provide, and those opportunities are outlined earlier in this post.

However, we wanted to go back and see what performance gains could have been made, by using more of the Perfmatters options. More specifically, we want to test two of the bigger ticket items – Google Fonts, and Password Strength Meter.

Test - Disable Google Fonts

This is a biggie! Our client is using Google Fonts throughout their website and it takes a significant toll on performance. 

By disabling Google Fonts, we see a reduction of 8 external HTTP requests. We also see the page weight drop by .55 MB, which is huge, considering the entire page was weighing in at just over 2 MB.

Test - Disable Password Strength Meter

This is another biggie! Our client has opted to not allow WooCommerce to automatically generate a password for their users. This, in turn, invokes WooCommerce’s stong password feature on the front-end.

The above is a performance hit in of itself, but to make things a bit worse, the WC Password Strength Settings plugin is being used to further “enhance” this functionality. Double whammy!

Taking all of the above out of the picture resulted in a reduction of 5 external HTTP requests. Looking at GTMetrix, we see the following items removed.

  • https://ssl.gstatic.com/accounts/o/424687703-v2-idpiframe.js (63.7KiB)
  • https://staticxx.facebook.com/connect/xd_arbiter.php?version=44 (30.8KiB of inline JavaScript)

The above items reflect the Social Login functionality of WooCommerce/MyListing. So, by having the password strength settings in place, we are also requiring the Social Login elements to load. This stuff should never be loaded at this point, especially on an Explore page.

For our takeaway here, we recommend to let WooCommerce autogenerate your user’s credentials unless you really have a good reason not to.

Bonus Cleanup

While we were at it, we decided to take a look outside Perfmatters for any lingering code snippets that are adding extra weight and/or external HTTP requests.

Appearance > Theme Editor > functions.php

We found some code snippets that we guessed were no longer needed. After some discovery with our client, we were able to remove some of the snippets. 

Note: Always include a comment along with your code snippets, so that you and/or your website professional can easily see why they were added.

Theme Options > Custom Code > CSS

There were some entries were making external calls to MailChimp. After discussing this with our client, the snippets were removed.

Theme Options > Custom Code > JavaScript

We found an old login-based snippet that was no longer needed and removed it. There were also 11 separate snippets for opening the Explore page listings in a new browser tab. We combined all of those snippets in a single snippet, as an array.

Final Takeaway

We were able to clean up a number of items without inferring with the functionality desired by our client. They may change their mind on a few things after reading this case study and they may not. It’s all about finding that perfect balance between performance, design, security, and functionality.

Perfmatters is a good plugin, especially for those that are new to website optimization, and want an easy-to-use solution. At only $24.95  per year for a single website, the price point is very attractive as well. Permatters also has some nice pricing for agencies or businesses with multiple websites.

While putting together this case study, we exchanged emails with Perfmatters to get some clarification on some things. They were very responsive and friendly. It’s also comforting to know that they have close ties to Kinsta.

Let's empower others. Share the knowledge.

Share on twitter
Share on facebook
Share on linkedin
Scroll to Top