Как следует из названия, я пытаюсь генерировать метатеги 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); } }); }
Работает как шарм! :]
Во-первых, я хочу повторить, что я почти уверен, что ваша проблема связана с тем, что 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-адреса.
В примере OP:
http://example.com/index.php?type=restaurant&title=luigis
становится
независимо от того, что вы делаете. Ближайшая вещь, которую я видел для объяснения, такова:
A URL with no session id or extraneous parameters. All shares on Facebook will use this as the identifying URL for this article.
Когда вы нажимаете ссылку Get Code в своих типах объектов, вы пытались вставить код, который он вам дал?
Я бы попытался вставить в вашу сеть, а затем, если это сработает, повторите вывод html.
Попробуйте это без тега DOCTYPE.
Heres образец того, что я получил, и я не вижу эти теги выше: fb: app_id, не уверен, что это имеет значение.
Кроме того, должен ли параметр 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">
Да, работает как прелесть, но мне нужна перекодировка. Мне пришлось создать новую страницу следующим образом:
<!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(); ?>" />