Thomas Griffin https://thomasgriffin.io WordPress Expert Thu, 02 Jul 2015 17:48:02 +0000 en-US hourly 1 The Journey from WordPress to Everything Else with OptinMonster https://thomasgriffin.io/the-journey-from-wordpress-to-everything-else-with-optinmonster/ https://thomasgriffin.io/the-journey-from-wordpress-to-everything-else-with-optinmonster/#disqus_thread Thu, 07 May 2015 19:34:01 +0000 https://thomasgriffin.io/?p=1495 If you haven’t heard the announcement yet, here you go: OptinMonster has now moved from a WordPress-only plugin to a hosted platform solution.

I’ve heard more than a few people surprised by this decision, but this decision should come as no surprise to most people. After all, OptinMonster was intended to be a SaaS application in the first place but it failed miserably.

So instead, we pivoted and turned OptinMonster into a WordPress plugin. OptinMonster grew to be incredibly popular over a relatively short period of time, even with it being just a WordPress-only product. We quickly gathered tens of … [continue reading]

The post The Journey from WordPress to Everything Else with OptinMonster appeared first on Thomas Griffin.

]]>
If you haven’t heard the announcement yet, here you go: OptinMonster has now moved from a WordPress-only plugin to a hosted platform solution.

logo-color-medium

I’ve heard more than a few people surprised by this decision, but this decision should come as no surprise to most people. After all, OptinMonster was intended to be a SaaS application in the first place but it failed miserably.

So instead, we pivoted and turned OptinMonster into a WordPress plugin. OptinMonster grew to be incredibly popular over a relatively short period of time, even with it being just a WordPress-only product. We quickly gathered tens of thousands of people using the plugin and built a solid reputation for a good product with even better support.

With that said, we noticed an unnerving trend of turning away potential customers because our product could not be used on non-WordPress sites. As the popularity of OptinMonster grew, so did our number of inquiries about non-WordPress platforms.

So back in October of 2014, we made the tough decision to go ahead and pursue a completely website agnostic approach to OptinMonster and build it as a SaaS (software-as-a-service) platform.


This was a really tough decision to make. You’ve got to understand that at this point, OptinMonster was an incredibly stable and mature product. That made our decision even more risky because it threatened an already successful business model.

With all that in mind, we came to grips that we would stagnate in our particular niche if we just remained a WordPress plugin. There is no shortage of WordPress-specific popup and lead generation plugins on the market, so we wanted a way to continue to position ourselves as the premier lead generation solutions provider and pull ahead of all the other “competitors” in the WordPress space.

Hence, on May 5, 2015, we launched the OptinMonster hosted platform!


Now that we have moved back to a hosted application, many people have been left puzzled by our (Syed and myself) decision. There were many factors influencing our decision, but there are a few key factors that I think made the most sense with our decision to switch business models.

Our Would-Be Customers Constantly Asked for It

This was the #1 reason why we switched to a hosted solution that could be used on any website. When around 1/3 of your support tickets are people asking if your product can be used on sites other than WordPress, you know you are missing a gigantic market.

To be sure, we serve the WordPress market incredibly well, and we will continue to do that with our improved OptinMonster WordPress plugin integration. Our targeting features will continue to improve as well as the experience from editing on our site to integrating it into your WordPress site.

But beyond this, 1/3 of your tickets is a lot of potential customers that you are missing out on. In fact, we’ve already started converting those folks who asked previously about a non-WordPress solution at rapid rates. We’ve built an awesome product, and I’m so excited that now anyone and everyone has the opportunity to use it.

Consistently Better Experience

It is so tough to provide a consistent experience with a WordPress plugin. There are more funky setups and hosting environments than imaginable, so making a consistent experience for every customer was incredibly tough. I care deeply about the experience people have with OptinMonster, and by moving over to a hosted service, I could curate the exact experience I wanted our customers to have.

We constantly ran into issues with poorly coded plugins, class conflicts with email service providers, shared hosting performance nightmares – just to name a few. We very quickly had to drop detailed conversion analytics from our plugin because of issues with hosting providers. We were all the time fixing site-specific integration problems with our ESPs like MailChimp and Constant Contact. Some hosts have completely custom admin areas separated from the rest of the site, which threw off our live preview efforts.

All of this makes for a pretty inconsistent experience, and it was something that bothered me from day one (and still bothers me with our other products Soliloquy and Envira).

Now that we have moved to a hosted platform, I have complete control over the experience our customers have with our product. We have completely nixed any issues integrating with your email service provider of choice. We now have incredibly detailed conversion analytics with our Google Analytics integration.

Bug fixes and updates are pushed out immediately. To everyone. Without them ever having to lift a finger. That’s a big value add to both our customers and our team.

Better Fit for Clientele

The transition to a hosted platform is just a better overall fit for our clientele. The majority of our customers are digital marketers and business owners. Infusionsoft is one our most popular integrations, and Infusionsoft is not cheap. Infusionsoft is used by people that are very serious about their lead generation strategies.

This says a lot about our customer base, and this type of customer base is used to using platform services. Beyond this, while WordPress is popular now, that doesn’t ensure its continued popularity in the future. This type of customer has more tightly defined workflows which don’t always fit into the WordPress model, and our switch allows us to easily pivot with their business decisions should they not include WordPress in the equation.


All in all, I believe we made the best decision for our product and our company.

I think this move will be huge for OptinMonster. If the early response and sales jumps are any indication of future success, the time and effort into building the platform is already paying incredible dividends.

We’ve got some exciting new features planned for the platform as well, so here’s to the start of a completely new venture with a familiar face!

If you have any questions about our new platform or the development behind it, I’d love to answer them in the comments below!

The post The Journey from WordPress to Everything Else with OptinMonster appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/the-journey-from-wordpress-to-everything-else-with-optinmonster/feed/ 8
A Creative Approach to Efficient and Scalable WordPress API Endpoints https://thomasgriffin.io/a-creative-approach-to-efficient-and-scalable-wordpress-api-endpoints/ https://thomasgriffin.io/a-creative-approach-to-efficient-and-scalable-wordpress-api-endpoints/#disqus_thread Fri, 20 Feb 2015 15:03:16 +0000 https://thomasgriffin.io/?p=1473 For starters, it was super tough trying to figure out how to give this post a title. I’ve settled on “A Creative Approach to Efficient and Scalable WordPress API Endpoints” because it seemed to do the topic the most justice.

As WordPress continues to evolve into an application platform, it is being used more and more frequently as the backend to power APIs (REST and (un?)REST alike). You can clearly see this by all the initiative and excitement around the new JSON API that will make it into WordPress at some point in the future. I am excited about where … [continue reading]

