Top 9 SEO plugins for WordPress to optimize your site for search engines

WordPress is one of the most popular content management systems (CMS) out there, and for good reason. It’s easy to use, flexible, and can be customized in countless ways with plugins. For those who are serious about their website’s search engine optimization (SEO), there are several plugins that can help. Here are 9 of the best WordPress plugins for SEO

Yoast SEO
Let’s start with the king of WordPress SEO plugins: Yoast SEO. This plugin is a must-have for anyone who wants to optimize their content for search engines. It has a ton of features, including a content analysis tool that checks your posts for readability and SEO, an XML sitemap generator, and a snippet preview that shows you how your post will look in search results.

All in One SEO Pack
Don’t like Yoast SEO? No problem! All in One SEO Pack is a great alternative. It’s been around for almost as long as Yoast SEO, and it’s just as powerful. It has many of the same features, including a content analysis tool, an XML sitemap generator, and the ability to control your meta tags and titles.

Google XML Sitemaps
A sitemap is an important part of your website’s SEO. It tells search engines what pages are on your site, how they’re organized, and how often they’re updated. Google XML Sitemaps is a plugin that automatically generates a sitemap for you, making it easy for search engines to find and index your content.

Rank Math
Rank Math is a relatively new player in the WordPress SEO plugin game, but it’s already making waves. It has a ton of features, including a content analysis tool, a built-in 404 monitor, and the ability to control your schema markup.

Broken Link Checker
Broken links can hurt your website’s SEO by making it look less credible to search engines. Broken Link Checker is a plugin that checks your site for broken links and alerts you when it finds them. It’s a great way to keep your site healthy and functioning properly.

WP Smush (Smush – Lazy Load  Images, Optimize & Compress Images)
Images are important for your website’s SEO, but they can also slow your site down. WP Smush is a plugin that compresses your images without sacrificing quality, making your site faster and more SEO-friendly.

Jetpack – WP Security, Backup, Speed, & Growth
Jetpack is a plugin that does a lot of things, including helping with your site’s SEO. It has a built-in sitemap generator, the ability to control your meta tags and titles, and a content analysis tool.

WP Meta SEO is a plugin that helps you manage your website’s meta tags and titles. It also has a content analysis tool that checks your posts for SEO and readability.

Finally, Redirection is a plugin that helps you manage your site’s 301 redirects. 301 redirects are important for SEO because they tell search engines that a page has permanently moved to a new URL. Redirection makes it easy to manage your site’s redirects and keep your SEO healthy.

In conclusion, optimizing your WordPress site for search engines can be a daunting task, but these 9 plugins can make it a lot easier.

How to install wordpress on Docker with devilbox on Ubuntu on Windows WSL2

Simple guide for advanced users on how to easily install docker and devilbox then install wordpress. all on ubuntu/debian on windows subsystem for linux known as WSL. make sure it’s WSL2. Haven’t we reached peak technology?


First add docker key and repo, then create docker user & group and add your user to the group :

curl -fsSL | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] $(lsb_release -cs) stable"
sudo apt update && sudo apt install docker-ce docker-ce-cli

sudo groupadd docker && sudo usermod -aG docker $USER

newgrp docker

sudo service docker start

docker run hello-world

After starting docker and running hello-world . docker should tell you everything is fine.

then you need to install docker compose so you can run compose commands

Go to the page :
scroll down and find the link appropriate for your distro e.g. linux-x86_64. Right click and copy the link, then put between the quotations marks like below for version 2.6.0:

sudo curl -L "" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose


Then install the devil devilbox. It’s the devil son.👿

mkdir ~/dev/
cd ~/dev/
git clone

Get user id

id -u

and get your group id

id -g

copy the results to .env example after renaming to .env

cd devilbox
cp env-example .env
nano .env

Find these lines and change them accordingly. if you got 1001 for id -g then place that in NEW_GID


Compose it up:

docker-compose up

and you should be able to see the devil by going to localhost. If you get bunch of errors about couldn’t launch because port in use. Check which similar service is running on your computer and stop it. e.g. if you have installed nginx. stop nginx.

Now let’s add first website and install wordpress

cd data/www
mkdir wordpress
cd wordpress
git clone htdocs
mysql -u root -h -p -e 'CREATE DATABASE wordpress;'

No password necessary.

Edit hosts file for windows and add wordpress.loc (or the directory name you chose above plus .loc
You have to edit this as administrator. I use notepad++ so I open it in normal user make any edit click save and notepad++ will ask me if I want to open it again as administrator. I chose yes and make the actual edit and save:

Location of hosts file. Bill Gates knows why it is in drivers:

Devilbox virtual hosts

add at the end: wordpress.loc

Now go to wordpress.loc in your browser and you should be able to install it.

How to join tables to wordpress posts properly not in a hacky way?

In sum;

In function.php of your theme:

function my_theme_join_mytable_to_WPQuery($join) {
    global $wpdb;
    $join .= " LEFT JOIN {$wpdb->prefix}mytable ON $wpdb->posts.ID = {$wpdb->prefix}mytable.postid ";
    return $join;
add_filter('posts_join', 'my_theme_join_mytable_to_WPQuery');
Join tables

Jigsaw puzzle symbolizing joined tables © Ajv123ajv | Dreamstime Stock Photos


If you want to join tables in wordpress whether left join or inner to wordpress posts query. Say if you need to display some custom rating, game scores or any other data you want to associate with the table.  It’s more efficient to join the table to the posts database table using wordpress function hooks.  Rather than fetching your custom tables inside the template on the fly.

The benefit of using wordpress hooks and functions is not just efficiency. in using database queries. but also you can let other plugins you install like database caches or other processes to work with your custom tables without any extra steps.

You can use functions.php in your theme or your custom plugin to hook to the posts_join wordpress api.  you need to register table join hook filter with the following command:

add_filter(‘posts_join’, ‘my_theme_join_mytable_to_WPQuery’);

What this does, it tells wordpress to call your custom function my_theme_join_mytable_to_WPQuery  when building the posts fetching query. so every time a user views your site and sees the list of posts or search posts. the function will be called before querying the database.  The filter hook passes the join statement sent by user.

Then add a function with the custom name you’ve chosen earlier: my_theme_join_mytable_to_WPQuery

function my_theme_join_mytable_to_WPQuery($join) {


The join variable is a string that contains the join statements added by other filters or wordpress.  you need concatenate to it. as:

$join .= " LEFT JOIN MYTABLE ON = = MYTABLE.postid";

then you must return join back

return $join;

It’s better however to use wordpress table names and prefixes.  it’s possible the prefix of tables not wp_ or table names for wordpress change.  instead $wpdb->prefix to get the prefix  and $wpdb->posts to get wordpress post table (this includes the prefix).  I assume your custom table also has the same wordpress prefix as it should.

therefore your table becomes {$wpdb->prefix}mytable

You need to import the variable $wpdb from the global scope.  using global $wpdb.

Finally it would look like this:


function my_theme_join_mytable_to_WPQuery($join) {
    global $wpdb;
    $join .= " LEFT JOIN {$wpdb->prefix}mytable ON $wpdb->posts.ID = {$wpdb->prefix}mytable.postid ";
    return $join;
add_filter('posts_join', 'my_theme_join_mytable_to_WPQuery');

How to check if user is an admin in wordpress

The best way so far to check whether the current user is a super admin user with full permissions in wordpress is to use current_user_can function and check for manage_options . If user has manage_options they clearly have full permissions. I use this for example to hide ads from me and to hide google analytics so that it doesn’t count me while I’m logged in as admin.

google analytics code goes here