ADAM DJ BRETT

Home / Blog / Making Blogs Easier to Cite with Zotero

Table Of Contents

I spent part of this week making my sites easier to cite with Zotero. The spark was Martin Paul Eve’s post, “Making blog posts harvestable by Zotero and preserving case in citation fields.” After reading this post I imemdiately how to try and impliment it!.

I implemented the Zotero pattern across several sites I maintain: adamdjbrett.com, jcrt.org, thewhitestonefoundation.org, journal.thenewpolis.com, thenewpolis.com, and esthesis.org. These sites do not all do the same job. Some are personal writing spaces. Some are journals. Some are publication archives. Some are organizational pages. So the implementation had to preserve those differences instead of forcing one metadata pattern everywhere.

The core lesson from Eve’s post is simple: if you want Zotero to import a blog post as a Blog Post, tell Zotero directly. Do not rely only on Open Graph, Dublin Core, or a vague genre hint. The key tag is:

<meta property="zotero:itemType" content="blogPost">

But that tag only works if the page declares the Zotero RDFa namespace. That means adding a prefix to the html element, usually alongside Dublin Core and PRISM prefixes:

<html lang="en" prefix="zotero: http://www.zotero.org/namespaces/export# dc: http://purl.org/dc/elements/1.1/ prism: http://prismstandard.org/namespaces/basic/2.0/">

This is the small piece I had been missing. Metadata tags are not magic. They need to be expressed in a form the translator understands.

The second lesson is more subtle: avoid the wrong scholarly tags on blog posts. Eve notes that citation_title and citation_journal_title can push Zotero toward a journal-article interpretation. That is useful for actual journal articles, but not for blog posts. For blog posts, I used og:title and dc:title for the title, plus citation_author, citation_publication_date, citation_public_url, and citation_language for the rest of the citation data.

For blog posts, the pattern became:

<meta property="zotero:itemType" content="blogPost">
<meta property="dc:title" content="Post Title">
<meta property="dc:creator" content="Author Name">
<meta property="dc:date" content="2026-06-25">
<meta property="dc:identifier" content="https://example.org/post/">
<meta name="citation_author" content="Author Name">
<meta name="citation_publication_date" content="2026-06-25">
<meta name="citation_public_url" content="https://example.org/post/">
<meta name="citation_language" content="en">
<meta name="prism.genre" content="blogentry">
<meta name="prism.publicationName" content="Site Name">

For journal articles, I kept the journal metadata. That means citation_title, citation_journal_title, citation_issn, volume, issue, page range, publication date, full-text HTML URL, and PDF URL where available. This distinction was important on JCRT and The New Polis Journal. A journal article should remain a journal article. A blog post should import as a blog post. Zotero should not have to guess.

The third lesson is about case. CSL processors sometimes title-case fields in ways that damage names. Eve’s example is eve.gd: Martin Paul Eve, which became Eve.Gd: Martin Paul Eve. The fix is CSL’s nocase span:

<meta name="prism.publicationName" content="&lt;span class=&quot;nocase&quot;&gt;eve.gd&lt;/span&gt;: Martin Paul Eve">

I am able to partilially this working with the Firefox Zotero plugin but I am unable to get this working with the Chrome Zotero plugin. Using the chrome plugin here is what I get in Zotero:

Firefox

Blog Title: "eve.gd: Martin Paul Eve"
Date: 2026/05/21
DOI: 10.59348/2thwp-wm553

Chrome

Blog Title: "eve.gd: Martin Paul Eve"
Date: 00:00:00 +0100
DOI: empty

Both the Firefox and Chrome extensions leave the span class in. Firefox successfully picks up the date from Eve's blog but Chrome does not. The same with the DOI.

I am working on trying ot fix the Blog Title upper/lowercase span class issue because I think it would be really helpful to say lowercase, uppercase, sentence case etc while keeping the visible site title can stay clean for social cards, while prism.publicationName carries the case-preserving version for citation tools.