The post A Creative Approach to Efficient and Scalable WordPress API Endpoints appeared first on Thomas Griffin.

]]>
For starters, it was super tough trying to figure out how to give this post a title. I’ve settled on “A Creative Approach to Efficient and Scalable WordPress API Endpoints” because it seemed to do the topic the most justice.

As WordPress continues to evolve into an application platform, it is being used more and more frequently as the backend to power APIs (REST and (un?)REST alike). You can clearly see this by all the initiative and excitement around the new JSON API that will make it into WordPress at some point in the future. I am excited about where this is headed because it means WordPress can easily be used to power web applications with consumable APIs, but since I am always concerned about performance, this post has come to life.

The Problem

The way to approaching the API and creating endpoints around it is somewhat puzzling. With the current architecture of WordPress, the majority of API endpoints hook into either the init or wp_loaded hooks because these are the first available actions where the WordPress backbone has been loaded. This is all well and good for ease of use, but from an API and architecture standpoint, this is almost lunacy. Let me explain why.

Before I get too much further into this, I am not complaining about how WordPress is the worst application platform on the planet. I beg to differ completely the opposite. However, WordPress was never intended to be an application platform when it was created, so the current waterfall obviously does not reflect that intent. That is what I will describe below.

In the waterfall of WordPress loading, there are a few key things that happen before these hooks are fired that gets me worried.

First, every single active plugin on your site is loaded into the request. Every single one of them.

Yikes! Now I know that the number of plugins doesn’t really affect performance (it is more about quality), but the likelihood of encountering a less-than-efficient plugin increases with every plugin that you load into the request. I’d be keen to know the average number of plugins each site uses, but based from my own experiences, I think at least 25 is a good number. The majority of the sites I run use 30+.

That’s a ton of extra cruft that is likely not necessary at all during your API request. No offense to Yoast or Gravity Forms (I use both), but I really don’t need your plugins loading on my request to verify a license key. It just doesn’t make sense.

Now I know that this isn’t as big of a deal when you are only serving a few requests a day, but this simply does not cut it for an application platform where bandwidth costs are real. Turn a few requests a day into a few million a day and you see where loading 30 plugins as opposed to a handful can be a huge issue. It is a costly waste of resources.

Second, your theme and all its shiny, glittery goodness is loaded into the request. Do wha???!?!

This is absurdity to me as well. Again, I know WordPress did not originally intend on being an application platform, but hot dang – this does not fly in the light of any conventional wisdom. You never load any sort of presentation layer into a request that is only meant for data.

So now not only do we have to worry about loading all of our plugins on every single page, but we also have to worry about your out of control theme’s functions.php file loading on every single request.

If you were being honest with yourself, you know that file is not pretty.

What’s worse is that we absolutely should not need anything that our theme provides. If you do, then you should re-think your API structure. This is just adding extra weight to the request that our server (and our bank accounts) have to reconcile. No bueno.

Finally, after all this is loaded, we get to the actual init hook. But a problem here is that even if you make the case that plugins and themes don’t actually load when they are loaded into the request, the vast majority begin executing on this hook. So unless you come in with a super high priority (likely in the negatives), your request is going to wait until the plugins and theme are finished setting up their own structures and systems.

Helpful tidbit: you don’t need to run register_post_type in order to run a query on that post type in the database. If it exists in the database, you can query it.

I hope you can see my argument and point here about this being a really bad idea from an API standpoint if you are concerned at all about performance, scalability and bandwidth costs. It simply doesn’t cut it when these are real factors. And yes, these are real factors because I’ve had to find a solution around it.

And a solution (albeit a creative one) I have found! Let’s see how it works.

The (Creative) Solution

Did I mention this solution is creative? I’m a fan of creative problem solving. Now because this solution is creative, I do not yet have a way to distribute this as a drop-in solution for API requests. This needs to be tailored to your specific setup, but I think you will find the results to be pretty awesome.

You may or may not have heard of a little thing called a “must-use” plugin. Originally intended for a specific type of Multisite plugin, when Multisite merged into WordPress back in 3.0, the backwards compatability for this turned into the idea of the “must-use” plugin: a plugin that is always loaded.

Because of the nature of this type of plugin, it is loaded before any other type of 3rd party application (plugin or theme) in the request waterfall. Must-use plugins are installed inside of the mu-plugins folder, which is inside of the wp-content folder of your WordPress install. If the folder does not exist, you can simply create the folder yourself.

As I got to thinking more about this, a lightbulb went off in my head.

With a must-use plugin, I can control the scope of the request.

How, might you ask? It’s simple when you really get down to it, but again, it is a creative way of thinking through how WordPress works.

Let’s take a look into the wp-settings.php file, which handles the bulk of the responsibility of loading the WordPress application into your request. Specifically, we are going to look at L212-217 of the file.

// Load active plugins.
foreach ( wp_get_active_and_valid_plugins() as $plugin ) {
	wp_register_plugin_realpath( $plugin );
	include_once( $plugin );
}
unset( $plugin );

Doesn’t look like anything crazy, right? But that wp_get_active_and_valid_plugins call is critical for scoping our API request. Let’s see what this function actually does.

/**
 * Retrieve an array of active and valid plugin files.
 *
 * While upgrading or installing WordPress, no plugins are returned.
 *
 * The default directory is wp-content/plugins. To change the default
 * directory manually, define `WP_PLUGIN_DIR` and `WP_PLUGIN_URL`
 * in wp-config.php.
 *
 * @since 3.0.0
 * @access private
 *
 * @return array Files.
 */
function wp_get_active_and_valid_plugins() {
	$plugins = array();
	$active_plugins = (array) get_option( 'active_plugins', array() );

	// Check for hacks file if the option is enabled
	if ( get_option( 'hack_file' ) && file_exists( ABSPATH . 'my-hacks.php' ) ) {
		_deprecated_file( 'my-hacks.php', '1.5' );
		array_unshift( $plugins, ABSPATH . 'my-hacks.php' );
	}

	if ( empty( $active_plugins ) || defined( 'WP_INSTALLING' ) )
		return $plugins;

	$network_plugins = is_multisite() ? wp_get_active_network_plugins() : false;

	foreach ( $active_plugins as $plugin ) {
		if ( ! validate_file( $plugin ) // $plugin must validate as file
			&& '.php' == substr( $plugin, -4 ) // $plugin must end with '.php'
			&& file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist
			// not already included as a network plugin
			&& ( ! $network_plugins || ! in_array( WP_PLUGIN_DIR . '/' . $plugin, $network_plugins ) )
			)
		$plugins[] = WP_PLUGIN_DIR . '/' . $plugin;
	}
	return $plugins;
}

Oh man, that second line is huge! It requests an option called 'active_plugins' to retrieve the active plugins that should be loaded into the request. This may not sound too exciting, but when you couple it with the fact that WordPress has generous filters for the final payload of get_option calls, you can start to see where my excitement comes from.

Armed with this knowledge, it all came together for me. My thought pattern was now “If I can determine the URI path being requested, then I can make use of this capability to whitelist what I need for the request!” – rock on!

That is exactly what I decided to do, and it is something that you can do, too.

Implementing the Creative Solution

There is really only one thing you need to make this work, but I am using two: a must-use plugin and an API plugin.

Let’s take a look at the must-use plugin. I have called it api-helper.php.

Take this file and drop it into your mu-plugins folder. You will obviously need to adjust for your specific setup. Let’s dig into what is happening here.

First of all, we check to make sure a valid URI path has been given to us. If not, we bail. Next, we check to make sure that the route requested actually matches the API route we have defined for our users. In this example, our API route will always start with /api/v1/. If this is not present in the URI path, we bail.

Once we have passed both of these checks, we then add a filter to the option call that retrieves active plugins from the database. At any point in the request, we only want our whitelisted array of plugins to be loaded.

For my setup, I have one plugin that I have created called api-routes that makes use of the simple Alto Router class to setup dynamic API routes. It will map specific API calls to specific methods that will then do the processing for API requests.

Next, I then load in conditionally any plugins that might be necessary for specific API routes. You may want to create a different plugin (in my example api-update-helper) that loads for a specific type of API request.

Finally, I load in last any plugins that are dependent on previously loaded plugins such as the api-routes plugin.

You will notice that I have explicitly defined the plugin basename path. This is required because this is what the active_plugins response normally returns. It is pretty easy to figure out this path – it’s just whatever the plugin folder name is along with the name of the main plugin file. If you have trouble with this, this tutorial is probably not for you. :-)

Once all this is set, the whitelisted array of plugins to load will be returned instead of the default response, meaning that now instead of 40 plugins loading on the request, only the ones you specify will load. This is huge, but now the next step is even better.

Because you have now defined what plugins should load during the request, you don’t have to be concerned about when everything else loads. At this point, your whitelisted plugins have been returned, and WordPress has now loaded them into the application request.

Once all of these plugins are loaded, WordPress then loads pluggable functions, sets the internal encoding and then loads the cache for any caching solution you might have in place.

Immediately after this, the action hook plugins_loaded is fired. I want you think with me for a second – what more do you really need to process your request?

Everything from this point forward, minus the wp_magic_quotes function (I will chat about in a second), all has to do with the presentation of your data. For all intents and purposes, you don’t actually need anything else that WordPress will load at this point. Everything that you need to query the database for your data, setup and authenticate a user, etc. has already been loaded into your request.

Side note on wp_magic_quotes – this sanitizes superglobals like $_GET and $_POST, and it also creates the WordPress-specific $_REQUEST superglobal. This is a good thing, so we can also use the sanitize_comment_cookies hook, which runs immediately after this.

Armed with this knowledge, it should be clear that now you can easily just hook into plugins_loaded or sanitize_comment_cookies and process your request right then and there. If you are like me and have created API-specific plugins for this, then using these two hooks is not a problem.

Better yet, I created a specific hook in my final dependency plugin that fires once it has loaded, and then in my API Routes plugin, I hooked into that action to process the API logic.

The Results

Well, I don’t even feel the need to document the results. It should be glaringly obvious that this method will be way faster than anything you’ve done before. In my initial runs, requests that were normally taking 800ms to run are now humming around 110ms. That is a ridiculous boost in performance. The results from this will vary based on the plugins that you decide to load during the API request.

One takeaway from this: don’t let people tell you that you can’t use WordPress as an application platform. When you take this approach and put it with some good server architecture and caching, your API can perform just as well as any other platform out there.

I am convinced that WordPress can handle anything you throw at it – you just might have to get a little creative at problem solving to make it work best.

I’m interested in your thoughts – let’s hear them!

The post A Creative Approach to Efficient and Scalable WordPress API Endpoints appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/a-creative-approach-to-efficient-and-scalable-wordpress-api-endpoints/feed/ 22
Lead Generation with WordPress https://thomasgriffin.io/lead-generation-wordpress/ https://thomasgriffin.io/lead-generation-wordpress/#disqus_thread Tue, 13 Jan 2015 00:51:47 +0000 https://thomasgriffin.io/?p=1470 I’ve just given a talk at our local WordPress meetup here in Charlotte about lead generation in WordPress.

I love lead generation, and so I prepared a talk about it to our local WordPress meetup. You can find the slides here below.

[continue reading]

The post Lead Generation with WordPress appeared first on Thomas Griffin.

]]>
I’ve just given a talk at our local WordPress meetup here in Charlotte about lead generation in WordPress.

I love lead generation, and so I prepared a talk about it to our local WordPress meetup. You can find the slides here below.

The post Lead Generation with WordPress appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/lead-generation-wordpress/feed/ 6
2014 Year in Review https://thomasgriffin.io/2014-year-review/ https://thomasgriffin.io/2014-year-review/#disqus_thread Tue, 30 Dec 2014 14:33:15 +0000 https://thomasgriffin.io/?p=1463 2014 has been an incredible year! I want to pause to rejoice, reflect upon and remember all that has happened this past year.

Brian Lowe, the lead pastor at Exodus Church where I attend, preached an excellent sermon on Psalm 48 about the Israelites rejoicing, reflecting upon and remembering all that God had done for them. As I look back at 2014, I want to do the same.

It’s so very easy to look at the year to come and dream about all the exciting things that will happen and forget about the exciting things happened in the year before. … [continue reading]

The post 2014 Year in Review appeared first on Thomas Griffin.

]]>
2014 has been an incredible year! I want to pause to rejoice, reflect upon and remember all that has happened this past year.

Brian Lowe, the lead pastor at Exodus Church where I attend, preached an excellent sermon on Psalm 48 about the Israelites rejoicing, reflecting upon and remembering all that God had done for them. As I look back at 2014, I want to do the same.

It’s so very easy to look at the year to come and dream about all the exciting things that will happen and forget about the exciting things happened in the year before. We don’t value reflection in American culture, and I think that is a huge misstep because we all too easily forget where we came from. Jesus has been incredibly gracious to me, my family and my business in 2014, so I want to take the time to write down and reflect upon all the good and gracious things he alone has done.

