Динамическое создание метатегов 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-адрес, что опасно и может вызвать огромные головные боли, что может быть проблемой здесь. Вместо этого засунуть только одну вещь , например ?введите=bistro, а затем распространите необходимые данные из БД.

Я бы рекомендовал динамически генерировать большинство тегов OG на основе object_id. Сохраните соответствующую информацию OG для каждого object_id, а затем распространите при доступе к ним. Таким образом, вы также можете легко развернуть и отредактировать теги, которые вы используете при обновлении OG.

если у вас есть проблемы с OG, вы не должны стесняться публиковать их как новые вопросы, а не комментарии, поскольку я гарантирую, что у других людей также есть та же проблема.


Я уверен, что Facebook больше не ползает любой urls с параметрами. Он всегда "перенаправляет" на разделенную версию 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.

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

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 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(); ?>" />