HTTP to HTTPS - Retain Facebook Likes and Share Count

If you have recently moved your blog from 'HTTP' to 'HTTPS', you would have noticed that your Facebook likes/share count is not automatically carried over.

So all your pages will have zero likes/shares. It's like going back to square one.

So what's the solution? How do you get back your facebook likes?

Well, there is a solution and it is pretty straight forward.

You need to add a 'OG URL' tag and point the tag to the 'HTTP' URL of your blog.

Example: Let's say the 'HTTPS' URL of a page is:

https://sitename.com/article-one/

The og:url tag for this page should look as follows:

<meta property='og:url' content='http://sitename.com/article-one/'>

As you would have noticed, the og:url tag has the 'HTTP' url of the page and not HTTPS.

What is the 'OG URL' Tag?

The OG URL (og:url) tag is a tag used by Facebook to grab the URL of a page. It credits links/share count to this URL. OG stands for Open Graph.

Chances are that if you have a SEO plugin (or a plugin that adds OG tags), then you already have this tag on your site.

To check if you have this tag, simply view the 'HTML source' of one of your blog posts. You can check the HTML source of a webpage by clicking the keys 'CTRL + U' (Command + U for mac) on your keyboard.

Once there, look within the <head> tags to find all your OG tags. Refer image below:

HTML source to check og tags

Steps for getting back FB Social Share Counts by changing the OG:URL tag to 'HTTP'

As mentioned earlier, most SEO plugins will add the OG:URL tag to your posts/pages. The issue is that the 'OG URL' tag will automatically point to the 'HTTPS' version of your webpage.

What we need to do is, point the og:url tag to the 'HTTP' version cause this is the version that has all our Facebook likes. For more information on this, read this documentation by Facebook: https://developers.facebook.com/docs/sharing/webmasters/crawler/

Once the og:url tag is changed, Facebook will re-attribute all like/share counts back to your posts/pages once it re-crawls your pages.

The re-crawling happens once every 30 days. You can also force Facebook to re-crawl your webpages.

Here are the steps to do this in detail:

Step 1: Change your og:url tag to output 'HTTP' version of the webpage. (We will see how to do this later in this article.)

Step 2: If you are using a Cache plugin (eg: WP Super Cache), clear the cache by going to Settings > WP Super Cache > Contents > Delete Cache.

Step 3: The third step is to allow Facebook crawler to crawl the older 'HTTP' version of the page.

Here's how to do that:

Chances are that you have redirected all 'HTTP' requests to 'HTTPS' using the .htaccess file.

You will need to edit your .htaccess redirect code to allow Facebook crawler to access the HTTP page without getting redirected.

You can easily do this by adding the following redirect condition to the .htaccess directive:

RewriteCond %{HTTP_USER_AGENT} !facebookexternalhit/[0-9]

This line needs to be added right before the 'RewriteRule'.

An example is as follows:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_USER_AGENT} !facebookexternalhit/[0-9]
RewriteRule ^(.*)$ https://sitename.com/$1 [R=301,L]

This code will redirect all users from HTTP to HTTPS pages except Facebook crawlers.

Note: Your redirect code might be different than the example above but that doesn't matter. Simply add the line before the 'RewriteRule' as mentioned earlier.

Step 4: Login to your Facebook account and go to Facebook OG Tags debugger here: https://developers.facebook.com/tools/debug/

Step 5: Enter the 'HTTPS' URL of any one of your website's posts/pages in the space given and click 'Debug'.

Step 6: If you get the "This URL hasn't been shared on Facebook before." message, click on the 'Fetch New Information' button.

Step 7: Next click 'Scrap Again' button to force Facebook to re-crawl your webpage.

Step 8: You should now be able to see all your likes re-attributed back to the page. You would also see two URLs under the 'Redirect path' heading which reflects your og:url meta tag and your original HTTPS URL as shown in the image below:

Facebook OG tags debugger

Step 9: Of-course it won't be feasible to do this for every single URL but I am unable to find any solution to this as of now except to wait for 30 days for facebook to rescrape your pages. If you have another solution, do let me know.

How to change OG URL tag?

Now let's see how you can change the 'OG URL' tag for all your web pages from HTTPS URLs to HTTP URLs (as mentioned in Step 1 above).

