[WordPress] postmeta の _wp_attachment_metadata を解析

postmeta テーブルの meta_key「_wp_attachment_metadata」の値は暗号のような文字列ですが、その内容を解析して理解します。

WordPress のカスタムフィールドのお話です。postmeta の _wp_attachment_metadata とは何なのか。

答えを先に言うと、書かれているのは、生成された各種サイズのバリエーションと、いくつかの画像メタデータです。

ではそれをどう読み取るのかを書いていきます。

_wp_attachment_metadata の値

postmeta

WordPress で「カスタムフィールド」と呼ばれているものは posts テーブルにID でぶら下がる postmeta テーブルのデータです。

項目(meta_key)と値(meta_value)で出来ていて、ユーザーが作るカスタムフィールド以外に、システム的な記述も多く見られます。

添付ファイル( posts の post_type が attachment )のレコードでは、postmeta に次のような項目が作られます。

  • _wp_attached_file … /wp-content/uploads/ 以降のパス
  • _wp_attachment_context … サイトアイコンやカスタムロゴに指定したら作られる
  • _wp_attachment_image_alt … 代替テキストを設定すれば作られる
  • _wp_attachment_metadata … 何やら文字列

_wp_attachment_metadata の値

問題の _wp_attachment_metadata の値です。何だか暗号のような文字列となっておりますね。

wp_attachment_metadata の値
_wp_attachment_metadataの値。暗号の中に情報が埋もれているのが見て取れます。

この中に有益な情報があるのではないかと思ってましたが内容を理解することが難しい。なのでこれまで見て見ぬふりをしていました。でも試しによーく見てみると案外そうでもなく、判ってしまえば「何だそんなことか」という感じでした。

書式を整形

取りあえず人間が見て理解しやすいように整形をしてみましょう。このデータベースで見かけるような書式が何の言語でどういう法則なのか雑魚の筆者には判りませんので、原始的にやっていきます。

波括弧 { } をインデント

まずは波括弧 { } が入れ子になっているのでインデントしたいですね。”{” と “}” に改行を加えると良いでしょう。

  • { → { 改行
  • } → 改行 } 改行

こんなふうに置換してみます。

波括弧に改行を施した
波括弧に改行を施した

改行を入れるだけで判りやすくなりました。コードエディタを使えば波括弧の固まりをぽわぽわと表現してくれるので、入れ子が理解し易くインデントを作れますね。

インデントしてみた
インデントしてみた

入れ子を解明できればさらに見やすくなりました。

セミコロン ; を改行

次はセミコロン「 ; 」です。大抵の場合、この記号は事の終わりを表していると思いますので「 ; 改行」に置換してみました。

セミコロンで改行した結果
セミコロンで改行した結果

ますます理解し易い形になってきました。何が書かれているか一目瞭然ですね。キー 改行 値 改行 キー 改行 値 改行・・・となっています。とすると、この形は気に入らないです。

key と value の分断を防ぐ偶数改行

セミコロンに改行をくっ付けただけでは「キーと値」も改行で分断されてしまい、気に入りません。キーと値のセパレータにもセミコロンがあるせいですよ。

より美しく仕上げるには、行の中で奇数セミコロンはそのまま残し、偶数セミコロンに改行を加えるという措置をしなければなりません。

2個に1個のセミコロンを改行
2個に1個のセミコロンを改行

ほら。キー ; 値 改行 になりました。こうして順序よくやることでひらめきが起きることもあります。

暗号 a:x, s:x, i: が見えた

s:5: とか a: 31: とか i: とか a:6: とか a:5: とか暗号がそこかしこにあります。この暗号のせいで _wp_attachment_metadata が嫌いでしたが、整形して眺めるだけで答えが見えますね。

a: は波括弧の前に付く項目数です。 a:6{ } なら波括弧の中にキーと値が6個ありますよということですね。

s: は直後に書かれるキーまたは値の文字数です。”width” なら、5文字なので s:5:”width”です。

i: は文字列でなく数字をあわらしてますね。値が2400なら i:2400 です。

なーんだ。そんだけのことだったのか。と、判ってしまえば簡単ですが、しかし文字数を頭にくっ付けるほど大事な情報なのだろうかと思えなくもないです。

ここからさらに整形を進めるとすれば、コロンで終わる文字をすべて消し去ってスッキリさせます。そうすると

{
    "key" ; "value" ;
    "key" ; {
        "key" ; "value";
        "key" ; "value";
    }
}

こんなふうになって各項目が取得しやすくなりますね。

何が書かれていたか

一例ですが、こんなことが書かれています。

  • 高さ
  • ファイルパス(wp-content/uploads/ の後ろ部分)
  • ファイル容量
  • サイズバリエーション
    • サイズ名(サムネイルサイズ、中サイズ、大サイズ、その他)
      • ファイルパス(ファイル名末尾に width x height を追加したパス)
      • 高さ
      • mime-type  ( image/jpeg とか)
      • ファイルサイズ
  • メタデータ
    • 絞り
    • クレジット
    • カメラ
    • キャプション
    • タイムスタンプ
    • コピーライト
    • 焦点距離
    • シャッター速度
    • タイトル
    • オリエンテーション
    • キーワード

結局、書かれているのはサイズバリエーションとメタデータで、これらを確認するためだけにあります。

実は内心、もっとWordPressのシステマチックな情報が網羅されていることを期待していたのですが、そういうのはありませんでした。

このデータを取得して活用する機会が果たしてあるのかどうなのか、実務で使うことがあるでしょうか。

実務でどう使うか

バリエーションを網羅されてもそのデータに使い道があるのかないのか微妙です。

でも筆者は以前自分で画像サイズを追加しすぎてファイル数が膨れあがるという失態をしたので、追加したサイズの名前やサイズが確認できるのは良いことかもしれません。増大しすぎたあげく追加したサイズを削除したら今度はその指定で貼り付けていた画像が壊れたアイコンになってしまったということも現在進行形で起きています。それを修復するときにこのデータが役に立つかもしれません。

_wp_attachment_metadata の値には、画像がどのポストで使用されているかといった情報はありません。欲しい情報はこれだったりします。

余談になりますが、それを取得するには posts の本文からアタッチのタグを拾って解析して取得する以外にありません。そうするとサイズバリエーションの名前と実際の width x height をゲットできます。

post_content から添付を拾って書き出し
post_content から添付を拾って書き出した例

そのデータと_wp_attachment_metadata の値を比較することで誤った指定を見つけることができそうです。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください