Skip to content

Conversation

yasulab
Copy link
Member

@yasulab yasulab commented Sep 2, 2025

インストール済みの redirect_from プラグインを使うと Front Matter でリダイレクトでき、関心の対象も1ファイルにまとめられるので、対応してみました! 🛠💨✨ cf. https://github.com/jekyll/jekyll-redirect-from

@Fukusan64
Copy link
Collaborator

/contests/terms.html などのパスをSNSに貼られた時
ogpの画像や説明文が出せない(生成されるhtmlに含められない)ため以下のPRでもとに戻しています。
紛らわしいのでredirect_fromを取り除いても良いかもと思いました 🙇
#69

@yasulab yasulab force-pushed the refactor-redirects-by-redirect-from-plugin branch from b917845 to 502febb Compare September 2, 2025 10:25
@yasulab
Copy link
Member Author

yasulab commented Sep 2, 2025

ogpの画像や説明文が出せない

なるほど! とすると redirect template で解決できそうなので、こんな感じでどうでしょう...? 💭 502febb

Copy link
Collaborator

@Fukusan64 Fukusan64 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます。
しかし、_layout/redirect.htmlを使った方法だと

<meta property="og:title" content="『DojoCon Japan 2025 プログラミングコンテスト』応募方法 | DojoCon Japan 2025" />

この辺りの情報が取れないようなので、あえて採用を見送っております。

情報を小出しにする形になってしまい、すみません。

@yasulab
Copy link
Member Author

yasulab commented Sep 2, 2025

確かに...!! パッと手元で {% page %} のコンテキスト情報を確認してみましたがリダイレクト先の front matter 情報が格納されてなさそうなので (redirect_from で解決する場合は) Plugin 経由などでコンテキスト情報を渡してあげる必要がありそうですね... 😭 コメントありがとうございます!! 🙏✨

{
  "sitemap" => false,
  "layout" => "redirect",
  "permalink" => "/contests/terms.html",
  "redirect" =>
    {
      "from" => "/contests/terms.html",
      "to" => "http://localhost:4000/contests/terms/"
    },
  "content" => "",
  "dir" => "/contests/",
  "excerpt" => nil,
  "name" => "redirect.html",
  "path" => "redirect.html",
  "url" => "/contests/terms.html"
}

@yasulab yasulab closed this Sep 2, 2025
@yasulab
Copy link
Member Author

yasulab commented Sep 2, 2025

Plugin 経由などでコンテキスト情報を渡してあげる

興味本位でサクッとプラグインを書いてみましたが、確かにココまで書くなら既存のハードコーディングでも全然十分そうですね 🙇‍♂️💦 (恐らく今回のようなリダイレクト用ファイルも今後は増えないかなとも思いますので 🤔💭)

───────────────────────────────────────────────────────────────────────
added: _plugins/redirect_with_metadata.rb
───────────────────────────────────────────────────────────────────────
@ _plugins/redirect_with_metadata.rb:1 @

module Jekyll
  class RedirectWithMetadata < Generator
    priority :lowest

    def generate(site)
      redirect_map = build_redirect_map(site)

      redirect_pages = site.pages.select { |page| page.data['redirect'] }
      redirect_pages.each do |page|
        target = redirect_map[normalize_url(page.data['redirect']['to'], site)]
        copy_metadata(from: target, to: page) if target
      end
    end

    private

    def build_redirect_map(site)
      pages_with_redirect_from = (site.pages + site.documents).select { |p| p.data['redirect_from'] }
      pages_with_redirect_from.flat_map do |page|
        [page.url, page.data['permalink']].compact.map { |u| [u.chomp('/'), page] }
      end.to_h
    end

    def normalize_url(url, site)
      url.sub(site.config['url'] || '', '')
         .sub(site.config['baseurl'] || '', '')
         .chomp('/')
    end

    def copy_metadata(from:, to:)
      from.data.each do |key, value|
        to.data[key] = value unless %w[layout redirect redirect_from permalink].include?(key)
      end
    end
  end
end

@yasulab yasulab deleted the refactor-redirects-by-redirect-from-plugin branch September 2, 2025 12:12
yasulab added a commit that referenced this pull request Sep 2, 2025
@Fukusan64
Copy link
Collaborator

こんな事も出来るんですね
Jekyll への理解が甘くとりあえず動くよう直書きを選択していました

今後もし、何か書き方で困ることがあった時に
テキスト等でご相談させていただくかもしれません
その時はよろしくお願いします!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants