Discourse не генерирует большие, более привлекательные карточки Twitter

Сверху: Как Discourse генерирует не очень привлекательную так называемую «мини-карточку».

Снизу: Правильная большая карточка Twitter.

Решение:

Пожалуйста, измените…

<meta name="twitter:card" content="summary" />

на

<meta name="twitter:card" content="summary_large_image">

в ядре.

Ссылка:

3 лайка

Привет, @Terrapop

Я не думаю, что это решение. Иногда изображения бывают плохими. А плохие изображения с summary_large_image — это действительно плохо.

Может быть, стоит добавить опцию, чтобы пользователь мог менять summary на summary_large_image.

3 лайка

В моём случае я бы выбрал это, так как мы гарантируем, что изображения, добавляемые к темам, которые мы публикуем в Twitter с нашего аккаунта, имеют достаточный размер. Насколько мне известно, Twitter автоматически переключается на уменьшенную версию, если вы не предоставили изображение достаточного размера, даже если указан summary_large_image.

Ещё лучше было бы, если бы размеры изображений проверялись ядром, и в зависимости от минимально требуемых размеров автоматически использовался бы summary или summary_large_image (минимум 300x157).

Если это вообще невозможно, я был бы очень рад хотя бы иметь возможность использовать summary_large_image вместо summary.

2 лайка

Есть ли способ переопределить поведение def crawlable_meta_data с помощью простого плагина?

В частности, мы хотели бы изменить:

elsif opts[:image].present?
      result << tag(:meta, name: 'twitter:card', content: "summary")
      result << tag(:meta, name: "twitter:image", content: opts[:image])

на

elsif opts[:image].present?
      result << tag(:meta, name: 'twitter:card', content: "summary_large_image")
      result << tag(:meta, name: "twitter:image", content: opts[:image])

так как мы сильно зависим от Twitter и больших карточек для вовлечения аудитории.

Я довольно новичок в Ruby, поэтому любая подсказка в правильном направлении будет очень кстати.

Обновление: Вот код plugin.rb для тех, кто хочет исправить ядро из-за маленьких изображений в Twitter:

after_initialize do
 reloadable_patch do |plugin|
  ApplicationHelper.module_eval do

    def crawlable_meta_data(opts = nil)
        opts ||= {}
        opts[:url] ||= "#{Discourse.base_url_no_prefix}#{request.fullpath}"

        if opts[:image].blank?
          twitter_summary_large_image_url = SiteSetting.site_twitter_summary_large_image_url

          if twitter_summary_large_image_url.present?
            opts[:twitter_summary_large_image] = twitter_summary_large_image_url
          end

          opts[:image] = SiteSetting.site_opengraph_image_url
        end

        # Доступны ли ширина и высота?

        # Используйте правильный формат для изображений opengraph/twitter
        opts[:image] = get_absolute_image_url(opts[:image]) if opts[:image].present?
        opts[:twitter_summary_large_image] =
          get_absolute_image_url(opts[:twitter_summary_large_image]) if opts[:twitter_summary_large_image].present?

        # Добавляем теги opengraph и twitter
        result = []
        result << tag(:meta, property: 'og:site_name', content: SiteSetting.title)

        if opts[:twitter_summary_large_image].present?
          result << tag(:meta, name: 'twitter:card', content: "summary_large_image")
          result << tag(:meta, name: "twitter:image", content: opts[:twitter_summary_large_image])
        elsif opts[:image].present?
          result << tag(:meta, name: 'twitter:card', content: "summary_large_image")
          result << tag(:meta, name: "twitter:image", content: opts[:image])
        else
          result << tag(:meta, name: 'twitter:card', content: "summary")
        end
        result << tag(:meta, property: "og:image", content: opts[:image]) if opts[:image].present?

        [:url, :title, :description].each do |property|
          if opts[property].present?
            content = (property == :url ? opts[property] : gsub_emoji_to_unicode(opts[property]))
            result << tag(:meta, { property: "og:#{property}", content: content }, nil, true)
            result << tag(:meta, { name: "twitter:#{property}", content: content }, nil, true)
          end
        end

        if opts[:read_time] && opts[:read_time] > 0 && opts[:like_count] && opts[:like_count] > 0
          result << tag(:meta, name: 'twitter:label1', value: I18n.t("reading_time"))
          result << tag(:meta, name: 'twitter:data1', value: "#{opts[:read_time]} mins 🕑")
          result << tag(:meta, name: 'twitter:label2', value: I18n.t("likes"))
          result << tag(:meta, name: 'twitter:data2', value: "#{opts[:like_count]} ❤")
        end

        if opts[:published_time]
          result << tag(:meta, property: 'article:published_time', content: opts[:published_time])
        end

        if opts[:ignore_canonical]
          result << tag(:meta, property: 'og:ignore_canonical', content: true)
        end

        result.join("\n")
      end

  end
 end
end

Но было бы лучше, если бы в будущем появилась опция для этого, и ядро оценивало бы минимальные размеры изображений в Twitter, чтобы выбирать между summary_large_image и summary (для очень маленьких изображений), если администратор включит новую настройку: «Включить большие изображения Twitter summary».

6 лайков

Я хотел бы узнать, возможно ли изменить текущее поведение, при котором всегда отображается summary_large_image, на summary — я наткнулся на этот пост, но, похоже, там речь идёт об обратном. Поэтому я предполагаю, что кто-то уже реализовал это… однако возможно ли сделать наоборот? Есть ли такая опция? Я попытался найти её в настройках администратора, но не нашёл.

1 лайк

Для тех, кто тоже хочет этого (всегда использовать summary_large_image) — я взял код от @Terrapop и превратил его в плагин, который можно подключить:

- https://github.com/CubeCoders/discourse-twitter-large-card

Что бы я действительно хотел сделать, так это что-то похожее на карточку GitHub, которую вы видите, прикреплённую к этому сообщению: способ автоматически генерировать динамические карточки для любой темы. Сейчас карточка будет использовать первое изображение подходящего размера в сообщении. Так что, если вы создадите сообщение, начинающееся с изображения, оно будет использовано в карточке.

1 лайк