Start » WordPress » Plugins » The SEO Framework vs Yoast SEO

The SEO Framework vs Yoast SEO - plugin comparison

The SEO Framework vs Yoast SEO

Updated: 17/05/2020.

In this post I’m sharing my experience with two popular WordPress SEO plugins: The SEO Framework and Yoast SEO. Providing some basic information and comparison. Disclaimer: I’m no SEO guru, ninja etc, all the information provided here is based on my knowledge and experience. Any additions and/or corrections are welcome.
Update 28th February 2020: authors of The SEO Framework plugin had some constructive and argumented objections to the testing methods I’ve used. So now I’m testing a new method of website performance testing. Until that is finished, I suggest taking my test results with a grain of salt and testing with your own website to see which plugin works best for you.
Update 1st March 2020: I have re-done the tests using a more precise testing method and showed them in the last, 7th chapter, along with a revised conclusion. Leaving the original test results as a reminder of my own mistake (and stupidity) – as explained in the last chapter. But will cross over the stuff I no longer consider relevant in the published existing test results and conclusions.

Contents:

  1. What are WordPress SEO plugins?
  2. Yoast SEO plugin
  3. Moving from Yoast SEO to The SEO Framework
  4. Comparing Yoast SEO and The SEO Framework
  5. Rankmath and other SEO plugin alternatives
  6. Conclusion and my opinion
  7. More precise measurement and conclusion revision
    7.1. Test results
    7.2. Revised conclusion


1. What are WordPress SEO plugins?

In separate posts I explained what is SEO, as well as what is domain authority and backlinks. In short: SEO is marking website contents so that search engines can more easily figure out what exactly is on the website (content of each page, each image, website structure etc.). People often don’t use this term properly and mistify it – which boils down to “SEO magic that makes websites rank high in search results”. The truth is that properly done SEO helps a website rank according to its content quality – and not worse. That is, SEO can’t “boost a website”, the best you can do is not mess it up. This is similar to sorting books on a shelf for easy finding. There’s no magic there, but if you don’t sort by authors, then by book titles, finding a desired book can be troublesome.

What are then WordPress SEO plugins? They are plugins that help you add image meta descriptions, sitemaps etc. (for details see the above linked post).

Still, when it comes to SEO plugins, I’ve read and heard a lot, even from experienced developers, how “plugin ABC does better SEO than plugin XYZ”.


2. Yoast SEO plugin

This is the first SEO plugin I’ve used since I’ve started using WordPress, in 2015, for my cycling website.

Yoast company has been long on the market. They regularly follow the news on the scene – any Google, Google AMP, WordPress, schema.org etc. changes, implementing them in their SEO plugin.

The plugin does the job – I haven’t noticed any pages (and/or images) not being marked properly. User interface is nice, with all the options explained, allowing easy tagging of all the content. It works great in the free version. The main objection I hear about Yoast SEO is that is “bloated with options”. Unused options can be disabled, so they don’t bother you in the backend.

Yoast SEO plugin configuration options
Yoast SEO plugin configuration options
Picture 1

Another nice feature is that it allows visual display of website navigation breadcrumbs. Like:
Home » WordPress » Plugins

Code example for displaying breadcrumbs with GeneratePress child theme (used on this website), added in functions.php:

// BEGIN Yoast SEO breadcrumbs

add_action( 'generate_before_content', 'dev_add_yoast_breadcrumbs' );
function dev_add_yoast_breadcrumbs() {
    if ( function_exists('yoast_breadcrumb') ) {
        yoast_breadcrumb( '<p id="breadcrumbs">','</p>' );
    }
}

// END Yoast SEO breadcrumbs

As you can see, Yoast SEO does all I need – quite well. Still, I heard and read a lot of praises on how The SEO Framewrok is better optimized and written and how Yoast is bloated, so decided to try something new:


3. Moving from Yoast SEO to The SEO Framework

Since I didn’t want to manually re-write all the meta, alt tags etc, I was looking for an automated option of moving all this from Yoast to SEO Framework compatible format. The solution was the following:

Exporting data from Yoast to The SEO Framework using SEO Data Transporter
Exporting data from Yoast to The SEO Framework using SEO Data Transporter
Picture 2


