Как программно показать изображение в шлеме React с помощью Gatsby?

Я использую Gatbsy для своей главной страницы, и я пытаюсь программно добавить некоторые метаданные с помощью реакции-шлема.

У меня есть компонент SEO следующим образом:

const SEO = ({title, description, location, image_url}) => {
    const capitalize = string => {
        if (string !== undefined){
            return string.charAt(0).toUpperCase() + string.slice(1);
        }

        return string

    };

    const MAIN_TITLE = settings.META_TITLE;
    return (
        <Helmet>
            <title>{`${MAIN_TITLE} | ${capitalize(title)}`}</title>
            <meta name="description" content={description}/>
            <meta property="og:title" content={`${MAIN_TITLE} | ${capitalize(title)}`}/>
            <meta property="og:description" content={description}/>
            <meta property="og:image" itemProp="image" content={image_url !== undefined ? image_url : `${settings.ROOT_URL}/static/image-cover-1e01617fb26211f1cd8e3dd24977070d.jpg`}/>
            <meta property="og:type" content="website"/>
            <meta property="og:url" content={location.href}/>
            <meta property="twitter:title" content={`${MAIN_TITLE} | ${capitalize(title)}`}/>
            <meta property="twitter:description" content={description}/>
            <meta property="twitter:image" itemProp="image"  content={image_url !== undefined ? image_url : `${settings.ROOT_URL}/static/image-cover-1e01617fb26211f1cd8e3dd24977070d.jpg`}/>
            <meta property="twitter:card" content="summary_large_image"/>
        </Helmet>
    )
};

export default SEO

И я использую его на одной из страниц Гэтсби следующим образом:

<div className="flex flex-col overflow-x-hidden min-h-screen">
     {loading && !hasError && <LoadingIndicator/>}
     {!loading && hasError && <div className="container my-12"><ErrorIndicator/></div>}
     {!loading && !hasError && <React.Fragment>
             <SEO title={`${vehicle.make} ${vehicle.model} ${vehicle.type}`}
                  description={`${vehicle.make} ${vehicle.model} wacht op u.`}
                  location={location}
                  image_url={vehicle.images instanceof Array ? vehicle.images[0].uri : vehicle.images.uri}/>
              .... // Rest of the code
      <React.Fragment>}
</div>

Когда я проверяю консоль в теге на localhost или на сервере, я вижу то, что я должен видеть:

введите здесь описание изображения

Но в Facebook я вижу кое-что еще. Для изображения, например, я вижу:

og:image    http://my-site/static/image-cover-1e01617fb26211f1cd8e3dd24977070d.jpg

Facebook использует оператор else в теге <meta property="og:image" ..../>, но image_url не является неопределенным, и в консоли я вижу правильный URL.

Любая идея?


person Boky    schedule 04.02.2020    source источник


Ответы (1)


Документы OG не показывают свойство элемента как атрибут, но я не думаю, что это так.

https://ogp.me/

Я думаю, что ваш код добавляет мета программно, поэтому при первой загрузке ее нет, и боты Facebook ее не улавливают? Попробуйте жестко закодировать этот метатег в HTML, чтобы увидеть, принимает ли Facebook это, и это, по крайней мере, даст вам знать, является ли это проблемой или нет.

Изменить: извините, что на самом деле не отвечает на основной вопрос. Если вышеупомянутое окажется проблемой, я бы предложил добавить его программно на стороне сервера, если это возможно. Вы можете попробовать создать шаблон с помощью чего-нибудь вроде EJS. По сути, я думаю, вам просто нужно убедиться, что он находится в DOM достаточно рано для ботов Facebook.

Изменить: Facebook просто не поддерживает (больше) настраиваемый обмен. Это OG или ничего, и они берут OG из вашего сырого html, прежде чем ваш JS сможет его изменить. Это просто не подходит для СПА. Вы можете Google OG для SPA, и некоторые люди придумали хакерские прокси, но они не подходят для вашего SEO.

Извиняюсь :/

person Sydney Y    schedule 04.02.2020
comment
Ваше первое утверждение верно. Вопрос в том, как это решить? - person Boky; 04.02.2020
comment
Чтобы решить эту проблему: где взять информацию о транспортном средстве для мета? Это из URL-адреса, это SPA, вы используете CMS? - person Sydney Y; 04.02.2020
comment
Да, я использую Strapi в качестве бэкхенда, и эти машины прибывают из Strapi. - person Boky; 04.02.2020
comment
Ваше приложение не знает, какой автомобиль отображать, пока не попадет на клиентскую сторону. Так что Facebook тоже не может знать, какой автомобиль. Обойти эту проблему сложно, если вы обслуживаете статические страницы, вам необходимо вставить метатег в HTML перед тем, как обслуживать HTML. Например, GET route '/index.html' в конечной точке вы должны использовать fs.readFileSync для чтения HTML в виде строки и замены мета-значений содержимым из вашего объекта Strapi. Ваша установка не очень подходит для OG. - person Sydney Y; 04.02.2020
comment
Проще говоря: мета находится на каждой странице, и вы создали одностраничное приложение. Поправьте меня, если я ошибаюсь насчет вашей настройки. - person Sydney Y; 04.02.2020