Генерация метатекстов Facebook Open Graph динамически
Как следует из названия, я пытаюсь генерировать метатеги Facebook Open Graph динамически, но я не могу заставить его работать. Возможно ли это?
UPDATE:
Наконец, я начал работать с помощью @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);
}
});
}
Работает как шарм!:]
Ответы
Ответ 1
Во-первых, я хочу повторить, что я почти уверен, что ваша проблема связана с тем, что URL, который вы передаете в отладчик, не генерируется динамически. Тег url по сути действует как редиректор. Если это не то же самое (т.е. Метатеги на мета-объекте url совпадают с метками на URL-адресе, который вы передаете) с URL-адресом, который вы тестируете, вы не получите желаемых результатов.
Метатег
<meta property="og:url">
должен быть динамически сгенерирован. Отладчик перенаправляется на страницу индекса по умолчанию вместо динамически генерируемой страницы.
Например, я назначаю идентификатор каждому объекту, который я использую, и поэтому у меня есть что-то вроде следующего
<meta property="og:url" content="http://example.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, не стесняйтесь публиковать их как новые вопросы, а не комментарии, так как я гарантирую, что у других людей такая же проблема.
Ответ 2
Я уверен, что Facebook больше не сканирует любые URL-адреса с параметрами. Он всегда "перенаправляет" на лишенную версию URL-адреса.
В примере OP:
http://example.com/index.php?type=restaurant&title=luigis
становится
http://example.com/index.php
независимо от того, что вы делаете. Ближайшая вещь, которую я видел для объяснения, this:
A URL with no session id or extraneous parameters. All shares on Facebook will use this as the identifying URL for this article.
Ответ 3
Да, работает как шарм, но мне нужна перекодировка. Мне пришлось создать новую страницу следующим образом:
<!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>
Ответ 4
Когда вы нажимаете ссылку Get Code в своих типах объектов, вы пытались вставить код, который он вам дал?
Я бы попробовал вставить в вашу сеть, а затем, если это сработает, повторите вывод html.
Попробуйте это без тега DOCTYPE.
Heres образец того, что я получил, и я не вижу эти теги выше: fb: app_id, не уверен, что это имеет значение.
Также, shouldnt og: url также включает переменные в конце?
< head prefix = "og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#: 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" >
Ответ 5
Для 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(); ?>" />