Facebook динамические теги Open Graph для галереи изображений

У меня есть галерея изображений Javascript, и я хотел иметь возможность обмениваться отдельными изображениями на FB, но обнаружил, что теги Open Graph должны быть статичными, чтобы FB мог их очистить, их изменение на лету с помощью JS не работает.

Я нашел это сообщение, динамически генерирующее метатеги Facebook Open Graph, и добавил некоторые перенаправления Javascript.

В основном, когда пользователь нажимает на мою статическую кнопку FB Share, параметры заголовка, описания, изображения и перенаправления отправляются на страницу и пишутся теги OG. Чем я делаю JS self.location к фактическому https://www.facebook.com/sharer/sharer.php?u=&t=

Как только изображение публикуется в FB, и пользователи нажимают на изображение, они возвращаются на ту же страницу с другим перенаправлением, полученным из параметра перенаправления.

  • Все работает, за исключением того, что изображение не отображается в диалоге FB. После публикации на FB это показывает хорошо, хотя. Также в Open Graph Object Debugger изображение отображается нормально, но не в диалоге общего доступа. Есть идеи почему?

  • Мне также было интересно узнать о моем динамическом шаблоне OG с перенаправлениями, есть ли что-нибудь, что можно улучшить? Как насчет безопасности и т. Д.?

    <?php
    
        // https://stackru.com/questions/8431694/generating-facebook-open-graph-meta-tags-dynamically
    
        $params = array();
        if ( count($_GET) > 0) {
            $params = $_GET;
        } else {
            $params = $_POST;
        }
    
        // defaults
        if ( $params['locale'] == "" ) $params['locale'] = "en_US";
        if ( $params['type'] == "" ) $params['type'] = "article";
    
        if ( $params['title'] == "" ) $params['title'] = "My Awsome Website";
        if ( $params['description'] == "" ) $params['description'] = "The default description of my website";
        if ( $params['image'] == "" ) $params['image'] = "http://www.mywebsite.com/logo.png";
        if ( $params['redirect'] == "" ) $params['redirect'] = "http://www.mywebsite.com/";
    
        $query_str =    'locale='       . $params['locale'] . 
                        '&type='        . $params['type'] . 
                        '&title='       . $params['title'] . 
                        '&description=' . $params['description'] . 
                        '&image='       . $params['image'] . 
                        '&redirect='    . $params['redirect'];
    
        $fb_param_u = urlencode( 'http://www.mywebsite.com/share/facebook/?' . $query_str );
        $fb_param_t = rawurlencode( strip_tags( $params['title'] ) );
    
    ?>
    
    <!DOCTYPE html>
    <html lang="en-US" prefix="og: http://ogp.me/ns#">
    
        <head>
            <title></title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    
            <!-- Open Graph meta tags -->
            <meta property="og:site_name" content="My Website"/>
            <meta property="og:locale" content="<?php echo $params['locale']; ?>"/>
            <meta property="og:type" content="<?php echo $params['type']; ?>"/>
    
            <meta property="og:url" content="http://www.mywebsite.com/share/facebook/?<?= $query_str ?>" />
    
            <meta property="og:title" content="<?php echo $params['title']; ?>"/>
            <meta property="og:description" content="<?php echo $params['description']; ?>"/>
            <meta property="og:image" content="<?php echo $params['image']; ?>"/>
    
            <script type="text/javascript">
                var matches = document.referrer.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
                var domain_referrer = matches && matches[1];
    
                // when clicking through on FB share button
                if (domain_referrer == 'www.mywebsite.com') {
                    self.location = "https://www.facebook.com/sharer/sharer.php?u=<?= $fb_param_u ?>&t=<?= $fb_param_t ?>";
                } else {
                // redirect incomming links from FB
                    self.location = '<?php echo $params["redirect"]; ?>';
                }
            </script>   
        </head>
    
        <body>
            <div style="/*display:none*/">
                <img src="<?= $params['image'] ?>" />
            </div>
        </body>
    
    </html>
    

1 ответ

Попробуй это

<?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://URL/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://URL/img/<?php echo $params['image']; ?>.png"/>
        <meta property="og:description" content="<?php echo $params['description']; ?>"/>

    </head>
</html>
Другие вопросы по тегам