Option 1: Changing OG:URL from HTTPS to HTTP using a plugin

Chances are that you are currently using a SEO plugin or a social media plugin that generates the 'OG URL' tag.

If that's the case, you can consider using a plugin to change the 'OG URL' output.

I developed the Change OG URL to HTTP plugin that can help you automatically change the OG:URL output for the following plugins:

  • Yoast SEO Plugin.
  • ALL In One SEO Pack.
  • WP facebook open graph protocol by Chuck Reynolds.
  • Facebook Open Graph, Google+ and Twitter Card Tags plugin by Webdados.

Here is the plugin: https://wordpress.org/plugins/change-og-url-to-http/

You can install the plugin by logging into your wordrpess dashboard (admin panel) and then clickling on 'Plugins > Add New' from the left panel. Search for 'Change OR URL to HTTP by Mukesh Mani' and you should be able to see the plugin. Click on 'Install' and then 'Activate'.

Check the HTML source of your pages to see if changes have taken effect.

Here's an example of what the plugin does:

Change og url to http plugin output

Note: Note that this plugin changes the OG:URL only for posts that existed when installing the plugin. All new posts that you add will have the regular OG:URL tag with HTTPS.

Note 2: Make sure to give facebook crawlers access to HTTP version of your webpages for this to work. Read previous heading in this article to know how to do that.

Option 2: Changing OG:URL from HTTPS to HTTP Manually

If you do not want to use the plugin, here's how you can do this manually.

If you are not using any SEO/Social Media plugin, you can add the following code to your theme's functions.php file to add a 'OG URL' tag with a HTTP:

Note: If you are using Yoast, AllinSEO or any other social media plugin, scroll further down to see what code to use.

function add_http_og_url_tag(){
if( ! is_singular() ) return;
  global $post;
  $ogurl = get_permalink( $post->ID );
  $ogurl = esc_url( str_replace( 'https://','http://',$ogurl ) );
  /* Output OG:URL tag with HTTP */
  echo "\n<meta property='og:url' content='$ogurl'>\n";
}
add_action('wp_head', 'add_http_og_url_tag');

Applying the code only to existing posts and not new posts

Even though the above code will work, as you would have realized by now, there is another issue. The issue is that the above code will add the 'OG URL' tag with 'HTTP' to the existing posts and also the new posts. In other words, all the new posts that you will be adding.

We of-course do not want to keep adding the 'HTTP' URLs for new posts.

To resolve this, we can do a date comparison and then add the tags only to older posts/pages.

Say for example, you shifted to 'HTTPS' on '2nd of August 2017'. You can compare dates to stop adding OG URL tag with 'HTTP' for all posts up till '2nd of August 2017' and then go back to adding the regular 'OG URL' tag with the 'HTTPS' urls for all the newer posts.

Here's a function that does that for you:

function add_http_og_url_tag(){
if( ! is_singular() ) return;
global $post;
/* date to stop adding HTTP OG URL tags */
$ow_date_to_stop = 'August 2, 2017';
$ow_date_to_stop = strtotime( $ow_date_to_stop );
/* Current post date */
$ow_cur_post_date = esc_html( get_the_date() );
$ow_cur_post_date = strtotime( $ow_cur_post_date );
/* Current post URL */
$ogurl = get_permalink( $post->ID );
if( $ow_cur_post_date < $ow_date_to_stop  ){
  $ogurl = esc_url( str_replace( 'https://','http://',$ogurl ) );
}
  echo "\n<meta property='og:url' content='$ogurl'>\n";
}
add_action('wp_head', 'add_http_og_url_tag');

Now, the above code will only add 'HTTP' version of 'OG URL' tag for posts older than the set date.

Note: Make sure to change the date in the code from August 2, 2017 to any date that you want.

Now let's see how you can add a filter to the og:url output if you are using the following popular plugins that add OG tags to your site:

Yoast SEO plugin

If you are using Yoast SEO plugin, you can add the following code to your theme's functions.php file, to make the required changes:

