There is some bad advice going around regarding updating URLs in the WordPress database when migrating your WordPress site from HTTP to HTTPS. There are tons of examples of MySQL queries that do a “find and replace” of the URLs in your WordPress database, and they’ll change the URLs from HTTP to HTTPS. The bad advice that I’m referring to is when people suggest that you update the GUID
URLs.
The URLs in the GUID
column of the wp_posts
table should NOT be changed when moving your site from HTTP to HTTPS (see this from WordPress.org).
Yet, many articles out there are offering a list of queries to update the URLs in your WordPress database, and they have this bad line:
(DO NOT RUN THIS LINE:)
UPDATE wp_posts SET guid = replace(guid, 'http://www.yoursite.com','https://www.yoursite.com');
Also, never run a “find and replace” MySQL query that affects the entire wp_posts
table of the WordPress database because that would update the GUID
URLs.
Here is my list of MySQL queries to safely change the URLs in your WordPress database from HTTP to HTTPS.
Prerequisite: Change all instances of www.yoursite.com
to your own. If you didn’t have the www
as part of your WordPress Address (URL) in the WordPress Settings, then leave out the www
here. For example, some people just use http://yoursite.com
, without the www
. Also, if you have a custom table prefix in the WordPress database, something other than the default wp_
, then you must change all the instances of wp_
to your own table prefix.
My list of MySQL queries is organized into eight steps:
- Update any embedded attachments/images that use http.
This one updates the
src
attributes that use double quotes:UPDATE `wp_posts` SET post_content = REPLACE(post_content, 'src="http://www.yoursite.com', 'src="https://www.yoursite.com') WHERE post_content LIKE '%src="http://www.yoursite.com%';
This one takes care of any
src
attributes that use single quotes:UPDATE `wp_posts` SET post_content = REPLACE(post_content, "src='http://www.yoursite.com", "src='https://www.yoursite.com") WHERE post_content LIKE "%src='http://www.yoursite.com%";
- Update any hard-coded URLs for links. This one updates the URL for
href
attributes that use double quotes:UPDATE `wp_posts` SET post_content = REPLACE(post_content, 'href="http://www.yoursite.com', 'href="https://www.yoursite.com') WHERE post_content LIKE '%href="http://www.yoursite.com%';
This one updates the URL for
href
attributes that use single quotes:UPDATE `wp_posts` SET post_content = REPLACE(post_content, "href='http://www.yoursite.com", "href='https://www.yoursite.com") WHERE post_content LIKE "%href='http://www.yoursite.com%";
- Update any “pinged” links:
UPDATE `wp_posts` SET pinged = REPLACE(pinged, 'http://www.yoursite.com', 'https://www.yoursite.com') WHERE pinged LIKE '%http://www.yoursite.com%';
- This step is just a confirmation step to make sure that there are no remaining http URLs for your site in the
wp_posts
table, except the GUID URLs.You must replace
WP_DB_NAME
, near the beginning of the query, with the name of your database.This will confirm that nowhere in the
wp_posts
table is there a remaining http URL, outside of theGUID
column. This ignores URLs in theGUID
column.This query only searches; it does not replace anything, nor make any changes. So, this is safe to run. It’s a safe and quick way to check the
wp_posts
table while ignoring theguid
column.This SQL query should return an empty set. That would mean that it found no http URLs for your site. (This is all just 1 query. It’s 1 very, very long line.)
Remember to replace
WP_DB_NAME
, near the beginning of the query, with the name of your database.SELECT * FROM `WP_DB_NAME`.`wp_posts` WHERE (CONVERT(`ID` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_author` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_date` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_date_gmt` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_content` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_title` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_excerpt` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_status` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`comment_status` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`ping_status` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_password` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_name` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`to_ping` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`pinged` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_modified` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_modified_gmt` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_content_filtered` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_parent` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`menu_order` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_type` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`post_mime_type` USING utf8) LIKE '%%http://www.yoursite.com%%' OR CONVERT(`comment_count` USING utf8) LIKE '%%http://www.yoursite.com%%');
- Now, we move to the
wp_comments
table. This changes any comment author URLs that point to the http version of your site. This is in case you’ve ever replied to a comment while your URL was pointing to http.UPDATE `wp_comments` SET comment_author_url = REPLACE(comment_author_url, 'http://www.yoursite.com', 'https://www.yoursite.com') WHERE comment_author_url LIKE '%http://www.yoursite.com%';
- This updates the content of the comments on your site. If there are any links in the comments that are linking to an http URL on your site, they will be updated to https.
UPDATE `wp_comments` SET comment_content = REPLACE(comment_content, 'http://www.yoursite.com', 'https://www.yoursite.com') WHERE comment_content LIKE '%http://www.yoursite.com%';
- Now we move to the
wp_postmeta
table. This takes care of any custom post meta that points to the http version of your site.UPDATE `wp_postmeta` SET `meta_value` = REPLACE(meta_value, 'http://www.yoursite.com', 'https://www.yoursite.com') WHERE meta_value LIKE '%http://www.yoursite.com%';
- Now we move to the
wp_options
table. Update the “WordPress Address (URL)” and “Site Address (URL).” You can simply change these in the WordPress dashboard –> Settings page, rather than with these queries. You can just go to the Settings page and change both of these fields so that they start with https.But, here are the queries if you prefer to do it this way.
For the WordPress Address URL, you may have to modify
www.yoursite.com
. If you have WordPress installed in some other directory, then modify this according to your own WordPress URL. For example, some people have WordPress installed in a subdirectory named “blog” and so their WordPress Address would behttps://www.yoursite.com/blog
.UPDATE `wp_options` SET `option_value` = "https://www.yoursite.com" WHERE `wp_options`.`option_name` = 'siteurl';
This one will update the Site Address URL (this is the home page of your site):
UPDATE `wp_options` SET `option_value` = "https://www.yoursite.com" WHERE `wp_options`.`option_name` = 'home';
Andrea
February 7th, 2017 at 10:41 am
Excellent article, i’ve tried your queries and all works ok.
Thanks for this work.
Isabel
February 10th, 2017 at 2:34 pm
Thank you.
Craig Ramsay
April 20th, 2017 at 5:42 am
Great post Isabel and thanks for the advice on the GUID field.
One other table I updated was the wp_term_taxonomy -> description column. This can contain category descriptions and html can be used so they can also contain hardcoded urls. I’ve added some sample code.
jaydev
October 5th, 2017 at 7:19 am
Thank,
Its save my time…
Chad Musgrove
February 4th, 2018 at 3:22 pm
THANK YOU A MILLION TIMES OVER!!!! Perfect set of Queries that make the switch a piece of cake.
Stephen
February 13th, 2018 at 11:34 am
Thank you, this was a real life saver. I wish WordPress wouldn’t hard code all the URL’s in the database, makes it a right pain to switch from http to https but your article came to the rescue 🙂
Stefano
March 5th, 2018 at 12:26 pm
Hi Isabel,
Why don’t you make a plug-in for this?
EHBRTO
March 12th, 2018 at 4:31 pm
Hi,
there’s currently a plugin for doing that:
https://wordpress.org/plugins/wp-migrate-db/
You can untick “Replace GUIDs” under “Advanced options” and that’s it.
Anyway as far as I understand GUIDs doesn’t have to be changed to avoid feedreaders to display the same content to user’s reader again as it is fresh content. So it is not a big deal with small sites or sites that has never been live. Am I right?
Cheers,
Stefano
March 12th, 2018 at 5:24 pm
Hi,
It would be interesting to cover also major plug-in such as Yoast, do we need to convert Yoast table aswell?
EHBRTO
March 24th, 2018 at 1:14 pm
Hi,
as par my experience, the replacement is done over all the tables in the DB.
Kind regards,
Aeryn Lynne
March 6th, 2018 at 8:41 am
Thanks for the code! I really appreciate it. Particularly the GUID warning – I never knew that was an issue for RSS feeds.
I’m just wondering, to get all links compliant if you happen to mention other websites in your post_content, if there’s no harm in just taking out “http”?
So instead of searching for the full URL ‘http://www.yoursite.com’, search for ‘http:’ instead, and replace it with ” (blank), leaving ‘//www.yoursite.com’ in its place.
That way, you’re searching out all URLs in post_content, and if the site you’re linking to doesn’t have https configured yet, it will still go to their http version without a not-secure warning stopping the exit link from happening.
So I used…
…and it seems to have handled everything okay with the one query for wp_posts > post_content (links, images, etc.)
Kristian Svensson
May 10th, 2018 at 11:41 am
This was exactly what I was looking for! I tried it on my website and it worked perfect. No SQL errors 🙂
Thank you Isabel!!!
james
August 26th, 2018 at 10:20 pm
Hi, thanks for this. However, I was unable to run 1.2 and 2.2 (regarding the single quotes). I got the following error each time..
#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘http://www.yoursite.com%’ AND (post_content REPLACE(post_content, ‘href=” at line 1
Isabel
August 27th, 2018 at 4:01 pm
Thanks for pointing that out. I just updated those 2 to fix the quotes. It should work now.
Chris
September 1st, 2018 at 12:39 pm
Thank you for this. Worked great.
atom
September 25th, 2018 at 11:32 am
wouldn’t the proper way be to replace ‘http://’ with ‘//’? – this lets the browser decide what to do
i’m getting ready to do this on my site and would appreciate any advice regarding ‘//’ and if the tutorial above would still be valid
Cay Lundén
October 17th, 2018 at 2:03 pm
Isabel, thank you for making this information available. It is much appreciated.
I have a multisite that has to do the change to https. And in point 8 you say that the change can be done in the WordPress dashboard –> Settings page, rather than with the queries. Which is true for an ordinary WP-site.
However, I notice that it is impossible to do any changes of the main address in the settings on the main web-page for the multisite network. Which I have been told to change.
What might lock this? Are there even other parameters in a multisite to consider in order to make the change in the settings of the main site? Or maybe in the DB?
Fajo
October 27th, 2018 at 11:55 pm
It works 🙂 Thank you!
Mia
December 4th, 2018 at 10:27 am
Hello, thank you for your help. But I would like to know that I can’t update any “Pinged link”. It has the error when I just copy and paste your code.
mark
December 14th, 2018 at 7:50 pm
Hey Isabel.
Really appreciate the details and explanation on the GUID, as you said everyone is saying “just replace the GUID entries” too.
I am on WP 4.9.8 and the commands all run great to step 4, step 1 changed 124 rows but when i run step 4 it shows that the post_content table data still has over 100 items that cannot be altered by the SQL commands it seems. There is a plugin that sees the changes but i prefer to do this manually so i can track changes.
The row field data that the script is not finding looks like this (the data domain has been altered for the example):
[et_pb_section bb_built=”1″ admin_label=”Header” bg_img_1=”http://mydomain.space/wp-content/uploads/2018/11/political-candidate-25.png” background_size_1…
I am using the Divi theme which is the [et] stuff you see you see. I cannot trace why the stuff inside the Divi blocks is being ignored as it seems to change the http to https without issue.
The above issue is only hanging around in the post_content table field.
Hope that makes sense. I will continue to look but thanks for any feedback you can offer.
Isabel
December 18th, 2018 at 10:26 am
My queries only change the URLs for images that are embedded with an HTML image tag, so it looks for the
src
attribute:src="http://mydomain..."
It doesn’t find your image URL because your shortcode sets the image with a
bg_img_1
attribute, like this:bg_img_1="http://mydomain..."
This SQL query should work for you:
Mark
December 18th, 2018 at 4:25 pm
Hey Isabel
Thanks so much for sharing more of your expertise, this i did find a workaround but i will use this on my next migration for sure…it makes total sense.
Appreciate so much your help.
Thanks
Mark
Affy
April 24th, 2019 at 9:58 am
Hey Isabel,
Very helpful article
During my migration in image tag i found there is srcset along with src e.g.
We might want to run queries for srcset as well?
M Gravlee
September 24th, 2019 at 10:52 am
Fantastic! Worked perfectly. Thank you for sharing your knowlege.
Dan
November 16th, 2019 at 8:39 pm
Thank you!
ernesto
November 20th, 2019 at 11:05 am
Hi,
You should add the “mp4” attribute to replace the url of the path of the videos imported in posts or pages.
Stanislav
November 27th, 2019 at 2:56 pm
Excellent! Thanks for your work!
Frederick Linsmeyer
March 29th, 2020 at 10:41 pm
Hi Isabel,
Thank you so much for this code. Very helpful!