Генерация метатекстов 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(); ?>" />