It remains to disable and delete Yoast SEO plugin, so there are no conflicts. The following data was transferred:

  • Meta titles;
  • Meta descriptions;
  • Robots meta settings, like “noindex”, “nofollow”, and “noarchive”;
  • Custom canonical URLs;
  • Custom redirect URLs.

More detailed info is given in The SEO Framework migration documentation. Basically, there are things to check and edit manually, but most of the data is transferred automatically.


4. Comparing Yoast SEO and The SEO Framework

The first impression of The SEO Framework user interface: it is different. So you will have to take some time and explore it, get used to it. Yoast has nicer explanations of each option, along with a hyperlink to their, excellent, knowledge base. With The SEO Framework, it is not as “novice friendly”. Fortunately, most options are properly set by default.

However, this can be overcome, by some learning, exploring and testing. What I was most interested in was performance benefits, since both plugins allow you to tag all the content properly. Each in their own way, but the result is (as far as I could check) pretty much the same. So is The SEO Framework “faster”? Based on my test results – no. You can see for yourself (I did several tests to confirm, but won’t list all the test results since the listed ones show the average relation):
Update: see the test results re-done using a more precise website speed testing method, in the 7th chapter.

I like to say that one good measurement is often better than a 1000 expert opinions.

Another complaint I have about The SEO Framework is that it requires an additional plugin if you wish to show breadcrumbs in your website navigation. The solution for this is using Breadcrumb NavXT plugin, with this code added to the child theme functions.php:

// breadcrumbs Breadcrumb NavXT

add_action( 'generate_before_content', function() {
    ?>
        <div class="breadcrumbs" typeof="BreadcrumbList" vocab="http://schema.org/">
            <?php if(function_exists('bcn_display'))
            {
                bcn_display();
            }?>
        </div>
    <?php
} );

// end breadcrumbs Breadcrumb NavXT


A plugin free solution with a bit more of customizable custom code is this:

