Динамическое создание метатегов открытого графика Facebook
Как следует из названия, я пытаюсь динамически генерировать мета-теги Facebook Open Graph, но не могу заставить их работать. Возможно ли это вообще?
ОБНОВЛЕНИЕ:
Наконец-то я заставил его работать с помощью @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>
URL-адрес, который я теперь помещаю в отладчик Facebook, может включать любой из динамических параметров или даже ни одного, все или только выбор и в любом порядке, например так что:
http://mysite.com/index.php?type=restaurant&title=luigis
или это:
http://mysite.com/index.php?locale=de_DE&description=hi&type=bistro
Выполнив это: теперь я могу публиковать действия в потоке пользователя:
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);
}
});
}
Работает как заклинание! : ]
5 answers
Во-первых, я хочу повторить, что я почти уверен, что ваша проблема связана с тем, что URL-адрес, который вы передаете в отладчик, не генерируется динамически. Тег URL, по сути, действует как перенаправитель. Если это не то же самое (то есть мета-теги в мета-объекте url совпадают с метатегами на URL, который вы передаете), что и URL, который вы тестируете, вы не получите результатов, которые ищете.
Мета-тег
<meta property="og:url">
Должен быть динамически сгенерированный. Отладчик перенаправляется на страницу индекса по умолчанию вместо динамически создаваемой страницы.
Например, я присваиваю идентификатор каждому объекту, который я использую, и поэтому у меня есть что-то вроде следующего
<meta property="og:url" content="http://mysite.com/index.php?id=<?php echo $_GET['id'] ?>"/>
Я передаю этот точный URL-адрес в отладчик, и, таким образом, последняя страница, на которую попадет отладчик, будет именно этим URL-адресом.
Кроме того, в следующем
<meta property="og:type" content=""/>
Как динамически генерируется свойство? Вы не забыли установить свой фактический кодируйте что-то вроде следующего?
<meta property="og:type" content="<?php echo _GET['type] ?>"/>
Вы также, похоже, засовываете все в URL-адрес, что опасно и может вызвать огромные головные боли, что может быть проблемой здесь. Вместо этого засуньте только одну вещь, например ?type=bistro, а затем распространите необходимые данные из БД.
Я бы рекомендовал динамически генерировать большинство тегов OG на основе object_id. Храните соответствующую информацию OG для каждого object_id, а затем распространяйте их при доступе. Таким образом, вы также можете легко расширить и отредактируйте теги, которые вы используете при обновлении OG.
Если у вас есть проблемы с OG, вы не должны стесняться публиковать их в виде новых вопросов вместо комментариев, так как я гарантирую, что у других людей тоже есть такая же проблема.
Я совершенно уверен, что Facebook больше не просматривает любые URL-адреса с параметрами. Он всегда "перенаправляет" на удаленную версию URL-адреса.
В примере OPs:
Http://example.com/index.php?type=restaurant&title=luigis
Становится
Независимо от того, что вы делаете. Самое близкое, что я видел к объяснению, это это:
A URL with no session id or extraneous parameters. All shares on Facebook will use this as the identifying URL for this article.
Когда вы нажимаете ссылку Получить код в своих типах объектов, пытались ли вы вставить код, который он вам дал?
Я бы попробовал вставить в ваш веб-сайт, а затем, если это сработает, воспроизвести вывод html.
Попробуйте сделать это без тега DOCTYPE.
Вот пример того, что я получил, и я не вижу этих тегов выше: fb:app_id, не уверен, что это имеет значение.
Кроме того, не должен ли URL-адрес og: также включать переменные в конце?
Http://ogp.me/ns # фб: http://ogp.me/ns/fb # веб-сайт: http://ogp.me/ns/website#">
Да, работает как заклинание, но нуждается в некоторой перекодировке для меня. Мне пришлось создать новую страницу, подобную этой:
<!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 Мета-динамика:
<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(); ?>" />