I’ve broken this down into two segments: business and personal. I’ll address the business review first, and then I will go on to reflect upon personal milestones and achievements.

2014 Business Reflection and Review

2014 was an incredible year for my business. I saw a ton of new things happen that I want to reflect upon and document.

I hired my very first employee. This was a huge step for me. I hired my very first full-time employee back in February of this year. Up until this point, it had been just me and a couple of interns at one point during the summer of 2013. I remember the moment being scary but very necessary as I was drowning in support for my products. It was all I could to do stay afloat, much less actually make any good updates to the products, so hiring some extra help was a big leap forward. Getting me outside of the business so I could work on the business was one of my big goals for 2014, and that first employee was a huge step in that direction.

I launched Envira Gallery. It seems like forever ago, but I actually launched Envira Gallery back in January of 2014. I can’t believe it has been almost a year since that occurred. It has seen steady growth since the initial launch, and our team has added a ton of new awesome features to the plugin. It has grown more slowly than I would have liked, but that’s because of my next reflection.

I watched OptinMonster explode. It only took a matter of months before OptinMonster began to explode in popularity. Even today, I see OptinMonster everywhere. I’ve even had family say they’ve seen OptinMonster on sites that they visit! I watched as our daily goal for OptinMonster sales began to be shattered on a consistent basis. I remember driving down to Savannah in January 2013 to meet with Syed for the first time to discuss our plans with OptinMonster, and I specifically remember talking on the phone with one of my friends about how big this thing could potentially be. Little did I know that my expectations would be far surpassed within the first few months. Seriously – I was thinking that this *might* make 6 figures in the first year. Thousands and thousands of customers later, I smile looking back to that day because I literally had no idea what would happen in the first year of OptinMonster being on the market. Even in my wildest dreams I never imagined the success I would see today, and for that I am immensely grateful and humbled.

I saw my business revenue quadruple. It wasn’t just OptinMonster that grew – everything else grew along with it. In fact, at one point I remember looking at my books and literally starting to tear up because I couldn’t fathom the numbers I was seeing. I’ve been blessed far beyond what I deserve, and I can attribute that immense blessing to no one other than Jesus.

I merged my business with Syed. It just made sense. We work well together – our strengths compliment one another, and our weaknesses are evened out with the other’s strengths. Part of this merger meant hiring more people and putting together a team, and I am amazed at what our team has done so far. They are hard workers, and I am so thankful to have them under my leadership. Their work makes me strive to be better leader and peer, and I’m indebted to their contributions to our company’s many successes in 2014.

I started to move out of the forest. For the longest time, I worked both in and on my business. This is fine (and necessary) when it is just you running the show, but when you have a team of people working with you and depending on you for the next move, you’ve got to give up control so that you can be the leader you need to be. I am constantly learning ways where I can empower my team to do what they love all while letting go of areas that I used to control. This has been very tough for me because I love building things, but it is a necessary step if I want to watch our company grow and compete at the next level. I haven’t stopped building things completely, but I just don’t do it as much because my roles are shifting as our company grows.

I hired a bookkeeper. This was so freeing because I didn’t have to worry about my books or payroll anymore. To me, a bookkeeper is a well-deserved asset that you need on your team. I saved so much time by allowing him to do what he was good at so that I could focus on building my business. In the end, I now have an infinitely better picture of my company’s financial health and will have way less work to do when tax season comes around.

I attend more WordCamps and even spoke at one again! I took a lot of time off from traveling in 2013 because I wanted to focus on building out OptinMonster. This year I traveled more and attended a few more WordCamps, including Atlanta, Miami and Orlando. I spoke at WordCamp Orlando this year and had a great time speaking to an entirely different audience than what I am used to (majority beginners).

2014 Personal Reflection and Review

2014 was also an excellent year for me personally, and I want to reflect on a few highlights from there as well.

We became debt-free (minus our house). This was a big milestone for me and one of the biggest goals that I achieved this year. I am a huge Dave Ramsey fan and am a firm believer in his gazelle intense philosophy. I decided that I wanted to become debt-free this year, and boy did I work hard at it. I paid off both of our cars and paid off the entirely new heating and air system we had to have replaced back in May. I also paid off a bunch of landscaping that we had done to our house, and I also paid off our new water heater that we had to have replaced in April. The freedom of not having any debts is, well, freeing. I’ve always said that personal finances will affect business decisions, so I wanted to align my values with what I actually did. We currently have no debt except for our house, and I’m pretty dead-set on getting that thing paid off as soon as humanly possible.

We put back 8 months savings in the bank. On top of paying off all of our debt, I was also able to put back almost 8 months of savings in the bank. Because of the nature of technology, I am fully aware that success can dry up in the blink of an eye. Although I am working hard to prevent that from happening, I know that life happens. This “emergency fund”, “safety net”, “buffer between you and life” or whatever you want to call it is an investment in my marriage and my mental and physical health. Now I have the peace of mind that when an unexpected event occurs, it’s no longer a crushing disaster but a minor inconvenience.

I taught a class on the gospel and productivity. This was something new that I really, really enjoyed doing. Most people have the misconception that the gospel simply saves you from your sin, but this is only half of the equation. The gospel not only saves you from sin but calls you to be “zealous for good works” (Titus 2:14). In this class, I unpacked how to gospel changes the way we view productivity and getting things done, and gave both a theological and practical perspective for that view. I was able to refine my personal mission statement for life, which I have documented below.

My Mission Statement

Core Purpose

“To serve, honor and enjoy Jesus while furthering His kingdom and mission in this world by doing everything I do with excellence.” 1 Corinthians 10:31

Core Principles

1. To be quick to seek Jesus’ grace, mercy and help in any endeavor that I undertake: work, personal and spiritual alike.
2. To be careful to serve Jesus to the fullest in whatever position He has called me.
3. To be humble always so that I may repent of sin, learn with dignity, teach with grace and submit with willingness where necessary.
4. To encapsulate all these things with a fervor, energy and excellence that only God can grant and sustain.

Core Beliefs

I am a broken and sinful man in desperate need of God’s loving kindness, grace and mercy. I am adopted as His child through the death, burial and resurrection of Jesus and kept by the power of His ever-present Spirit. I am called to be bountiful in loving, serving and enjoying God as long as I live on this earth.

I coached a high school golf team, and we won the conference tournament! This was exciting as it was the first conference championship for the school in golf. I am a big fan of golf (and a scratch golfer), and I had so much fun coaching and watching these kids blossom into a talented team that won the conference tournament by 7 strokes outright. Our top 4 golfers won all-conference medals, with our #1 golfer qualifying as the #1 individual in the state tournament.

