ブログ

WordPressのカスタムフィールドを使ってデータベースを実現する方法

  1. Nagis Wineworld >
  2. closed >
  3. ブログ >

WordPressのカスタムフィールドを使ってデータベースを実現する方法

手元のデータ、気が付くと保存場所があちこちに散逸してしまって保存したはずなのにどこにいったのか分からない、ということがよくある。一部のものはGoogleスプレッドシートなどのクラウドサービスを利用して経過を記録しているものの、場合によってはあちこちのシートを行き来する必要が出て非常に見にくい。

そこで、もっと手軽に各データを関連付けたうえで必要な視点からまとめてデータを確認できる方法を考えていたところ、案外、Wordpressで構築するのが手間も少なくかつ目的に沿ったものが作れるのではないかという気になった。

やり方次第ではあるものの、Affinger6 Actionが備えているレイアウト機能とも相性がよさそうだ。

https://business.xserver.ne.jp/

Affinger6 Actionは今のところEX版ユーザーのみへの限定公開なので、仮に今すぐActionを使ってみたいようであればEX版を購入する必要がある。

WordPressとデータベースの相性

この話を始める前に一つだけ確認がある。作ろうとしているデータベースとWordpressの相性だ。

WordPressは主にブログの執筆などに使われることが多いし、構造もそれに適したものになっている。つまり、エントリーごとの内容がすでに完結しているデータをつなげていくタイプのデータベースとは相性がいいが、逆に常に変わり続けるデータを追いかけていくような内容のものとは相性が悪い。

完成した製品に使われている各部品のリストを一つのエントリーにしたうえで、そこからやはり完成している各部品の情報を掲載したエントリーにつなげていくようなデータベースとは相性がいいが、日々、もしくは刻々と変わる温度の変化を常に記録し続けるようなデータベースとは相性が悪い、ということだ。

今回欲しいと思っていたデータベースはこのどちらも内容に含んではいるものの、比較的、完成したモノから必要に応じて各部分の情報にアクセスできるようにできることのメリットが大きかったのでWordpressでも特に問題はないと判断した。

エントリーは部分ごと

今回作るデータベースのイメージは、1冊の本の情報を記録したエントリーをまず作り、そこに著者や出版社といったそれぞれの詳細情報を記載した別のエントリーをリンクでつなげていく、というものだ。

大事なのは情報を一つにまとめ過ぎないこと。ここをまとめ過ぎてしまうと汎用性が悪くなる。

各エントリーに書かれた情報はそれほど多くなくてもいいので、とにかくエントリー同士をリンクしていくことで柔軟性をもった構造にする。

やり方はWordpresで通常のエントリーを書く場合に表を作って、そこに記入した各文字にリンクを貼っていくのでも問題はない。問題はないのだが、この方法だと情報の内容に一貫性がなくなる可能性が高くなる。そこで、今回はカスタムフィールドを利用して常に一定の項目に基づいた内容を記入していくようにする。

カスタムフィールド用プラグイン【Custom Field Template(カスタムフィールドテンプレート)】

さて普段であれば極力、プラグインを使わずにこうした機能の実相をして行くところだ。なによりWordpressではカスタムフィールドの利用は特にプラグインの導入やphp側での変更を要求されない。

ではなぜ今回はプラグインを利用することにしたのかといえば、Wordpressの標準機能があまりに使いにくいためだ。Wordpressの標準機能では一度設定したカスタムフィールドは別の記事でもそのまま使いまわすことは可能だが、都度、呼び出さなければならない。一方でプラグインを使うと必要な項目がすべて予め表示されている状態になっている。

これは項目の抜けを防止する意味でも、わざわざ項目を呼び出す手間をかけずに済むという作業性の面でも大きな影響がある。特にデータベース利用では入力項目数が非常に多くなるので、それを都度、わざわざ呼び出すなどかける時間の無駄が過ぎる。

そこで、専用プラグインの利用だ。

WordPress用のカスタムフィールドプラグインとしてはいくつものものが公開されている。Advanced Custom Fieldsなどはかなり有名で使い方を説明したサイトも数多い。

しかしいくつかのプラグインを試してみたうえで、今回はCustom Field Template (カスタムフィールドテンプレート) を使うことにした。このプラグインに決めた理由は次の通りだ。

  • 出力にショートコードが利用できる
  • 簡単に表として出力できる
  • グーテンベルクとの相性も良くカラム内にも出力できる
  • 手間なくカスタムフィールドにリンクを記載できる

順にみていく。

ショートコードによる出力

カスタムフィールドテンプレートはデフォルトでショートコードを使った出力に対応している。これは個人的には非常に魅力的だった点だ。

例えば先のAdvanced custom fieldなどではカスタムフィールドに記載した内容を出力するためには、原則として呼び出し用のタグをテンプレート内に記載しておく必要がある。タグはphpで記載されているので、そのままではエントリー内に直接記述することは出来ない。

こうなってしまうとテンプレート内の決まった場所に出力するのには向いていても、記事内のどこでも好きな場所に出力させる、というようなフレキシブルな運用が出来ない。

またAdvanced custom fieldの出力タグはフィールド名を指定して呼び出しをかけるので必要になるフィールド名を指定したタグを複数書き込むことも面倒だ。確かにこの方法は出力内容を自由に組み替えられるメリットはあるものの、今回のデータベースのように常に決まった内容を出力させたい場合には手間でしかない。

その点、エントリー内で任意にショートコードを記述することで手軽に呼び出せるカスタムフィールドテンプレートの実用性は非常に高いと判断した。

表としての出力が可能

