この投稿では、Webmention.io API を使用して、人々がブログ投稿に対して行ったすべてのインタラクションを表示する方法を示します。
これを機能させるには 2 つのものが必要です:
Webmention.io のセットアップ自体は、この Web サイトですでに詳細な手順が提供されているため、この投稿の範囲外です。
それでは、必要なカスタム JavaScript に進みましょう。
以下は完全な JavaScript コードです。コードの後に各部分がどのように機能するかを説明します。
if (document.querySelector("body").classList.contains("post")) { function setContent(child) { switch (child["wm-property"]) { case "in-reply-to": return child.content?.text; case "like-of": return "liked this"; case "repost-of": return "reposted this"; default: return "interacted with this post in an unknown way"; } } async function fetchInteractions(headerTitle) { const response = await fetch("https://webmention.io/api/mentions.jf2?target=" + document.URL); const data = await response.json(); if (data && data.children.length > 0) { const interactions = document.createElement("div"); interactions.innerHTML = `<h3>${headerTitle ?? "Interactions"}</h3>`; for (const child of data.children) { const interaction = document.createElement("div"); interaction.innerHTML = ` <p> <strong><a href="${child.author.url}" target="_blank">${child.author.name}</a></strong> <small> - ${new Date(child["wm-received"]).toLocaleString("en-US", { month: "short", day: "numeric", year: "numeric", })}</small> </p> <blockquote>${setContent(child)}</blockquote> `; interactions.appendChild(interaction); } const upvoteForm = document.getElementById("upvote-form"); upvoteForm.parentNode.insertBefore(interactions, upvoteForm.nextSibling); } } fetchInteractions(document.currentScript.getAttribute("data-interactions")); }
主なロジックは fetchInteractions() 関数内にあり、この関数は 1 つのパラメーター (すべてのインタラクションのヘッダーとして表示するテキスト) を受け入れます。デフォルトでは、ヘッダー テキストは「Interactions」ですが、