dynamic生成Facebook Open Graph元标记
正如标题暗示我试图dynamic生成Facebook开放graphics元标记,但我不能得到它的工作。 这甚至有可能吗?
更新:
最后,我在@saccharine的帮助下工作。 以下代码正在为我工作:
<?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>
我现在把Facebook的debugging器的url可以包括任何dynamic参数,甚至没有,全部或只有一个select,并以任何顺序如下:
http://mysite.com/index.php?type=restaurant&title=luigis
或这个:
http://mysite.com/index.php?locale=de_DE&description=hi&type=bistro
做到这一点:我现在可以将操作发布到用户的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); } }); }
奇迹般有效! :]
首先,我想重申,我几乎肯定你的问题是由于你传递给debugging器的url不是dynamic生成的。 url标签本质上是一个redirect器。 除非它是完全相同的(也就是说url元对象上的元标记与您传递的url中的元标记相同)作为您正在testing的url,否则您将无法获得所需的结果。
元标记
<meta property="og:url">
需要dynamic生成。 debugging器被redirect到您的默认索引页面,而不是dynamic生成的页面。
例如,我为每个使用的对象分配一个id,所以我有类似下面的内容
<meta property="og:url" content="http://mysite.com/index.php?id=<?php echo $_GET['id'] ?>"/>
我将这个确切的URL传递给debugging器,因此debugging器着陆的最终页面就是那个确切的URL。
另外,在下面
<meta property="og:type" content=""/>
财产是如何dynamic生成的? 你记得在你的实际代码中设置如下的代码吗?
<meta property="og:type" content="<?php echo _GET['type] ?>"/>
你也似乎把所有东西都推到了url中,这是危险的,会引起巨大的头痛,这可能是这里的问题。 相反,只能推一件东西,例如?type = bistro,然后从DB中传播必要的数据。
我build议dynamic生成基于object_id的大多数OG标记。 为每个object_id存储相关的OG信息,然后在访问时传播它们。 这样,您还可以轻松地扩展和编辑OG更新时使用的标签。
如果你有OG的问题,你应该毫不犹豫地把它们作为新的问题,而不是评论,因为我保证其他人也有同样的问题。
我相当确定Facebook不再使用参数抓取任何url。 它总是“redirect到”一个分离的版本的url。
在OP中的例子:
http://example.com/index.php?type=restaurant&title=luigis
变
不pipe你做什么 最近我看到一个解释是这样的 :
A URL with no session id or extraneous parameters. All shares on Facebook will use this as the identifying URL for this article.
当你点击对象types中的获取代码链接时,你是否尝试粘贴它给你的代码?
我会尝试粘贴到您的网页,然后如果它的工作,复制html输出。
尝试没有DOCTYPE标记。
下面是我得到的样本,我没有看到上面的这些标签:fb:app_id,不知道它是否有所作为。
此外,不应该og:url最后还包括variables?
<head prefix =“og: http : //ogp.me/ns# fb: http : //ogp.me/ns/fb# website: http : //ogp.me/ns/website# ”>
<meta property =“fb:app_id”content =“1234567888”>
<meta property =“og:url”content =“http://mysite.com/index.php?type=MY_APP_NAMESPACE%3Abistro”>
是的,像一个魅力,但需要一些recoding为我。 我不得不像这样创build一个新的页面:
<!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>
对于Joomla Opengraph Metadynamic:
<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.comhttp://img.dovov.comstories/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(); ?>" />