We went on a trip to visit friends in Alaska. Alaska was beautiful and cold. We went in February to visit some of our dear friends who are stationed at Fort Wainwright in Fairbanks. We got to see some of the incredible ice sculptures from people all around the world competing in the world ice sculpting challenge. We were able to relax in a natural hot spring with it being like -10 degrees outside (beard-freezing cold). We saw the Northern Lights and even got to go skijoring. We saw the start of the Iditarod sled dog race in Anchorage on our last days of the trip. I’ve included a few of the pictures from the trip below.

angelsculpture northernlights sleddogs freezing

…and the list could go on and on and on.

Onward to 2015

2014 – it has been a great ride.

I’ve been blessed beyond measure, and I’m excited to see what 2015 holds. I don’t know what tomorrow may bring, and even if everything falls away, I can still rejoice because my hope is in Jesus and not the fleeting things of this world. 

I’ve got a short list of things I want to do in 2015, but none are particularly easy!

  1. I want to pay off my house completely. I want to be completely debt free, including my house, at some point in 2015. This will mean being diligent about sticking to our budget and living well below our means until that happens. Laura and I have both been called to be generous with what we are given to steward, and it’s hard to be generous when you are a slave to a lender. Needless to say, I want to out from under that burden as soon as humanly possible.
  2. I want to launch a new product. This is already in the works, but it is a goal nonetheless. It’s easy to get stuck in maintenance mode for other endeavors, so I find it necessart to remind yourself of things you want to accomplish so that you actually do them.

That’s all. I told you it was a short list, but neither of those things are easy to do. I’ll have my work cut out for me, and when I achieve them, I’ll work on my next list of goals to achieve!

What has happened for you in 2014? What do you hope for in 2015? I’d love to know!

The post 2014 Year in Review appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/2014-year-review/feed/ 37
How to Enable HTTP Strict Transport Security (HSTS) in WordPress https://thomasgriffin.io/enable-http-strict-transport-security-hsts-wordpress/ https://thomasgriffin.io/enable-http-strict-transport-security-hsts-wordpress/#disqus_thread Mon, 29 Dec 2014 14:43:24 +0000 https://thomasgriffin.io/?p=1462 I embarked on moving my site completely to SSL, and part of that process was using the HTTP Strict Transport Security (HSTS) header on the site.

With all of the security breaches that we have seen just this past year, it makes total sense to want to move everything over to SSL. Google is already starting to favor SSL sites in search results, and it provides more confidence for your visitors when they see that your site is secured via SSL.

I had already done 301 redirects from non-SSL to SSL pages on my site, but I wanted to make [continue reading]

The post How to Enable HTTP Strict Transport Security (HSTS) in WordPress appeared first on Thomas Griffin.

]]>
I embarked on moving my site completely to SSL, and part of that process was using the HTTP Strict Transport Security (HSTS) header on the site.

With all of the security breaches that we have seen just this past year, it makes total sense to want to move everything over to SSL. Google is already starting to favor SSL sites in search results, and it provides more confidence for your visitors when they see that your site is secured via SSL.

I had already done 301 redirects from non-SSL to SSL pages on my site, but I wanted to make sure that all pages and queries moving forward would automatically be sent and received as SSL. You can force this in browsers by adding in the Strict Transport Security header to each of your page requests in WordPress.

To do this, we will target the send_headers action hook, which is used to add additional headers to your outgoing HTTP responses. It may be obvious or not, but you will need to ensure your site has a functioning SSL certificate for this implementation to work! Just drop the following code into your theme’s functions.php file and you will have enabled HTTP Strict Transport Security (HSTS) to your WordPress site.

add_action( 'send_headers', 'tgm_io_strict_transport_security' );
/**
 * Enables the HTTP Strict Transport Security (HSTS) header.
 *
 * @since 1.0.0
 */
function tgm_io_strict_transport_security() {

	header( 'Strict-Transport-Security: max-age=10886400' );

}

This adds the Strict Transport Security header for 18 weeks, which is required if you want to eventually be eligible for HSTS preloading in browsers like Chrome, Firefox and Safari.

HSTS Preloading

By adding the Strict Transport Security header to your site, you secure every visit from your visitors except for the initial visit. That still leaves your site vulnerable to MITM (man-in-the-middle) attacks for that initial visit, so there is a technique called “preloading” that will add your site to a pre-populated domain list. Once your site is on that list, the major browsers that support HSTS preloading will be notified that your site requires SSL, and every visit, even the very first one from a visitor, will automatically be forced through SSL.

If you want to enable this for your site, there are a few requirements before you can make that trigger.

  1. Have a valid SSL certificate. You can’t do any of this anyways without it.
  2. You must redirect all HTTP traffic to HTTPS (recommended via 301 permanent redirects). This means that your site should be HTTPS only.
  3. You must serve all subdomains from HTTPS as well. If you have subdomains, you will need a wildcard SSL certificate for this.
  4. Serve an HSTS header on the base domain (e.g. thomasgriffin.io) that meets the following requirements:
    1. The expiration length must be at least 18 weeks.
    2. The includeSubDomains token must be specified in the header.
    3. The preload token must be specified in the header.
    4. If you are serving a redirect, that redirect must have the HSTS header too, not just on the pages it redirects to.

Once you have met all these requirements, you can use this code in your functions.php file instead to support HSTS preloading.

add_action( 'send_headers', 'tgm_io_strict_transport_security' );
/**
 * Enables the HTTP Strict Transport Security (HSTS) header.
 *
 * @since 1.0.0
 */
function tgm_io_strict_transport_security() {

	header( 'Strict-Transport-Security: max-age=10886400; includeSubDomains; preload' );

}

Now when visitors come to your site, the browser will be notified that you want to be on the preload list. Assuming that you meet all the requirements, you should see your site loaded in that list within a few months.

If you want to check your site’s preload status, you can do it here: https://hstspreload.appspot.com/

That should be it! You have now enabled HTTP Strict Transport Security on your WordPress site!

The post How to Enable HTTP Strict Transport Security (HSTS) in WordPress appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/enable-http-strict-transport-security-hsts-wordpress/feed/ 6
How to Hide the WordPress Meta Generator Tag https://thomasgriffin.io/hide-wordpress-meta-generator-tag/ https://thomasgriffin.io/hide-wordpress-meta-generator-tag/#disqus_thread Sun, 28 Dec 2014 15:05:33 +0000 https://thomasgriffin.io/?p=1461 In this short tutorial, we will learn how to hide the WordPress meta generator tag.

