Динамическое создание мета-тегов Facebook Open Graph

Как видно из названия, я пытаюсь динамически генерировать метатеги 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 ответов

Решение

Во-первых, я хочу повторить, что я почти уверен, что ваша проблема связана с тем, что 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.

В примере с ОП:

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.

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

<!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>

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

http://ogp.me/ns fb: http://ogp.me/ns/fb website: http://ogp.me/ns/website">

Для Joomla Opengraph Meta dynamic:

<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(); ?>" />
Другие вопросы по тегам