/*=============================================
                BEGIN BREADCRUMBS
=============================================*/
//  to include in functions.php
function the_breadcrumb()
{

	$lg_home_name ="Home";
	$lg_archive_by_category = "";
    $lg_search_results_for = "Search:";
    $lg_posts_tagged = "Keyword:";
    $lg_articles_posted_by  = "Author:";


    $showOnHome = 0; // 1 - show breadcrumbs on the homepage, 0 - don't show
    $delimiter = '&raquo;'; // delimiter between crumbs
    //$home = 'Home'; // text for the 'Home' link
    $home = $lg_home_name; // text for the 'Home' link
    $showCurrent = 1; // 1 - show current post/page title in breadcrumbs, 0 - don't show
    $before = '<span class="current">'; // tag before the current crumb
    $after = '</span>'; // tag after the current crumb

    global $post;
    $homeLink = get_bloginfo('url');
    if (is_home() || is_front_page()) {
        if ($showOnHome == 1) {
            echo '<div id="crumbs"><a href="' . $homeLink . '">' . $home . '</a></div>';
        }
    } else {
        echo '<div id="crumbs"><a href="' . $homeLink . '">' . $home . '</a> ' . $delimiter . ' ';
        if (is_category()) {
            $thisCat = get_category(get_query_var('cat'), false);
            if ($thisCat->parent != 0) {
                echo get_category_parents($thisCat->parent, true, ' ' . $delimiter . ' ');
            }
            //echo $before . 'Archive by category "' . single_cat_title('', false) . '"' . $after;           
            echo $before .$lg_archive_by_category. ' ' . single_cat_title('', false) . '' . $after;

        } elseif (is_search()) {
            //echo $before . 'Search results for "' . get_search_query() . '"' . $after;
            echo $before  .$lg_search_results_for.' "' . get_search_query() . '"' . $after;
        } elseif (is_day()) {
            echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
            echo '<a href="' . get_month_link(get_the_time('Y'), get_the_time('m')) . '">' . get_the_time('F') . '</a> ' . $delimiter . ' ';
            echo $before . get_the_time('d') . $after;
        } elseif (is_month()) {
            echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
            echo $before . get_the_time('F') . $after;
        } elseif (is_year()) {
            echo $before . get_the_time('Y') . $after;
        } elseif (is_single() && !is_attachment()) {
            if (get_post_type() != 'post') {
                $post_type = get_post_type_object(get_post_type());
                $slug = $post_type->rewrite;
                echo '<a href="' . $homeLink . '/' . $slug['slug'] . '/">' . $post_type->labels->singular_name . '</a>';
                if ($showCurrent == 1) {
                    echo ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
                }
            } else {
                $cat = get_the_category();
                $cat = $cat[0];
                $cats = get_category_parents($cat, true, ' ' . $delimiter . ' ');
                if ($showCurrent == 0) {
                    $cats = preg_replace("#^(.+)\s$delimiter\s$#", "$1", $cats);
                }
                echo $cats;
                if ($showCurrent == 1) {
                    echo $before . get_the_title() . $after;
                }
            }
        } elseif (!is_single() && !is_page() && get_post_type() != 'post' && !is_404()) {
            $post_type = get_post_type_object(get_post_type());
            echo $before . $post_type->labels->singular_name . $after;
        } elseif (is_attachment()) {
            $parent = get_post($post->post_parent);
            $cat = get_the_category($parent->ID);
            $cat = $cat[0];
            echo get_category_parents($cat, true, ' ' . $delimiter . ' ');
            echo '<a href="' . get_permalink($parent) . '">' . $parent->post_title . '</a>';
            if ($showCurrent == 1) {
                echo ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
            }
        } elseif (is_page() && !$post->post_parent) {
            if ($showCurrent == 1) {
                echo $before . get_the_title() . $after;
            }
        } elseif (is_page() && $post->post_parent) {
            $parent_id  = $post->post_parent;
            $breadcrumbs = array();
            while ($parent_id) {
                $page = get_page($parent_id);
                $breadcrumbs[] = '<a href="' . get_permalink($page->ID) . '">' . get_the_title($page->ID) . '</a>';
                $parent_id  = $page->post_parent;
            }
            $breadcrumbs = array_reverse($breadcrumbs);
            for ($i = 0; $i < count($breadcrumbs); $i++) {
                echo $breadcrumbs[$i];
                if ($i != count($breadcrumbs)-1) {
                    echo ' ' . $delimiter . ' ';
                }
            }
            if ($showCurrent == 1) {
                echo ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
            }
        } elseif (is_tag()) {
            //echo $before . 'Posts tagged "' . single_tag_title('', false) . '"' . $after;
			echo $before . $lg_posts_tagged .' "' . single_tag_title('', false) . '"' . $after;
        } elseif (is_author()) {
            global $author;
            $userdata = get_userdata($author);
            //echo $before . 'Articles posted by ' . $userdata->display_name . $after;
            echo $before . $lg_articles_posted_by.' ' . $userdata->display_name . $after;
        } elseif (is_404()) {
            echo $before . 'Error 404' . $after;
        }
        if (get_query_var('paged')) {
            if (is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author()) {
                echo ' (';
            }
            echo __('Page') . ' ' . get_query_var('paged');
            if (is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author()) {
                echo ')';
            }
        }
        echo '</div>';
    }
}

add_action( 'generate_before_content', 'tabela_zaglavlje' );
function tabela_zaglavlje(){
  if (function_exists('the_breadcrumb')){
  the_breadcrumb();
  echo "<hr style='margin:10px 0 20px 0;'>";
  }
}


/*=============================================
                END BREADCRUMBS
=============================================*/

Constructive discussion on Reddit about The SEO Framework vs Rank Math – with The SEO Framework developer taking part – and myself.

Note on the breadcrumbs – on the plugin’s support forum, the author explained his logic behind holding off the display breadcrumbs option – it makes sense as far as I’m concerned. The support topic: About the “Breadcrumbs”.


5. Rankmath and other SEO plugin alternatives

Rank Math is a SEO plugin that has been getting lots of praises recently. Being very systematic and analytical, I have researched a bit before deciding whether to give this plugin a test. I found some links – recommend you read them and then decide wether this plugin is worth the time:

Another popular and highly praised SEO plugin (without such ugly info on-line as Rank Math) is All In One SEO. When I was starting with WordPress and considering a SEO plugin (2015), this one offered a lot less functions in the free version, compared to Yoast SEO free version. I haven’t checked, nor compared them in the mean time.

There are of course lots of other options. I’m sure that for different people and different websites, there will be different choices. It is best to check, ask around, then test before deciding.


6. Conclusion and my opinion