By default, WordPress will output a meta generator tag into the head of your document that displays the current WordPress version number. This can cause some security issues, especially if you are running an old version of WordPress, so you may want to hide the WordPress meta generator tag altogether.

To do this, simply drop the following code into your theme’s functions.php file and viola, the WordPress meta generator tag will be hidden from view.

add_filter( 'the_generator', '__return_false' );

There you have it – you’ve [continue reading]

The post How to Hide the WordPress Meta Generator Tag appeared first on Thomas Griffin.

]]>
In this short tutorial, we will learn how to hide the WordPress meta generator tag.

By default, WordPress will output a meta generator tag into the head of your document that displays the current WordPress version number. This can cause some security issues, especially if you are running an old version of WordPress, so you may want to hide the WordPress meta generator tag altogether.

To do this, simply drop the following code into your theme’s functions.php file and viola, the WordPress meta generator tag will be hidden from view.

add_filter( 'the_generator', '__return_false' );

There you have it – you’ve now hidden the WordPress meta generator tag. Enjoy!

The post How to Hide the WordPress Meta Generator Tag appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/hide-wordpress-meta-generator-tag/feed/ 0
How to Hide the Admin Bar in WordPress https://thomasgriffin.io/hide-admin-bar-wordpress/ https://thomasgriffin.io/hide-admin-bar-wordpress/#disqus_thread Sat, 27 Dec 2014 20:44:44 +0000 https://thomasgriffin.io/?p=1459 Let’s dig into how to hide the admin bar in WordPress.

When the admin bar was first introduced, I didn’t particularly care for it. Over time, I have gotten used to it being there and actually enjoy using it, but there are certain situations where hiding the admin bar just makes sense. For example, if you have a membership site that is run on WordPress, your users will likely never need to use the admin bar. In this case (and many others), you will want to hide the admin bar to prevent confusion. There are two ways to do this, … [continue reading]

The post How to Hide the Admin Bar in WordPress appeared first on Thomas Griffin.

]]>
Let’s dig into how to hide the admin bar in WordPress.

When the admin bar was first introduced, I didn’t particularly care for it. Over time, I have gotten used to it being there and actually enjoy using it, but there are certain situations where hiding the admin bar just makes sense. For example, if you have a membership site that is run on WordPress, your users will likely never need to use the admin bar. In this case (and many others), you will want to hide the admin bar to prevent confusion. There are two ways to do this, so let’s look at both.

Hide the Admin Bar via Filter and Hook

The simplest way to hide the admin bar in WordPress is to remove the hook and filter for it. Just drop this code into your theme’s functions.php file and off you go.

add_filter( 'show_admin_bar', '__return_false' );
remove_action( 'wp_footer', 'wp_admin_bar_render', 1000 );

This will hide the admin bar for everyone. Most tutorials will only show the first bit of code, but the admin bar assets will still load on the page if you don’t include the second line to remove them.

I’ve found that many times I just want to hide the admin bar from subscribers only, so if you want to do that, use this code instead.

add_action( 'init', 'tgm_io_remove_admin_bar' );
function tgm_io_remove_admin_bar() {

	$user = wp_get_current_user();
	if ( $user ) {
		if ( in_array( 'subscriber', $user->caps ) ) {
			add_filter( 'show_admin_bar', '__return_false' );
			remove_action( 'wp_footer', 'wp_admin_bar_render', 1000 );
		}
	}

}

This will hide the admin bar in WordPress for subscribers only, leaving it in tact for Editors and Administrators and such.

Hide the Admin Bar via User Setting

You can also hide the admin bar on a per-user basis by editing the profile options for the particular user.

Hide Admin Bar in WordPress

Hide the admin bar in WordPress for a specific user.

To do this, simply find the user you want to hide the admin bar for and go to the editing page for his profile. Uncheck the option to “Show Toolbar when viewing site” and save the user’s profile. Viola – the WordPress admin bar will be hidden for that user only.

So there you have it – two options to hide the admin bar in WordPress depending on your needs! Enjoy, and make sure to subscribe to get regular content updates AND a copy of my WordPress toolbox for free!

The post How to Hide the Admin Bar in WordPress appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/hide-admin-bar-wordpress/feed/ 0
How to Load Typekit in the TinyMCE Visual Editor in WordPress https://thomasgriffin.io/load-typekit-tinymce-visual-editor-wordpress/ https://thomasgriffin.io/load-typekit-tinymce-visual-editor-wordpress/#disqus_thread Sat, 27 Dec 2014 00:55:43 +0000 https://thomasgriffin.io/?p=1451 Today I’m going to show you how to load TypeKit in the TinyMCE Visual Editor in WordPress. That was a mouthful.

I’ve just recently implemented the editor style feature in my own custom theme for this site, but during the implementation, I quickly realized that I had a problem. I use the Proxima Nova font from TypeKit, and I was having a heck of a hard time trying to figure out how to load TypeKit inside of the TinyMCE Visual Editor.

TinyMCE works by loading the editor area inside of an iframe, which means that the contents inside can’t be … [continue reading]

The post How to Load Typekit in the TinyMCE Visual Editor in WordPress appeared first on Thomas Griffin.

]]>
Today I’m going to show you how to load TypeKit in the TinyMCE Visual Editor in WordPress. That was a mouthful.

I’ve just recently implemented the editor style feature in my own custom theme for this site, but during the implementation, I quickly realized that I had a problem. I use the Proxima Nova font from TypeKit, and I was having a heck of a hard time trying to figure out how to load TypeKit inside of the TinyMCE Visual Editor.

TinyMCE works by loading the editor area inside of an iframe, which means that the contents inside can’t be manipulated by traditional methods like using the admin_head hook to inject JavaScript onto the plugin. The content needs to be loaded inside of the frame, and in order to make that happen, you have to actually create a TinyMCE plugin to make it work! It was a little annoying, but I was able to make it happen.

The TinyMCE Plugin

You will need to create a TinyMCE plugin, which is essentially a JS file with some self-executing functions that attach to specific TinyMCE events. Since we are likely dealing with editor style here, it makes sense to load this from your theme. In the root of your theme, create a folder called js, and then inside of the folder, create a file called typekit.js. This will be necessary for us to load our TinyMCE plugin to get TypeKit to work inside of the TinyMCE Visual Editor in WordPress.

Load TypeKit in TinyMce Visual Editor in WordPress

Once you have done this, you will need to add the following code inside of the typekit.js file. Take note of the section commented for your TypeKit ID. You will need to replace the code with the ID from your own TypeKit Kit, which can be found in the Kit Settings.

Loading the TinyMCE Plugin

