誰がログ

歯切れが悪いのは仕様です。

Zoteroから文献情報を取得してWordpressで表示させる仕組みを作った

はじめに

少しずつ作って少しずつ試してきたものがようやく実際に運用できるくらい形になったので、まとめておきます。

作ったものだけでなく背景・事情まで含めるとけっこういろいろな話がありますので、先に簡単にまとめておくと、この記事には次のようなことが書いてあります。

  • Zoteroから文献情報を自動的に取得するWordpressのオリジナルプラグインを作り、文献の種類ごとにアレンジして表示させる仕組みを整備した
  • Zoteroから文献情報を取得する際に必要な文献ごとのIDを簡単にコピーできるアプリ版Zoteroのオリジナルプラグインを作った
  • どちらも、生成AIにかなりのことをやってもらった

なお、いずれのツールも今のところ公開する予定はありません。これまでアプリやプラグインなどを開発した経験がないのでどのようにすれば良いかあまり考えられていません。

作ったものの宣伝でもないのになんでこんな記事を書いたかというと、こういう「かなり特定の用途にしか使えないけど特定の人にとってはあると地味に便利なツール」が技術力が足りていなくてもなんとか作れるようになったのは生成AIのおかげだなあと実感したからです。

簡単な背景

はてなブログからWordpressへ

発端は、はてなブログの記事から専門的なものをWordpressで作成している個人サイトに移行する計画です。少し前に書いたはてなブログの記事が生成AIから読めないという事情も少し関わりますが、ブログの記事は流れやすく後で参照するのが難しいので、生成AIの問題がなくても個人サイトへの移行は行う予定でした。

自分のはてなブログを生成AIに読んでもらえないか試したらやっぱりできなかったので今後どうしようかな - 誰がログ

これらの記事には文献の紹介が多く含まれるので、文献の情報をうまく表示させる仕組みがほしい、でもアフィリエイト抜きでWordpressで書籍を紹介するツールは意外と少ない(後で補足)、じゃあZoteroから情報を引っ張って来れれば将来的には楽な仕組みができるんじゃないか、と考えました。

当初予想していたより複雑な仕組みになった気もしますが、使い勝手は今のところ快適ですし、この後書くように生成AIがあることでかなりのスピードで実現できました。

Zoteroだと何が良いか

Zoteroは文献管理ツールとしてだけ見ても優秀ですが、ほかのツールやサービスとの連携がしやすいのがさらに良いところです。今回のアイディアもZoteroがAPIを提供してくれていることですんなり実現につながりました。

また、書籍についてはAmazonやGoogle BooksなどのAPIを使うこともでき実際に少し試してもみたのですが、書誌情報が間違っていることもありますし、そもそも参照・紹介したい文献は書籍に限りません。openBDのように提供が停止されるようなこともあり、文献情報は手元にあるものを使った方が良さそうだという結論になりました。

Zoteroにすでに文献情報がある場合はそれがそのままサイトで使えるわけですし、新規に登録する場合も、サイトで言及するような文献は今後論文や研究発表、授業の資料などで言及する可能性もありますから、Zoteroを拠点にできると全体としては労力が減らせるだろうという見込みもあります。

作業環境

ほとんどの作業を、Zedというエディターと生成AIの組み合わせで行いました。使用モデルはClaude Sonnet 4です。生成AIを組み込んだエディターとしては断然有名なCursorも使っていますが、個人的にはこちらの方が好きです。

Zed — Code with LLMs

実は元々VS Codeになんとなくなじめず、ずっとAtomというエディターを使っていました。Atomが開発終了となってからは「後継」と期待されていたZedをずっと試してきたのですが、特にここ1, 2年くらいで生成AIとの連携だけでなくエディター全体としての使いやすさがかなり向上したと実感しています。VS Code, Cursorよりも拡張機能がかなり少ないのが今のところの弱点と言えるでしょうか。私のように技術的にあれこれやるわけではない人間にとっては今のところそれほど大きな支障はありません。

CursorはClaude Codeを試す時に少しだけ使いました。

この後、「作りました」などと書いてあるものはすべて生成AIに作業してもらっています。毎回書くとくどいので先にまとめて宣言しておきます。

作ったもの1: Zoteroから情報を取得してWordpressで表示させる

情報を取得するオリジナルプラグイン

まず、ZoteroのAPIを使って文献情報を取得するオリジナルプラグインを作成しました。

仕組みとしては文献情報専用のカスタム投稿タイプを新設し、そこに記事のような形で文献情報を蓄積していきます。固定ページなどで直接文献情報を表示させれば良いじゃないかと思うかもしれませんが、同一の文献を複数のページで参照する可能性を考えると、この1ステップを入れておく方が結果的にスムーズです。

そのカスタム投稿タイプの編集記事でZoteroに登録してある文献の固有IDを入れると、以下のようにそのほかの情報が自動的に取得されます。

カスタム投稿の編集画面でZoteroから文献情報を取得できる

細かい設定についてもいくつか試行錯誤があって、頻繁にAPIを叩くと良くないので一定期間キャッシュを保存する仕組みにしたり、それだとZoteroの方で文献情報を修正した際にすぐに反映されないので手動で文献情報を更新するボタンを付けたり。

作成したカスタム投稿の記事は次のような見た目になります。

文献情報が登録されるカスタム投稿の記事

これはほかのページなどで文献情報を参照するためのベースなのでこの記事自体には文献情報は表示していないのですが、おまけとしてこの文献がサイト内のどのページで参照されているかのリストを自動的に作成する仕組みも持たせました。やってみるとWordpressのエラーが出まくってしまって、実はもしかしたらおまけなのにここが一番時間かかったかもしれません。原因はまったく予期していなかったプラグインとの競合でした(これも生成AIに相談しながら対応して解決)。

Wordpressに表示させる仕組み

さて、やりたいのは上でWordpress内に作成した文献情報をほかのページや記事にうまく表示させることです。

これはカード型でWordpressのブロックエディターでも編集できるように作りました。ブロックエディターで下記のような形で文献情報を呼び出せます。画像で一番上にある「Resource Card」というのがそれです。

Wordpressのブロックエディタで文献情報カードを挿入する

このブロックを選択すると、編集画面に下記のようなリストが出てきて、登録済みの文献から検索してその情報を自動で挿入できます。

Resourch Cardの編集で登録した文献情報を呼び出す

ページや記事には、最終的に次のような見た目で表示されます。

文献情報カード(書籍)

実際に使用しているページはこちら。

[読書案内] 形態論の入門書・教科書・概説書 | 田川拓海

文献ごとに表示内容を変える

これだけでも十分かなと思ったのですが、せっかくZoteroから文献情報を自動で丸ごと取得できるわけなので、その情報をうまく使ってもう少しきれいに文献情報を表示できないかと考えました。

たとえば、文献情報カードの左肩に付いている「書籍」という文献タイプは、私が入力しているわけではなくZoteroに登録されているItem Typeの値(ここではBook)から自動的に判別して表示しています。

さらに、論文や書籍の一部(Book Section)では表示が必要な情報が違うので(論文なら巻号や掲載ページなど)、やはりItem Typeの値を条件にして表示情報を変えることにしました。まだ一部調整が済んでいませんが、論文などのタイプだと下記のようになります。

文献情報カード(論文、書籍の一部)

これは私が文献のタイプごとに何かを選択したり編集したりしているわけではなく、Zoteroから取得した情報を元に自動で判別して適切な項目と内容を表示させています。

作ったもの2: 文献の固有IDを取得するZoteroのプラグイン

さて、どの文献の情報を取得するかの手がかりとしては、文献固有のIDを使うのが確実です。

Zoteroでは文献固有のIDとしてItem IDというものがあるのでそれを使えば良いのですが、普通に使っているとこの情報を手に入れるにはWeb版ZoteroでURLに含まれている文字列をコピーしなければなりません。

これは少しの文献で試してみてもけっこう面倒だったので、アプリ版のZoteroで個々の文献の右クリックメニューからそのItem IDをコピーできるようにするZoteroのプラグインを作成しました。

これは最初Claude Code(ProプランなのでこちらもSonnet 4)に作成してもらったのですが、うまく動かなかくてZedでSonnet 4とチャットしながら微調整してなんとかなりました。

これこそまさにほかに誰が使うか何の用途があるかよく分からないけどあると個人的にはものすごく便利なツールだなあと思いながら作っていました。

細かい背景・事情に関する補足

最初の方にも少し書いたのですが、Wordpressでアフィリエイトなしで書籍の情報を取得して表示させる方法は意外に難しいです。アフィリエイトありだとAmazonや楽天ブックスと連携して書誌情報と書影をきれいに表示できるプラグインがあるんですけどね。

アフィリエイトを使わないというのははてなブログでも個人サイトでも一貫した方針なので、ここは面倒でもがんばることにしました。論文などさまざまなタイプの文献情報を一貫した方法で取り扱えるようになったので結果としては良かったです。

プラグインとしては実はhanmoto-helperというプラグインが良い感じだったのですが、これも上に書いたようにopenBDが提供を停止してしまったので書誌情報を取得できませんでした。

おわりに

私自身はPythonやRなど、研究で触ることのある言語の経験が少しというくらいの人間で(それも先人の作ったものを少し修正する程度)、今回ここまでできたのは生成AI様々というしかありません。作るプロセスだけでなく、トラブル、エラーが発生した時の対応について柔軟に相談できるのも良いですね。

しかも方針を決めるとコーディングなどの作業は生成AIが素早くやってくれるので、ちょっとした空き時間に少しずつプロジェクトを進めることができたのも助かりました。

すでに書いたように、こういうほかに誰か必要な人がいるかは分からないけどあると自分にとってはすごく助かるツール、のようなものに比較的気軽にチャレンジできるようになったのは、生成AIの大きな恩恵の1つなのではないかとさいきん実感することが多いです(ほかにもいくつかチャレンジ中)。