Safe to say this build is progressing pretty fast thanks to sheets & WP.
A custom build like this would normally take quite a bit longer! And that would be on data configuration alone.
Being able to format stuff and quickly make mods in G-sheets makes things sooooo much easier.
If you haven’t read the other parts, you can find part 1 of the WordPress Programmatic SEO build and then work your way up to this one.
Let’s continue.
Linking widget tables
A few of the pages are starting to get some serious link counts, particularly the category pages.
Yeap, a few links.
Definitely a few more than what a normal comma list would contain.
But, we need these links here. We can’t just strip them from the page.
A standard programmatic implementation, particularly in the early phases, is an amazing-looking table.
One of those linking widgets that could have 10 or 100 links in. They work though, so don’t talk negatively about them!
I figure we can look at the link count, and if it’s above say, 10, we swap it out for a pretty table instead.
I grabbed some default HTML table code from here and slapped it into one of the category pages to test it.
Boom. Table.
I’m not counting this copypasta as code. If it was, then HTML links are code too yeah?
Updated the data to some sample data and some links to see what it’d look like, and threw in a centring style, and it isn’t too bad at all.
Since there will be quite a few links though, there’s a bit too much padding.
Fixed.
Now we need to work out how to actually get this going in the Google sheet.
We have a comma separate list of links that we currently use in the page, but how can we turn this into a table.
We need some way to split that list up into groups of 3 for a 3-column table.
I got stuck here for a bit, but then did some Googling and came across this magical formula.
We can just replace every 3rd comma with the row code (<tr>), and then every other comma with the table column code (<td>).
After more tweaks than I care to admit, I pieced together the below;
We start by including the table opening code, then the comma separated that breaks up with every 3rd comma being swapped for the </tr><tr> portion of the table code.
Then we substitute the remaining commas with the <td style> code.
Then throw the table closing code on the end, and we’ve got ourselves a nice link widget.
Well, nice is debatable.
For those that might want it, the formula for a table from a comma-separated link list is;
=substitute(substitute( “<table style=””text-align: center””>
<tbody>
<tr><td style=””padding: 0px””>”®EXREPLACE( REGEXREPLACE(L2,”(\,.*?){3}”,”$0*”) ,”\,\*”,”</td>
</tr>
<tr>
<td style=””padding: 0px”” >”),”,”,”</td>
<td style=””padding: 0px”” >”),”<animal>”,A2)&”</td>
</tr>
</tbody>
</table>
*ignore my styling, and formatting, and well….. just anything I do that has code involved.
Throwing it into the site to test we can see it works. Works = nice.
Obviously quite a bit bigger than the comma list, so not 100% sure whether this could be better or not.
However, it gives us another option.
Adding a little extra code could give it a little expander option but that’s beyond what I’d want to do now so I’ll skip that.
Think I will just completely skip including this and just shelve the table code. Will keep it in the spreadsheet and maybe return it later.
If I was going to use it though, I’d be going to the content formula that includes the comma-separated list.
Then using a formula, I’d run a count formula that when the comma count is below say 10, the comma-separated link list could be used. If it was higher than 10 it would pull in the table links cell.
Scraping videos
To build out the content even more, we could embed some Youtube videos.
Ideally, you have your own set of videos to mix up the content.
I don’t.
I’m just going to scrape a heap of youtube videos and embed whatever video currently ranks for the combo keyword.
This used to actually work a treat to help a page rank, and I have seen some benefits recently on a few of my sites, however, this is purely to build out the example content and show you how to leverage it.
To do this, we’re going to come up with a heap of keywords to put into a rank tracker (serprobot). We’ll then export the top10 SERPs, remove everything not in the first place, and then remove any non-youtube links.
Anything left over will be included as a video in the pages.
I’ve loaded up a project in serprobot looking for ‘<combo> youtube video’ keywords.
After a few minutes, it’ll complete the rank check, and I’ll be able to export my SERPs report.
I’ll just insert two rows in the keyword column here so the keyword & URLs line up, and then substitute out “keyword” along with sort the list.
Sorting it by URL, we can then delete anything non-youtube, and then delete 2nd position onwards so we end up with a keyword | youtube list like this;
Strip out the ‘ youtube video’ part from the keyword, and we’re back to the combo name, then throw it back into Google sheets and we’ve got a list of 1,000 youtube URLs with their respective combo.
I’ve added a <youtube> into the content template where I’d like to throw the video in.
We now need to craft the youtube embed code, and get that into a column.
The code I’ll be using is this;
=”<p style=””text-align: center;””><iframe frameborder=””0″” scrolling=””no”” marginheight=””0″” marginwidth=””0″”width=””712″” height=””400″” type=””text/html”” src=”””&substitute( VLOOKUP(A2, Videos!A:B,2,0), “watch?v=”,”embed/” )&”?autoplay=0 &fs=0&iv_load_policy=3 &showinfo=0&rel=0 &cc_load_policy=0 &start=0 &end=0″”><div> </iframe></p>”
Which yes, will look crazy, but, it’s a standard Youtube embed code. This then has the vlookup inside it that goes off and grabs the combo’s youtube video, and then replaces the ‘watch?v=’ with /embed/ so that the embed works.
This then gets substituted out in the intro content section.
Re-uploading the data and we get…
Fancy videos!
Well, kind of fancy. Whatever Google ranked for the keyword, that’s what gets included.
Some are better than others.
Homepage update
The homepage is still looking a little sad with just a short list of posts.
We need to get this updated with some content.
Possibly links out to the animals with a pretty picture, and a heap of text-centric content to pad it out a bit.
I’d love to set up a bannerbear template for this, and be able to generate a text-over-image thumbnail for each category.
That’s pretty and ideal though, so let’s just go with the functional solution for now.
Also probably don’t need to try and think programmatically about the homepage…. can try something a bit manual.
Bit of text, and some chonky links added in.
Much better.
Well, somewhat better at least anyway.
I LIKE IT ALRIGHT.
Additional content sections
Another big part of a programmatic SEO builds’ content is what is essentially content re-use.
This content re-use primarily occurs on search result/aggregation type pages, where you list out and link to the listings/specific content.
Where these links are included, portions of the content are also included, and that pads out the content on these aggregation pages.
You’ll also find this type of content on sites like G2 & Capterra. Each software has its own page, but then they take a chunk of that text and list it out on the ‘best software for x’ type pages.
Think of this sort of content more like a big block of ignored text. It won’t penalise a page, but it might not add direct value when used alone. It needs to be combined with other elements, and is just used to support those other elements.
This build is a bit different, and not at such a scale. Our re-use chunks might be a bit over-used, when looking at the total percentage of pages with a piece of text.
Oh well though, it’s just a concept build anyway.
Let’s see what we can apply to the build!
Animal-based content paragraph
We’re going to write up a custom dynamic element for each animal, and try to feed in a food variable where we can, but more so focus purely on the animal itself.
Something like the general nutrition habits of the animal in question. Maybe what they normally eat, and what their bodies require.
I’ve leveraged OpenAI to come up with generic garbage about each animal;
I’ve then going to get this included in the combo page’s outputs by adding an <animalGeneric> into the conclusion content template, and then substituting it out.
Essentially just a pure little dupe content section, but mixed in with the rest of the content it shouldn’t be tooooo bad, we’ll see.
Might update it to add a dynamic element to it later, or split it into 2 sections and include them in separate parts of the page content.
Food-based content paragraph
We’re going to do a similar thing to what we did with the animals, and add a section purely about the food.
Probably about their nutrition value, but will really just use whatever OpenAI spits out for us.
Created a list of all the foods, ran them through OpenAI with a little prompt, and received a heap of text;
I should edit it, but nah. Let’s just roll with that. Might get an editor to just tweak it later.
Leveraging these additional sections
I’ll throw both of these new sections in the footer section of the combo pages.
They’ll get included in the content template as a variable, and will then be substituted in the content builder.
It will not include a templated content section, the generic section about the animal, the 4th image, and then a generic section about the food.
Two columns are then added into the content builder sheet.
These do a vlookup to the generic content templates sheet, with one matching the animal and one matching the food, and will return the text element if it exists.
They’re now added to the conclusion content section, with the substitutions in place.
Stripped pagination
Finally stripped out the pagination on the category pages, by editing the raw code of the theme.
This will probably get overridden when the theme updates, so I’ll need to get a child theme going, but I can sort that out later.
I tried to also strip out the post inclusion on archive pages, but the content still shows so I am not sure what’s up there.
Reduced the item count to 1 for archive pages though, which is the lowest it’ll go.
Just a single item is included now, with no pagination below it. Better than before so let’s go with that.
The intent behind this is to de-bloggify the site a bit, and to also ‘silo’ it a bit more by containing the links as much as possible.
We’ve got a decent internal linking setup within the content itself, so that is our core interlinking.
If we need more links, that’s where we will try and get them in.
Might even try fully silo it later too by cleaning up the templated header/sidebar links a bit.
Wrapping it up
We’ve now added some new content to each page, investigated an alternate table linking option, along with creating some shiny new pages.
On top of all this, I discovered a silly mistake in one of my linking codes.
I wasn’t substituting the space in multi-word animals & fruits, in the link codes and imagery names.
This led to 404 pages being crawlable, and a lack of imagery on heaps of pages due to an incorrect lookup.
Rookie mistake.
In the words of a wise man, DOH!
Taking a look at current performance though, we can see a few things.
Crawling is spiking, but a few days delayed so that spike is a week old now.
Google’s started indexing it all, slowly but surely.
16 in mobile usability report. I’ll go into why I look at this in a separate post at some point.
Impressions are starting to kick off now, because….
A heap of keywords are hitting the board. 35 pages with impressions in gsc. Decent little start.
Oh, and I added another 150 pages.
Stay tuned for Part 6, and see what we can do next.
Current Page Count: 320 pages
6 Replies to “Just Another WordPress Programmatic SEO Build – Part 5”
Were is part 6?
Coming soon….ish!
Incredible article! Look forward to part 6
Let me guess, there is no part 6 because Google already removed the pages? :(
Haha they’re still there but yeah it tanked. Only slowly grew though, few clicks a day. I did mention I wasn’t putting effort into the actual ranking of it, and was more just a fun project though! You’re welcome to throw some budget at links and see what happens if you want :)
Part 6 is still coming! Just been busy. I’ll make sure it’s a biggie.
This is great, regardless of if it tanked. Great job, Sam.