GitHub PagesのJekyllでogpタグを出力する

GitHub Pagesのドキュメントによるとjekyll-seo-tagというプラグインが使えるみたいです。

github.com

まず_config.ymlに以下の記述を追加します。

gems:
  - jekyll-seo-tag

それから_layouts/_default.htmlなどタグを出力したい位置に{% seo %}という記述を追加します。

<html>
  <head>
    {% include head.html %}
    {% seo %}
  </head>
</html>

とりあえずこれだけでサイトの設定や記事のデータに応じて必要最低限のタグは出力されますが、各ページや記事のヘッダ部分のYAMLにimage属性を記述しておくとog:imageタグを出力できます。

---
layout: post
title: "GitBucket 4.2 released!"
date: 2016-07-02 00:00:00
image: /images/gitbucket-4.2/adminlte.png
categories: gitbucket
---

他にもいろんな設定があるみたいなのでjekyll-seo-tagのREADMEを読んでおくとよいでしょう。

ちなみにjekyll-auto-imageプラグインを使うと記事中の画像ファイルのパスを自動的に取得できるのでogpやtwitterカードなどのタグを簡単に生成できそうですが、残念ながらGitHub Pagesでは使えないみたいです。

github.com

JekyllでTwitterカード用のタグを出力する

前回紹介したjekyll-seo-tagプラグインはogp用のタグは出力してくれるのですが、twitterカード用のタグを出力するにはTwitterのユーザ名を設定しないといけないようです。

GitBucketは自分のTwitterアカウントで情報を流していますが、プロジェクトとしてのアカウントはまだありませんし、Twitterカード自体はtwitter:siteを出力しなくても動作する様子です。グーグル先生に聞いてみたところ以下のような記事を見つけたので、これとjekyll-seo-tagプラグインを参考にしてtwitterカード用のタグをいい感じに出力するテンプレートを作ってみました。

davidensinger.com

{% assign twitter_description = page.description | default: page.excerpt | default: site.description %}
{% if twitter_description %}
  {% assign twitter_description = twitter_description | markdownify | strip_html | strip_newlines | escape_once %}
{% endif %}
{% if page.title %}
  {% assign twitter_title = page.title | append: " - " | append: site.title %}
{% else %}
  {% assign twitter_title = site.title %}
{% endif %}
{% if page.image %}
  {% assign twitter_image = site.baseurl | append: page.image %}
  {% assign twitter_card = "summary_large_image" %}
{% else %}
  {% assign twitter_image = site.baseurl | append: "/favicon.png" %}
  {% assign twitter_card = "summary" %}
{% endif %}
<meta name="twitter:card" content="{{ twitter_card }}">
<meta name="twitter:title" content="{{ twitter_title }}">
<meta name="twitter:url" content="{{ site.baseurl }}{{ page.url }}">
<meta name="twitter:description" content="{{ twitter_description }}">
<meta name="twitter:image:src" content="{{ twitter_image }}">

これを_includes/head.htmlなどに入れておけばOKです。画像ファイルはjekyll-seo-tagプラグインと同じく記事ごとにヘッダのYAML部分のimage属性に指定する必要があります。

これで記事のURLをツイートすると以下のような感じで表示されるようになります。

jekyll-seo-tagプラグインのソースを見てるとtwitter:cardを出力するだけでもいいっぽい(ogp用の該当する情報を自動的に拾ってくれる?)のですが、自分で試してみたところ、TwitterAndroidアプリでは表示されるけどWebでは表示されなかったりしたのでとりあえずogpとTwitterカード用のmetaタグを両方出力するようにしています。