function ow_ogurl_yoast_filter( $ogurl ){

/* date to stop adding HTTP OG URL tags */
$ow_date_to_stop = 'August 2, 2017';
$ow_date_to_stop = strtotime( $ow_date_to_stop );

/* Current post date */
$ow_cur_post_date = esc_html( get_the_date() );
$ow_cur_post_date = strtotime( $ow_cur_post_date );	

if( $ow_cur_post_date < $ow_date_to_stop  ){
  return str_replace( 'https://','http://',$ogurl );
}

return $ogurl;
}
add_filter( 'wpseo_opengraph_url', 'ow_ogurl_yoast_filter', 10, 1 );

Note: Don't forget to change the date in the code from 'August 2, 2017' to any date you want.

All In One SEO Pack (AISEO) plugin

If you are using the 'All In One SEO Pack' plugin, then add the following code to your theme's functions.php file to make this work:

function ow_ogurl_aiseo_filter( $value, $type, $field ){
	
/* date to stop adding HTTP OG URL tags */
$ow_date_to_stop = 'August 2, 2017';
$ow_date_to_stop = strtotime( $ow_date_to_stop );

/* Current post date */
$ow_cur_post_date = esc_html( get_the_date() );
$ow_cur_post_date = strtotime( $ow_cur_post_date );	

if( $ow_cur_post_date < $ow_date_to_stop ){
if( $field == 'url' ){
	$value = str_replace( 'https://','http://',$value );
	return $value;
}}
return $value;
}
add_filter('aiosp_opengraph_meta', 'ow_ogurl_aiseo_filter', 10, 3);

Note: As usual, make sure to change the date in the code before using.

Facebook Open Graph, Google+ and Twitter Card Tags plugin by Webdados

If you are using the Facebook Open Graph plugin by Webdados, then use the following code:

function ow_ogurl_fb_filter( $ogurl ){

/* date to stop adding HTTP OG URL tags */
$ow_date_to_stop = 'August 2, 2017';
$ow_date_to_stop = strtotime( $ow_date_to_stop );

/* Current post date */
$ow_cur_post_date = esc_html( get_the_date() );
$ow_cur_post_date = strtotime( $ow_cur_post_date );	

if( $ow_cur_post_date < $ow_date_to_stop ){
    return str_replace( 'https://','http://',$ogurl );
}
return $ogurl;
}
add_filter('fb_og_url', 'ow_ogurl_fb_filter');

WP Facebook Open Graph protocol by Chuck Reynolds

If you are using the WP Facebook OGP plugin by Chuck Reynolds, then use the following code:

function ow_ogurl_wpfbogp_filter( $ogurl ){

/* date to stop adding HTTP OG URL tags */
$ow_date_to_stop = 'August 2, 2017';
$ow_date_to_stop = strtotime( $ow_date_to_stop );

/* Current post date */
$ow_cur_post_date = esc_html( get_the_date() );
$ow_cur_post_date = strtotime( $ow_cur_post_date );	

if( $ow_cur_post_date < $ow_date_to_stop ){
    return str_replace( 'https://','http://',$ogurl );
}
return $ogurl;	
}
add_filter('wpfbogp_url','ow_ogurl_wpfbogp_filter');

Will doing this impact SEO negatively?

The OG:URL tag is only used by Facebook to determine the URL of the page. Google uses the 'Canonical tag' instead. So as long as your 'Canonical tag' points to the HTTPS version of your site, you are good to go.

So no, you won't be impacted negatively from the SEO perspective.

 
 
 
 