Advanced custom fieldでも別のオプションプラグインを入れれば表としての出力が出来るようだが、カスタムフィールドテンプレートではそのような追加プラグインなしで元々、テーブル形状での出力が出来る。

こちらもプラグインの設定画面内で事前に表としての出力用の設定をしておく必要があるにはあるが、個人的には手間も大してかからず簡単だったと感じている。出力用のサンプルコードも予め用意されているので、特にphpなど知らなくても自分で容易に設定できるのも嬉しい点だ。

ちなみ設定がよく分からない、という場合にはこちらの記事をお勧めする。非常に分かりやすかった。

グーテンベルクとの相性がいい

これは使い方として正しいかどうかは分からないが、少なくともグーテンベルクの特徴を活かしてデザイン性のあるページ内にカスタムフィールドの内容を出力させたい場合にも、それが手軽に実現できることは間違いない。

すでに書いたように、カスタムフィールドテンプレートでは記載したカスタムフィールドの出力にはショートコードを利用する。このため、例えばグーテンベルクで2列のカラムを作って、片側に写真を入れ、もう片側にカスタムフィールドの内容を出力したい、というような場合にも悩むことなく実現できる

これがタグを、しかもテンプレート内に入れなければならないようなやり方になってしまうと、気軽に出来るとは思えなかった。

リンクの作成に手間がかからない

これがこのプラグインを使うことに決めた最大の理由だ。

今回作りたいのはデータベース。しかも一つのエントリーから枝分かれするように関係するエントリーにつなげていく積層型のものだ。こうなると、エントリーから別のエントリーにリンクを貼れなければ意味がない

だが、通常、カスタムフィールドの内容はmetaとして記載されてしまうのでそのままではリンクとして認識させることが出来ない。これをリンクとして認識させるためにはfunction.phpを維持ってmeta情報を取得し、それをリンクとして認識させ直す必要がある。

一方でこれを試してみたところ、リンク先のURLをそのまま記載するような場合であればそれほど困らないのだが、サイト内の別のエントリーにつなげたい、という場合には少々、問題が出てくる。フィールド内に直接URLを記入していないケースが多くなるためだ。

例えば本の著者情報のエントリーにつなげたい場合、カスタムフィールドの項目名が「著者」となっているのにそこに記載された情報がURLというのはどうにも美しくない。ではカスタムフィールド内には著者名で記入して、別ファイルでその名前からURL情報を取得させてリンクにする、というのは全ての著者や出版社など、ぶら下がるすべてのエントリーに対する対応表を作る必要が出てしまう。ここはデータベースの肝になる部分なので、手間なく、簡単に実現できなければ意味がない。

Advanced custom fieldではフィールドの性質として別のエントリーを指定できるのだが、この指定をしていても通常に出力させてしまうとmeta情報として出力されてしまってリンクが貼られていない状態になってしまう。

一方で、カスタムフィールドテンプレートではそのカスタムフィールドのtypeをtextareaにしておいて、さらにhtmlEditor = trueの記述をしておくと普通に入力画面上でリンク用のaタグを使えるようになる。実際にやってみると、エントリーの名前から検索を自動でかけてきて、選択するとリンクが貼れる。function.phpをいじる必要などまったくなく、最初の項目の設定さえしておけば後は完全に手間いらずだ。

今回、これが出来ることが判明するまでに半日の時間を溶かした。

地味に便利なフォーマットの使い分け

さらにカスタムフィールドテンプレートを使ってみて、地味だがとても便利だと感じたのが複数のフォーマットの使い分けに対応していることだ。

Advanced custom fieldなどではフィールド名を指定して個別のタグで出力させるので、フィールドの呼び出しに際しては組み合わせは自由度が高い。一方でカスタムフィールドテンプレートではショートコードを用いて一括で呼び出しているので、都度、自由に内容を組み替えるというわけにはなかなかいかない。

そこで便利なのが、予め用意するカスタムフィールドの種類をフォーマットとして複数用意できる機能と、そのそれぞれのフォーマットを異なった出力方式で呼び出せる機能だ。

今回はすでにデータがある内容を使ってデータベースを組むことを目的にしているので、必要となるデータの組み合わせは分かっている。つまり、都度自由に組み替えるような必要性はない。どの製品を入れる場合にはこの内容が揃ったフィールドの組み合わせがあれば十分、という使い方ができる。

出力方法も内容の組み換えを含めて自由に、複数用意できるので実用上、困ることは全く無いように思えた。

実行してみたデータベースの構造

今回試しに作ってみたデータベースでは、各エントリーのタイトルを製品や部品の名前にし、内容はすべてカスタムフィールドに記載した。

カテゴリーはそのエントリーに記載されているものが所属するジャンルを指定し、細かいことはタグで検索、一覧表示できるようにした。

データベースとしての利用であるため注記事項などもカスタムフィールドとして項目を用意し、エントリー本文への記入は一切ない形にしている。また簡単な経時による変化の内容などはコメント欄を利用するようにした。

独立した項目はすべて別々のエントリーとして準備し、それぞれのフィールドからサイト内リンクとすることで一つのエントリーに記載される内容をシンプルにしつつ、全体を把握しやすい形にしている。

WordPressをデータベースとして利用する方法をググってみるとphpをいじる内容のものがかなり多く出てくるが、今回はプラグインを一つインストールするだけであとは特にphpをいじることなく、概ね、やりたい形が実現できたと感じている。

\\当サイトでも使用中のWordPressテーマ//

AFFINGER5 WINGを購入する

価格 14,800円(税込)※EX版はスタンダード版購入後に追加購入

\\当サイトの現在のテーマ AFFINGER5 EXを同梱//

AFFINGER PACK3を購入する

セット価格 55,900円 → 39,800円


-ブログ
-, , , ,