On my personal site, the implementation went into shared Eleventy head and SEO includes. The Codex archive shows the concrete pattern: add RDFa prefixes to the head templates, create a shared Zotero include, and include it from both regular SEO and blog SEO templates. Rendered blog pages then emitted zotero:itemType=blogPost, Dublin Core basics, citation author/date/url/language, and PRISM blog metadata. Other normal pages emitted zotero:itemType=webPage. Redirect and noindex pages were skipped. Just as important: no citation_title or citation_journal_title tags were emitted for blog posts.

For the Whitestone publication sites, the implementation had to be more careful. JCRT has archive articles, Religious Theory posts, author pages, issue pages, and organizational pages. journal.thenewpolis.com has journal-style content. thenewpolis.com and esthesis.org work more like publication/blog hybrids. thewhitestonefoundation.org is the organizational parent, not a journal archive. The shared rule was simple: add the Zotero prefix globally, then conditionally emit item types and citation fields based on page type.

That conditional logic is the difference between useful metadata and noisy metadata. It is tempting to spray every citation tag across every page. But that makes tools guess. Better metadata is more restrained. A post gets post metadata. An article gets article metadata. A homepage gets website metadata. An author page gets creator/person metadata. A search page probably does not need to pretend to be a scholarly object.

This work also sat alongside a broader metadata cleanup. On the Whitestone sites, I was already working with Dublin Core, Schema.org JSON-LD, h-card and h-entry microformats, RSS/Atom feeds, citation sitemaps, and Standard.site records. Zotero harvestability fit into that larger pattern. The aim was not just SEO. It was scholarly interoperability. These sites should be readable by people, citation managers, search engines, archives, and future systems we do not control.

There is a practical reason for doing this on static sites. Static sites are fast, durable, and easier to preserve. But they do not automatically get the metadata affordances that large journal platforms provide. If you publish scholarship with Eleventy, Astro, Jekyll, Hugo, or another static-site generator, you have to build those affordances yourself. That can be annoying, but it is also freeing. You can make the metadata better than the defaults.

The workflow I would use again is straightforward:

  1. Decide which page types exist.
  2. Add the RDFa prefixes to the base HTML template.
  3. Emit zotero:itemType conditionally.
  4. Use blogPost for blog posts and keep journal tags for real journal articles.
  5. Use Dublin Core as a fallback.
  6. Use PRISM publicationName for the blog or site title.
  7. Preserve case with span class="nocase" where needed.
  8. Avoid citation_title and citation_journal_title on blog posts.
  9. Build the site and inspect rendered HTML.
  10. Test the deployed page in Zotero, remembering that the Zotero Connector can cache translators.

The final point is important. I checked rendered HTML during implementation. That confirms the templates produced the intended tags. Zotero import testing still needs to happen on deployed pages, and after metadata changes it is worth resetting Zotero translators before testing. Metadata work always has this split: you can verify your output, but you still need to test the consuming tool.

What I like about Eve’s post is that it treats citation metadata as part of web craft. It is not glamorous. It is not the part of the site most readers notice. But it changes how writing travels. A post that imports cleanly into Zotero has a better chance of being cited correctly. A journal article with good metadata has a better chance of being found and reused. A publication title with preserved case respects the way authors and editors name their work.

That is the larger lesson for me. Scholarly web publishing is not only about putting words online. It is about making those words portable, citable, and durable. Zotero is one small part of that infrastructure, but it is a part many scholars actually use every day. If we want independent scholarly sites to matter, we need to make them easier to cite.

Sources #

P.S. #

Martin has his own dois for his site and that is super cool.

Tags : zotero metadata eleventy digital-humanities web-development

Webmentions

No webmentions yet.

Previous

Book Review: Spiritual Violence: Religious Phenomena That Defile the Faith by Rev. Alba Onofrio

Onofrio’s work offers urgent language for naming the forms of religious harm often hidden beneath the language of faithfulness, doctrine, and institutional authority. The book is both a theological critique and a practical resource for communities seeking repair, accountability, and liberation from spiritual violence.