Yoast SEO is far from a perfect plugin. In the past, there have been problems after some updates. For example, a problem with the above noted breadcrumbs. I didn’t get any useful help from the developers, but the problem mysteriously disappeared from the Google Search console, after a while. By the moment of writing this text, I haven’t figured out what had happened and how it was solved. For the other Yoast blunder, see the revised conclusion in chapter 7.2.

Yet, most plugins have had some problems with updates – at one time, or another. Also, no plugin is perfect. The SEO Framework, based on my tests, is not faster. And it lacks breadcrumb navigation functionality, requiring an extra plugin just for that – further complicating things and slowing the site down (with each additional plugin).

I wasn’t expecting this. Based on all the praises, I had expected to see a performance boost and then move all my websites to The SEO Framework. Even without the breadcrumbs in navigation. 🙂 The way things are for now, I’m sticking with Yoast SEO.

Update 28th February 2020: in the mean time, I have decided to give The SEO Framework another chance on a new website. Also, I’ve decided to run another, more thorough performance comparison test – will update with the results once it’s done.
Update 1st March 2020: see the test results made using a more precise testing method in the next chapter:
Update 1st May 2020: do read the revised conclusion in chapter 7.2.


7. More precise measurement and conclusion revision

You can skip this part and go straight to test results, in chapter 7.1. Writing this for clarification and my own piece of mind. Alas, after the original tests were done, I had shared the results in a Reddit discussion on SEO plugins. There, the authors of The SEO Framework plugin joined discussion and noted objections concerning the (im)precision of the used testing method. Patiently and with good arguments pointing out the method’s flaws. So I revised a different method of website testing. The linked page explains it in detail. In short: it is not perfect, but it is the best I can do with my knowledge and the means at my disposal. I have measured the error (imprecision) of that method, so that can be taken into account when analyzing test results (with GTmetrix it’s 7%, or/and 0.05 seconds in page load time, while with Octoperf load tests it’s 14%, or 0.1 second).

I don’t like injustice and, as the test results below will show, the original tests were unjust towards the authors of The SEO Framework plugin, plus, just as bad – led both myself and anyone reading my tests to a wrong conclusion.

In the above linked Reddit discussions, it was implied that I might have been paid by Yoast for the test (the term used was “Astroturfing” – had to Google that one). Likewise, after this revision, I suppose some might conclude that the authors of The SEO Framework have somehow paid, or blackmailed me, or whatnot. I can only say, and it’s up to the reader to believe me, or not: until the moment of publishing this revision, my only contact with the above noted authors has been over the above linked (educational & constructive) Reddit discussion. My main goal was to see what works best for my websites and use that.

I would add that the authors have obviously created a good quality product and I’m sure were not very happy to see an “objective” test that shows incorrect results. However, they had politely and patiently pointed out the flaws in my testing methods, without any harsh words, or flaming – which shows professionalism and maturity, if nothing else. Here I offer them my sincere apologies, I had really done the original test, just like these revised one, to the best of my ability, in order to figure out what’s best. Local saying is that: a mean learns for as long as he lives (and still dies stupid).


7.1. Test results

Here are GTmetrix page load speed tests, and Octoperf test of performance under load (explanation of the used test method). Test site 1 (TS1) used Yoast, while Test site 2 (TS2) used The SEO Framework.

Yoast vs The SEO Framework GTmetrix speed test results
Yoast vs The SEO Framework GTmetrix speed test results
Picture 3


The results show The SEO Framework (TS2) to be faster. Even if taking any measurement errors into account, I would definitely conclude that Yoast isn’t faster – my original test results weren’t accurate, apparently.

Yoast vs The SEO Framework Octoperf load test results
Yoast vs The SEO Framework Octoperf load test results
Picture 4


Octoperf load tests show minimal differences, within the testing method’s margin of error. Again: I would not say that Yoast is faster. For anyone interested, here are detailed Octoperf test results in .pdf format:


7.2. Revised conclusion

The SEO Framework is a good quality plugin. If breadcrumbs shown in navigation are not important to you, it is definitely worth giving it a shot (since, for now, it still requires installing additional plugin if you wish to show breadcrumbs to visitors). To me, personally, Yoast backend is still simple and easy to use, once configured (with nice explanations and links to a very good knowledge base – must give them that).

I didn’t test and compare The SEO Framework with an added plugin for displaying breadcrumbs in navigation. I’d love to see the option enabled directly within The SEO Framework plugin, without it getting bloated with needless extra options (which is the main objection to Yoast from what I could gather). For now I have installed The SEO Framework on a new website, while the existing ones are till using Yoast. With new websites, that don’t require all the tags and taxonomies migration and checking, especially if breadcrumb navigation display isn’t important, The SEO Framework is definitely a good, if not even a better option than Yoast (though, again, I wouldn’t call Yoast bad, in spite of all the complaints how “bloated” it is – at least when it comes to my intended use).

Update 1st May 2020: Update to Yoast version 14 created some problems. Problems that haven’t been resolved after 4 patches published after the initial version 14. On my websites, the problem manifested itself by error_log file growing to 5 GB in size, in well under 24 hours, with various Yoast related errors noted inside. This is my problem report on Yoast SEO support forum.

The problem occured on websites that have visits, while test sites without many visits didn’t show those problems.

From what I could gather, many people are having problems with the new Yoast version. While Yoast developers had made a bombastic announcement for the version 14, claiming it could even “provide a speed boost of 5-10%”. Then, after many problem reports, they did admit to having screwed up a bit, but still claim it’s very good, especially after the latest patch (newer Yoast announcement concerning the bugs). My experience is that it is still not working without errors, so I had used backups to revert websites to before the Yoast update.

On their support forum, a user suggested they roll back to the last stable version, as the new one is creating too many problems for many people. To which Yoast developers replied that “this is not a problem that affects even 5% of our users”. I haven’t got the exact stats, but judging by my “unofficial” communication with some hosting providers and developers, the problems are widespread and serious.

My conclusion, judging by the way things are now:

  • Yoast made a mistake.
  • They are dismissing it, instead of owning it and properly fixing it.
  • Which plays into the hands of The SEO Framework – I had never considered switching off from Yoast more seriously.

Here’s a Reddit discussion on the new Yoast SEO version and indexables. The SEO Framework developers gave their opinion. What I couldn’t find is the answer of Yoast developers on what exactly the new version does and how. I also can’t find any comparative speed tests of the old and the, allegedly “5 to 10% faster” new Yoast version with indexables. I’ll wait a few more weeks to see if they’ve patched all the bugs, then run a comparison test, using my own website speed testing method.

Share...

6 thoughts on “The SEO Framework vs Yoast SEO”

    • That’s good – you could make your own test and comparison and share it – either here, or on your own website (one not excluding the other). 🙂

      So far I’ve only tested The SEO Framework with one test website. Judging by the number of praises, it surely deserves more thorough testing I think.

    • Heads up – for objectivity sake, along with my apologies for publishing incorrect data and any inconvenience caused by it:
      I’ve revised and improved/corrected my testing methods – and re-done the tests.
      It turns out The SEO Framework is definitely not slower than Yoast, the original test results were not accurate enough, for reasons explained here:
      https://io.bikegremlin.com/15268/website-testing-methods/

  1. SEO Framework or SEO Press are the only decent ones anymore.

    Yoast = spam, bloat, many errors
    Rank Math = spyware, bloat, many bugs
    All In One SEO = bloat, bad UI, messy code (and soon to be plastered with spam from the new owner?)

    WordPress will have built-in sitemap feature soon, really you only need SEO plugins now to optimize your titles and your description and really that’s the only reason… there are Meta and Schema plugins that do these things without all the other SEO bloat and stuff already, often blogs forget about that suggestion…….

    Reply
  2. Hi Relja,

    I commend you for updating the results, with pure enthusiasm, and showing the real professional ability of an open and competent mind. Your updated testing results reflect what we’ve found.

    Thank you once again. Feel free to reach out to us at any time for suggestions, questions, or bug reports.

    Have a beautiful day!

    Reply
    • Thank you, again, for taking the time and having the patience to explain the imperfections of the “old” testing method. I really appreciate any constructive criticism (more than praise), because it helps me learn and improve. After having run initial tests comparing the two testing methods, I had realized that the first test did an injustice and wasn’t fair leaving it like that.

      Most other tests I did were given longer time, so a relatively large number of Google Analytics results was included as an additional data, to point out any potential inconsistencies. However, I wanted to have a way of testing and getting results faster. This “revised” method is as precise as I can manage – at least for now.

Leave a Reply to Gram Cancel reply

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.