Now that we have created the plugin, we need to load it into the TinyMCE plugins loader so that it can be included when the editor is created. Drop the following code into your theme’s functions.php file.

And there you have it – TypeKit is now loaded into the TinyMCE Visual Editor in WordPress. You can now use your custom TypeKit fonts (like Proxima Nova) inside of your editor-style.css file for customizing the Visual Editor appearance.

The post How to Load Typekit in the TinyMCE Visual Editor in WordPress appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/load-typekit-tinymce-visual-editor-wordpress/feed/ 4
Pagely Review – It’s Worth Every Penny https://thomasgriffin.io/pagely-review/ https://thomasgriffin.io/pagely-review/#disqus_thread Sun, 14 Dec 2014 19:55:14 +0000 https://thomasgriffin.io/?p=1419 For starters, my Pagely review is legit. I use Pagely to host all my WordPress product sites, and I can confidently say that choosing Pagely is worth every penny you can afford to spend on WordPress hosting.

I’ve used a ton of different hosts in my days of working on the web and with WordPress. From iPage (yes, somewhat ashamedly) to HostGator to Bluehost (I still recommend Bluehost for price sensitive folks) to WP Engine to VPS.net to just about any other popular host you can think of, I’ve purchased and used. I’ve accumulated a bunch of knowledge from working … [continue reading]

The post Pagely Review – It’s Worth Every Penny appeared first on Thomas Griffin.

]]>
For starters, my Pagely review is legit. I use Pagely to host all my WordPress product sites, and I can confidently say that choosing Pagely is worth every penny you can afford to spend on WordPress hosting.

Pagely Review

I’ve used a ton of different hosts in my days of working on the web and with WordPress. From iPage (yes, somewhat ashamedly) to HostGator to Bluehost (I still recommend Bluehost for price sensitive folks) to WP Engine to VPS.net to just about any other popular host you can think of, I’ve purchased and used. I’ve accumulated a bunch of knowledge from working with all of them in the past, so I hope to take that knowledge and formulate it into one giant, awesome Pagely review for you and convince you why you should choose them as your next WordPress hosting provider (erhhhmm, hosting “partner”!).

Before I get started with my Pagely review, I do want to say that I have affiliate links in this post, meaning if you purchase a Pagely package after clicking on one of the links, I may receive a small portion of that sale as a commission. This doesn’t affect the content of the review, however, as I really do use Pagely for my WordPress product and other business sites!

Pagely Review Intro: Why I Use Them

I’ve sometimes been annoyed at reviews (especially hosting reviews) because they never explain why you would actually want to use whatever service they are recommending. That irks me because typically you are searching for a reason to use whatever you are researching, not necessarily the features (although feature highlighting is important). I want to share with you a few important reasons why I think Pagely is a superb choice for hosting your WordPress site.

  1. I’m big on speed and performance. Both of those matter a bunch to me because both of those things can vastly impact (both positively and negatively) the experience a visitor has on your site. Pagely is built to scale with performance and speed in mind. The underlying architecture is built on top of the Amazon Cloud, one of the most scalable platforms (if not the most) in the world. This means that your WordPress site gets access to the largest amount of resources you could possibly imagine – speed, performance and scalability. These three things alone are enough to convince me that Pagely is a superb choice for WordPress hosting.
  2. Pagely automates many tasks that help keep your site safe, secure and successful on the web. They do automated backups and updates for you. They include a free CDN (content delivery network) at any level plan you decide to purchase, meaning your content gets served faster to your audience. Their service is very secure (all behind-the-scenes work requires two-factor authentication + key access) with their PressARMOR implementation, and as I mentioned before, they are blazingly fast. You don’t have to configure caching plugins or anything of that nature – they do it for you. Automatically.
  3. Their technical support is outstanding. These guys are engineers and have a highly competent support staff (Kris, Piotr and the rest of the team) that can answer any of your most technical questions. They are always speedy in their responses, and they are even gracious when I don’t respond back right away (which I am guilty of). I’m confident there’s not a question you can ask that these guys can’t handle.
  4. Most importantly for me, hosting with Pagely has allowed me to sleep easy at night. I don’t have to worry about my sites suffering from yet another hack attempt or denial of service attack. I don’t need to worry about my server crashing when a popular review for one of my products sends a surge of visitors over to the site. I didn’t need to worry about our sites going down during our record-setting Black Friday/Cyber Monday sales pushes. Pagely allows me to focus on the things I do best.

To sum it up in one simple phrase: Pagely has been an investment in my business. I think you will find Pagely to be an investment in yours, too.

Interested? Click Here to Learn More About Pagely

Pagely Review: The Features

Let’s get into the meat of the features for my Pagely review. At the time of this writing, there are 7 different plans that you can choose from, all of which are tailored to your growing needs for your budding website and business. Each and every plan comes standard with the following items:

  • Unlimited number of pageviews (awesome – no restrictions on the growth of your business)
  • Powered by the Amazon Cloud infrastructure
  • Automatic WordPress upgrades
  • Automatic backups to Amazon S3 (this is awesome – huge for security and general mishaps that you might cause)
  • PressCache (their own sweet caching implementation for faster sites) with a persistent cache (Memcached or Redis)
  • PressArmor (their own custom security infrastructure for their network and your site)
  • SSL + SPDY support (for fast SSL implementations)
  • Dedicated IP addresses

Now that we have all of the standard options listed, let’s take a look at each plan and the where each differs in terms of price and features.

Comparison of Pagely WordPress hosting plans and pricing.
Feature Personal Business Professional Ultimate VPS-1 VPS-2 VPS-3
Price (month) $24 $64 $149 $269 $399 $799 $999
# of Sites 1 3 10 20 35 50 35
Setup Time Instant Instant Instant Instant 2-3 Days 2-3 Days 2-3 Days
Disk Space 5GB 10GB 20GB 30GB 50GB 50GB 50GB
Bandwidth 5GB 10GB 25GB 50GB 100GB 200GB 200GB
PressCDN 25GB 50GB 100GB 250GB 500GB 1000GB 1000GB
MultiSite
Staging Sites
Private Databases
Git/SVN
WP-CLI
SSH Access
DB Access
HHVM Support

I understand that the features listed in my Pagely review can be somewhat overwhelming. To give you an anchor, my products use the VPS-1 package from Pagely. If you are a small business site that doesn’t receive a lot of traffic (less than 10,000 pageviews a month), the Personal plan makes total sense for your site. I also have another site that runs on the Personal plan and I’ve not once had any issues with speed, performance or bottlenecking of any kind. In fact, I mention later in the review that average response time over 5 months is under 400ms!

