web-dev-qa-db-ja.com

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>

Facebookデバッガーに挿入するURLには、動的パラメーターを含めることができます。また、次のような任意の順序で任意の動的パラメーターを含めることもできます。
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);
        }
    });
}

チャームのように機能します! :]

51
borisdiakur

まず、繰り返しますが、デバッガーに渡すURLが動的に生成されないという事実が問題の原因であることはほぼ間違いありません。 urlタグは、本質的にリダイレクタとして機能します。テストしているURLとまったく同じ(つまり、urlメタオブジェクトのメタタグが渡したURLのメタタグと同じである)場合を除き、探している結果は得られません。

メタタグ

<meta property="og:url"> 

動的に生成する必要があります。デバッガは、動的に生成されたページではなく、デフォルトのインデックスページにリダイレクトされています。

たとえば、使用しているすべてのオブジェクトにIDを割り当てるため、次のようなものがあります

<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のように1つだけを押し込み、DBから必要なデータを伝達します。

Object_idに基づいてほとんどのOGタグを動的に生成することをお勧めします。すべてのobject_idに関連するOG情報を保存し、アクセス時にそれらを伝達します。これにより、OGが更新されたときに使用するタグを簡単に展開および編集することもできます。

OGに問題がある場合は、コメントではなく新しい質問として投稿することをheしないでください。他の人にも同じ問題があることを保証します。

31
saccharine

Facebookがパラメーターを含むanyurlをクロールしないことは確かです。 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.
4
gerbz

はい、魅力のように動作しますが、私のためにいくつかの再コーディングが必要です。このような新しいページを作成する必要がありました。

<!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>
2
Oscar Pascual

オブジェクトタイプの「コードを取得」リンクをクリックしたときに、与えられたコードを貼り付けようとしましたか?
Webに貼り付けてみて、それが機能する場合は、html出力を複製します。
DOCTYPEタグなしで試してください。
ここに私が手に入れたもののサンプルがありますが、上記のタグは表示されません:fb:app_id、違いがあるかどうかはわかりません。
また、og:urlの最後に変数を含めるべきではありませんか?

<head prefix = "og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# website: 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">

1
Joao B

Joomla Open Graph Metaダイナミックの場合:

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