php 动态生成 Facebook Open Graph 元标签
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8431694/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Generating Facebook Open Graph meta tags dynamically
提问by borisdiakur
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?
正如标题所暗示的,我正在尝试动态生成 Facebook Open Graph 元标记,但我无法让它工作。甚至有可能吗?
UPDATE:
更新:
Finally I got it working with the help of @saccharine. The following code is working for me:
最后我在@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>
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
or this:
http://mysite.com/index.php?locale=de_DE&description=hi&type=bistro
我现在放入 Facebook 调试器的 url 可以包含任何动态参数,甚至不包含,全部或仅包含一个选择,并且以任何顺序如下:
http: //mysite.com/index.php?type=restaurant&title= luigis
或这个: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! : ]
奇迹般有效!:]
采纳答案by saccharine
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.
首先,我想重申一下,我几乎肯定您的问题是由于您传递给调试器的 url 不是动态生成的。url 标签本质上充当重定向器。除非它与您正在测试的 url 完全相同(意味着 url 元对象上的元标记与您传入的 url 上的元标记相同),否则您将不会得到您正在寻找的结果。
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
例如,我为我正在使用的每个对象分配了一个 id,所以我有如下内容
<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.
我将那个确切的 url 传递给调试器,因此调试器登陆的最终页面将是那个确切的 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.
您似乎还把所有内容都塞进了 url,这很危险,可能会引起巨大的头痛,这可能是这里的问题。相反,只推送一件事,例如 ?type=bistro,然后从数据库传播必要的数据。
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.
我建议根据 object_id 动态生成大多数 OG 标签。为每个 object_id 存储相关的 OG 信息,然后在访问时传播它们。这样,您还可以轻松地扩展和编辑更新 OG 时使用的标签。
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.
如果您在使用 OG 时遇到问题,您应该毫不犹豫地将它们作为新问题而不是评论发布,因为我保证其他人也有同样的问题。
回答by gerbz
I'm fairly certain Facebook no longer crawls anyurls with parameters. It always "redirects" to a stripped version of the url.
我相当肯定 Facebook 不再抓取任何带有参数的网址。它总是“重定向”到 URL 的剥离版本。
In OPs example:
在 OP 示例中:
http://example.com/index.php?type=restaurant&title=luigis
http://example.com/index.php?type=restaurant&title=luigis
becomes
变成
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.
回答by Oscar Pascual
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>
回答by Joao B
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?
当您单击对象类型中的“获取代码”链接时,您是否尝试粘贴它给您的代码?
我会尝试粘贴到您的网站,然后如果有效,请复制 html 输出。
在没有 DOCTYPE 标签的情况下尝试。
这是我得到的样本,我没有在上面看到这些标签:fb:app_id,不确定它是否有所不同。
另外, og:url 不应该在末尾还包含变量吗?
<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">
<head prefix="og: http://ogp.me/ns#fb: http://ogp.me/ns/fb#网站: http://ogp.me/ns/website#">
<meta 属性="fb:app_id" content="1234567888">
<meta property="og:url" content="http://mysite.com/index.php?type=MY_APP_NAMESPACE%3Abistro">
回答by MilosK
For Joomla Opengraph Meta dynamic:
对于 Joomla Opengraph Meta 动态:
<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(); ?>" />