If you need more than one site, the Business and Professional plans are both very good options for you. You still get the same speed that you would expect with the ability to add new sites and sustain growth in traffic and usage of your site.

If you have more highly dynamic sites or sites where your website is crucial to your business revenue (like maybe an ecommerce store), the VPS packages will make the most sense for you. If you think about it, ~$400 is a small price to pay considering the safety, security and performance you are buying. The last thing you want to do is skimp on your hosting and then worry about your site going down when you have customers waiting to buy, which is exactly what I experienced at lots of other hosts until I moved to Pagely. Their custom built VPS packages do not disappoint at all – speed, security, scalability, and peace of mind. What more can you ask from your hosting partner?

Pagely Review: Control Panel

One of my favorite things about my Pagely review is their finely tuned Atomic Dashboard. In this control panel, you have direct access to manage your applications (sites), setup staging URLs, request support and more.

When you first log in, you will be presented with a screen that looks something like the image below.

Pagely Review

The dashboard is very clean and organized, and all of your site information is easily accessible. I’ve found this to be far different from most other hosting panels, which are cumbersome and tough to understand at best.

This particular plan is the Personal plan, as you can tell by the 1 site that I have created on it. From here, you can manage your sites, adjust your plan and billing details, request support and more. I’ve had no issues at all with this starter plan since I began using it. In fact, the site is mostly on autopilot because Pagely handles all of the updates and backups for me!

You can click on each one of your sites for management tools, such as staging URLs, site backups and site statistics (like bandwidth and CDN usage). There are also some nifty tools that you can use as well, such as their Whitescreen Eliminator process which will swiftly remove that whitescreen of death from your site so that you can fix whatever error has occurred.

Interested? Click Here to Learn More About Pagely

Pagely Review: Support

You can also access support straight from your Atomic dashboard as well, which if I haven’t already said before is absolutely phenomenal.

Pagely Review

Pagely has done as excellent job at crafting incredibly helpful and thorough documentation, and their integration with Zendesk rocks. It’s very easy to login and see any tickets that you have already created, the status of those tickets, and the ability to respond to and create new tickets.

Their support is incredibly fast, competent and helpful. These guys want to help you succeed (at least that’s the feeling I get), which definitely cannot be said in comparison to many of the cheap hosting providers where you feel like you are not valued at all as a customer. Their support staff are quick to answer questions, resolve issues and provide helpful information for anything they might deem beneficial for the future.

Most of my support issues are technical, such as having SSL certificates installed or doing migrations over to their platform, but not once have I had an issue with Pagely’s service or competency. Beyond the speed and performance of Pagely, their support is my next favorite “feature” of having them as my hosting partner.

Pagely Review: Blazing Fast Speed

Speed, performance and reliability were the most important things for me, and you will not be disappointed by Pagely. Of all the hosts I have used, Pagely has been by far the most consistent with blazing fast speed and performance. I’ve been hosting one site with them for about 5 months now, and my Pingdom Tools reports that the historical average load time is only 344ms. That is crazy fast!

You can see how fast my product sites load, even with them being style and graphics heavy. OptinMonster loads blazingly fast and so does Soliloquy.

I ran a quick test (using WebPageTest) on the OptinMonster site, and the results are awesome for a high-traffic product site with a ton of styles, scripts and graphics to boot.

Pagely Review

The important stat from this image is the “Start Render” column – that is the amount of time it takes for the page to be viewable and usable. For first and repeat visits, the average is 569ms – incredible! That is blazing fast speed. And not only this – the site scores a 96/100 with Google PageSpeed without any extra configuration needed on my end.

I can’t really find any cons in my Pagely review for any of the non-VPS plans. For my needs and the needs of sites I have hosted on those plans, Pagely has all of the bases covered. My only con would be on the VPS plans with their staging implementation. WP Engine definitely has a more intuitive staging setup. That is not to say that Pagely’s setup doesn’t work – it does and works very well – but it takes a little bit of work and you need to have a good understanding of Git and SSH to make it work effectively. Other than this, everything is a breeze.

Pagely Review: Final Remarks

Like I’ve said before, I’ve used a ton of different hosts over the years. I’ve used pretty much all of the managed WordPress hosts at one point or another, and I can confidently say that Pagely is an excellent investment for your WordPress website. It’s worth the money that you spend on the plans, and I think you will be very pleased with the performance, scalability, reliability and security of your sites while on the Pagely platform.

If you still have questions about ,y Pagely review, please let me know. I’d be more than happy to help answer them so that you can make an informed purchased decision. I hope my Pagely review has been insightful and helpful and maybe even encouraged you to use them!

Interested? Click Here to Learn More About Pagely

The post Pagely Review – It’s Worth Every Penny appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/pagely-review/feed/ 3
How to Change the Comment Link in WordPress https://thomasgriffin.io/change-comment-link-wordpress/ https://thomasgriffin.io/change-comment-link-wordpress/#disqus_thread Sat, 13 Dec 2014 12:44:13 +0000 http://thomasgriffin.io/?p=1406 By default, the comment link in WordPress will jump us to a div tag called “#respond”, but that only makes sense if using the default WordPress comment system.

If we are not using the default WordPress comment system (maybe something like Disqus, which is what I use here), then clicking on that “Leave a Reply” or “Leave a Comment” link won’t take you anywhere. If you are using a different comment system, there is a likelihood that the ID tag they use to target their comment box is different.

For my example, Disqus uses an ID tag called "disqus_thread". I … [continue reading]

The post How to Change the Comment Link in WordPress appeared first on Thomas Griffin.

]]>
By default, the comment link in WordPress will jump us to a div tag called “#respond”, but that only makes sense if using the default WordPress comment system.

If we are not using the default WordPress comment system (maybe something like Disqus, which is what I use here), then clicking on that “Leave a Reply” or “Leave a Comment” link won’t take you anywhere. If you are using a different comment system, there is a likelihood that the ID tag they use to target their comment box is different.

For my example, Disqus uses an ID tag called "disqus_thread". I wanted my readers to be able to click the link and be automatically taken to the Disqus comment area, so I had to figure out a way to make this happen.

Fortunately for us, WordPress provides us with a filter to do so: get_comments_link. For most people, you will want the comment link in WordPress to remain linked to the current post. I’ve highlighted it in the code, but you will likely just want to change the ID hash to reference the proper element for your comment system.

Just drop this code into your theme’s functions.php file and you can be on your way!

And that’s it folks! You’ve now successfully changed your comment link in WordPress!

The post How to Change the Comment Link in WordPress appeared first on Thomas Griffin.

]]>
https://thomasgriffin.io/change-comment-link-wordpress/feed/ 1