Generating Facebook Open Graph meta tags dynamically

PhpFacebookFacebook OpengraphMeta Tags

Php Problem Overview


As the title implies I'm trying to generate Facebook Open Graph meta tags dynamically, but I can't get it working. Is it even possible?

UPDATE:

Finally I got it working with the help of @saccharine. The following code is working for me:

<?php

$params = array();
if(count($_GET) > 0) {
	$params = $_GET;
} else {
	$params = $_POST;
}
// defaults
if($params['type'] == "") $params['type'] = "restaurant";
if($params['locale'] == "") $params['locale'] = "en_US";
if($params['title'] == "") $params['title'] = "default title";
if($params['image'] == "") $params['image'] = "thumb";
if($params['description'] == "") $params['description'] = "default description";

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
	<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# MY_APP_NAME_SPACE: http://ogp.me/ns/fb/MY_APP_NAME_SPACE#">
		<title></title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
	
		<!-- Open Graph meta tags -->
		<meta property="fb:app_id" content="MY_APP_ID" />
		<meta property="og:site_name" content="meta site name"/>
		<meta property="og:url" content="http://mysite.com/index.php?type=<?php echo $params['type']; ?>&locale=<?php echo $params['locale']; ?>&title=<?php echo $params['title']; ?>&image=<?php echo $params['image']; ?>&description=<?php echo $params['description']; ?>"/>
		<meta property="og:type" content="MY_APP_NAME_SPACE:<?php echo $params['type']; ?>"/>
		<meta property="og:locale" content="<?php echo $params['locale']; ?>"/>
		<meta property="og:title" content="<?php echo $params['title']; ?>"/>
		<meta property="og:image" content="http://mysite.com/img/<?php echo $params['image']; ?>.png"/>
		<meta property="og:description" content="<?php echo $params['description']; ?>"/>

	</head>
</html>

The url I'm putting into the Facebook debugger now can include any of the dynamic parameters or even none, all or only a selection and in any order like so:
http://mysite.com/index.php?type=restaurant&title=luigis<br> or this:
http://mysite.com/index.php?locale=de_DE&description=hi&type=bistro

Having that accomplished: I can now publish actions to the user's stream:

function postRestaurant() {
	FB.api('me/MY_APP_NAMESPACE:have_lunch?\
	start_time=2000-12-12T04:00:00&\
	expires_in=7200&\
	restaurant=' + encodeURIComponent(getRedirectURI() + '?type=restaurant' + '&description=arnold' + '&title=stalone'), 'post', function (response) {
		if (!response || response.error) {
			console.log('postRestaurant: Error occured => ' + response.error.message);
		} else {
			console.log('postRestaurant: Post was successful! Action ID: ' + response.id);
		}
	});
}

Works like a charm! : ]

Php Solutions


Solution 1 - Php

First, I want to reiterate that I am almost positive that your problem is due to the fact that the url you are passing into the debugger is not dynamically generated. The url tag essentially acts as a redirector. Unless it's the exact same (meaning the meta tags on the url meta object is the same as those on the url you are passing in) as the url you are testing, you won't get the results you're looking for.

The meta tag

<meta property="og:url"> 

needs to be dynamically generated. The debugger is being redirected to your default index page instead of the dynamically generated page.

For example, I assign an id to every object I'm using, and so I have something like the following

<meta property="og:url" content="http://example.com/index.php?id=<?php echo $_GET['id'] ?>"/> 

I pass in that exact url into the debugger, and thus the final page the debugger lands on will be that exact url.

Also, in the following

<meta property="og:type" content=""/>

how is the property being dynamically generated? Did you remember to set in your actual code something like the following?

<meta property="og:type" content="<?php echo $_GET['type'] ?>"/>

You also appear to be shoving everything into the url, which is dangerous and can cause huge headaches, which might be the issue here. Instead, shove only one thing , eg ?type=bistro and then propagate the necessary data from the DB.

I would recommend dynamically generating most OG tags based on an object_id. Store the relevant OG info for every object_id, and then propagate them when accessed. This way, you can also easily expand and edit the tags you use when OG is updated.

If you have problems with OG you shouldn't hesitate to post them as new questions instead of comments as I guarantee other people also have the same problem.

Solution 2 - Php

I'm fairly certain Facebook no longer crawls any urls with parameters. It always "redirects" to a stripped version of the url.

In OPs example:

http://example.com/index.php?type=restaurant&title=luigis

becomes

http://example.com/index.php

regardless of what you do. Closest thing I've seen to an explanation is this:

A URL with no session id or extraneous parameters. All shares on Facebook will use this as the identifying URL for this article.

Solution 3 - Php

Yes, works like a charm, but needs some recoding for me. I have had to create a new page like this:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# MY_APP_NAME_SPACE: http://ogp.me/ns/fb/MY_APP_NAME_SPACE#">
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

        <!-- Open Graph meta tags -->
		<meta property="og:title" content="<?= urldecode($_GET['title']) ?>" />
		<meta property="og:type" content="article" />
		<meta property="og:url" content="<?= "http://www.calsots.com".$_SERVER['REQUEST_URI']; ?>" />
		<meta property="og:image" content="<?= $_GET['image'] ?>" />
		<meta property="og:site_name" content="Calsots.com" />
		<meta property="fb:admins" content="MY_APP_ID" />
		<meta property="og:description" content="<?= urldecode($_GET['description']) ?>" />

    </head>
</html>

Solution 4 - Php

When you click the Get Code link in your object types, did you try pasting the code it gave you?
I would try pasting to your web, and then if it works, replicate the html output.
Try it without the DOCTYPE tag.
Heres a sample of what I got, and I dont see these tags above: fb:app_id, not sure if it makes a difference.
Also, shouldnt the og:url also include the variables at the end?

<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# website: http://ogp.me/ns/website#"&gt;<br> <meta property="fb:app_id" content="1234567888">
<meta property="og:url" content="http://mysite.com/index.php?type=MY_APP_NAMESPACE%3Abistro"&gt;

Solution 5 - Php

For Joomla Opengraph Meta dynamic:

<meta property="og:title" content="<?=
$title = $this->getTitle();
?>" />
        <meta property="og:type" content="website" />
        <meta property="og:url" content="<?= "http://YORUWEBSITE.com".$_SERVER['REQUEST_URI']; ?>" />
        <meta property="og:image" content="http://YOURWEBSITE.com/images/stories/BIGIMAGE.jpg" />
        <meta property="og:site_name" content="YOURWEBSITE.com" />
        <meta property="fb:app_id" content="YOURFACEBOOKAPPIDNUMBER" />
        <meta property="og:description" content="<?= $title = $this->getDescription(); ?>" />

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionborisdiakurView Question on Stackoverflow
Solution 1 - PhpsaccharineView Answer on Stackoverflow
Solution 2 - PhpgerbzView Answer on Stackoverflow
Solution 3 - PhpOscar PascualView Answer on Stackoverflow
Solution 4 - PhpJoao BView Answer on Stackoverflow
Solution 5 - PhpMilosKView Answer on Stackoverflow