Comments

  1. Hello

    Thanks for this article, pls any code to restore my social share using this your method though I changed permalink from /%year%/%monthnum%/%postname%.html to /%postname%.html pls help

    I may have to also contact you to check out my site SEO cause for the past few months I have lost 90% of my traffic i meant from 12kpv daily to 800pv pls help

  2. Henning says:

    Hi there,

    I am currently in the process of migrating a couple of sites to HTTPS and your plugin / post is a godsend!! Thanks for providing all the infos, very much appreciated.

    Unfortunately Facebook doesn't recognize or accept the different og:url setting and outputs the canonical URL as HTTPS-version (although the scraped info correctly shows the og:url being set to HTTP).

    Any ideas on why this might happen and how to fix this? You see the issue when using the sharing debugger on this URL: https://www.martin-von-bergen.info/warum-maenner-sich-emotional-distanzieren/er-zieht-sich-zurueck-obwohl-er-frueher-liebevoll-um-sie-bemueht-war

    Thanks & regards!

    P.S.: I'd love to subscribe to the comment section here to be notified but since that's not possible I will check back in a day or two...

    • M Mukesh says:

      Hi Henning,

      I figured out what the issue is. The issue happens when you don't allow facebook to access the HTTP version of your webpages. You need to make changes in your HTaccess file to allow HTTP access only to facebook crawlers. I made the required changes in the article on how to do this.

  3. Henning says:

    Nevermind my earlier comment! I found the culprit: The HTTP redirect was outweighing the og:url setting, took some fiddling to sort it all out but it's working fine now.

    Thanks again!!

  4. ChrisSoft says:

    Hi, I tried to use your solution, but Facebook still use the 301 redirect and ignore the og:url setting....
    I have also changed the htaccess file with the rule you suggested, but it doesn't works...

    Could you told me if something is wrong? The website is : https://www.pesarotrekking.it

    Thanks again

  5. Rodrigo says:

    Hi, if we have the re-direction setup on cloudflare and not on .htaccess, how and where do we add this> RewriteCond %{HTTP_USER_AGENT} !facebookexternalhit/[0-9] ?

    Thank you!

  6. Steve says:

    Great Piece of information there!! I have been searching for this details as am planning to move my site soon. Is it possible for you to make a YouTube Video Tutorial for this??

    It will be a lifesaver especially for Non-coders.

    Thank you.

  7. Lisa says:

    I have spent two months reading lots of articles with confusing info on how to recover FB shares - all assuming you are a developer. So thankful I finally found your blog with simple, easy to follow instructions. Finally someone telling me how to redirect the FB crawlers.
    Unfortunately, I dont think your code for Yoast SEO is correct. Even though I added it to functions.php it only updated one blog to correct FB share (the one closest to stop date). For all the other blogs, I had to add the og;url manually into the Head section of each blog post. But at least I got back all the shares (expect for one post - still trying to work out why!).

  8. Riccardo says:

    For yoast plugin i had to change
    /* Current post date */
    $ow_cur_post_date = esc_html( get_the_date() );
    to
    /* Current post date */
    $ow_cur_post_date = esc_html( get_the_date('Y/m/d H:i:s') );

    and to make this work for home page I had to change:
    if( $ow_cur_post_date < $ow_date_to_stop ){
    return str_replace( 'https://&#039;,'http://&#039;,$ogurl );
    }
    to
    if( (is_home() OR $ow_cur_post_date < $ow_date_to_stop )){
    return str_replace( 'https://&#039;,'http://&#039;,$ogurl );

    Thanks for the script

  9. srta says:

    Hi, thanks a lot for your help. I used the manual code for Yoast + the exception in the htaccess and still same after debugging sharing. Any ideas on what to do? Thanks a lot.

    https://www.barriosalvadormadrid.com/

  10. Jean François says:

    Thank you, I get all my FB Likes back :)
    Thanks!!! Have a nice day

  11. harry says:

    Hi, you are a genius!
    I've noticed that the yoast snippet does not work - > blank page. The plugin is perfect, but I cannot set a date to stop change OG, so all my new articles have 0 likes. Can you help me?

    • M Mukesh says:

      Hi Harry, the plugin does not have a feature to stop making the OG change after a particular date. You might have to use the code given in this article for that.

  12. Liliya says:

    Thank you very much!

    You may note also that every server has different configuration so the the .htaccess file records must be adapted/harmonized.

    Thanks again,
    Liliya

  13. Zol says:

    Hi. My question is that should I change the date format in the code to the one I set in wordpress? I have 2018-11-20. Should this line in the code look like this?
    $ow_date_to_stop = '2018-11-20';

  14. Marek says:

    Thanks for the tutorial.
    Will this method work on the website that moved to https (and lost the likes) and then converted to WordPress?

  15. nisha says:

    Can someone post the code for rewrite for nginx server

  16. nisha says:

    I got solution :

    server {
    listen 80;
    server_name internetofbirds.com http://www.internetofbirds.com;
    if ($http_user_agent !~ "(Facebot|facebookexternalhit/1.1)") {
    return 301 https://internetofbirds.com;
    }

    }
    i am able to recove count however og:title displaying : "Welcome to NGINX!" :( , my html file is reflecting my site name but its not updating og:title

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.