Динамическое создание метатегов открытого графика 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);
        }
    });
}

Работает как заклинание! : ]

Author: borisdiakur, 2011-12-08

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, вы не должны стесняться публиковать их в виде новых вопросов вместо комментариев, так как я гарантирую, что у других людей тоже есть такая же проблема.

 31
Author: saccharine, 2011-12-09 11:43:08

Я совершенно уверен, что Facebook больше не просматривает любые URL-адреса с параметрами. Он всегда "перенаправляет" на удаленную версию URL-адреса.

В примере OPs:

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

Становится

Http://example.com/index.php

Независимо от того, что вы делаете. Самое близкое, что я видел к объяснению, это это:

A URL with no session id or extraneous parameters. All shares on Facebook will use this as the identifying URL for this article.
 4
Author: ggwarpig, 2015-04-24 09:53:55

Когда вы нажимаете ссылку Получить код в своих типах объектов, пытались ли вы вставить код, который он вам дал?
Я бы попробовал вставить в ваш веб-сайт, а затем, если это сработает, воспроизвести вывод html.
Попробуйте сделать это без тега DOCTYPE.
Вот пример того, что я получил, и я не вижу этих тегов выше: fb:app_id, не уверен, что это имеет значение.
Кроме того, не должен ли URL-адрес og: также включать переменные в конце?

Http://ogp.me/ns # фб: http://ogp.me/ns/fb # веб-сайт: http://ogp.me/ns/website#">

 1
Author: Joao B, 2011-12-08 16:27:04

Да, работает как заклинание, но нуждается в некоторой перекодировке для меня. Мне пришлось создать новую страницу, подобную этой:

<!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>
 1
Author: Oscar Pascual, 2012-10-12 17:16:17

Для 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(); ?>" />
 0
Author: MilosK, 2013-02-24 15:28:27