[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 、またはvalue のみ配列で書かれたりしています。

JSONに似ていますが、key と value それぞれに、種類と文字数を示した暗号がくっ付きます。また、オブジェクトも { }、配列も{ } で括るので見分けが付かず厄介です。

このデータを他の形式、例えば JSON などに変換することができる関数が javascript や PHP にあるような気配ですが、詳しいことは知りません。ちょっと検索して調べた程度ではぜんぜん判りませんでした。

面倒なことをせず、テキストを分解することで判読するくらいならできそうです。

書式を人力で整形

取りあえず人間が見て理解しやすいように整形をしてみましょう。原始的にやっていきます。

波括弧 { } をインデント

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

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

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

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

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

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

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

セミコロン ; を改行

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

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

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

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

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

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

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

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

実際には単に偶数・奇数として扱えば失敗します。行ごとに処理して、0 にセット、1を足す、リセットする、といった地道な計算でキーであるか値であるか判断していくことになります。

暗号 a:x, s:x, i:

s:5: とか a: 31: とか i: とか a:6: とか a:5: とか暗号がそこかしこにあります。この暗号のせいで _wp_attachment_metadata が嫌いでしたが、これは直後に続くKeyなりValueなりを説明するラベルのようなものです。

a s i b が示すことがら

a

a:x は以降の羅列がオブジェクトの束または配列であることを示しています。よってこの暗号の後には波括弧 { } が現れます。数字は項目数です。 a:6{ } なら波括弧の中にキーと値が6個ありますよということですね。

ここでややこしいのは、キーと値のセットが複数含まれる場合もあれば、値だけが配列で羅列されることもあります。JSONではオブジェクトなら { }、配列なら [ ] ですが、その区別がありません。

s

s:x は直後に書かれるキーまたは値が文字列であるという意味で、数字は文字数です。”width” なら、5文字なので s:5:”width”です。

i

i:x は直後にあるのが数字であることを示しています。値が2400なら i:2400 です。

注意が必要なのは、値に使われる以外に、配列のラベルにも同じように使われることです。配列は [0] から始まる数字で、普通の配列のテキストではその数字が目に見えることはあまりないですね。

{ ‘りんご’, ‘みかん’, ‘バナナ’ } とか [ ‘りんご’, ‘みかん’, ‘バナナ’ ] というように普段使います。目には見えないがバナナは [2] ですね。

ところがこいつはその配列の数字ラベルを i:0, i:1 みたいに剥き出しにします。 値が数字であることを示すのも配列の番号を示すのもどっちも i なので厄介です。

b

b:x は、論理値であることを示します。b:0 はfalse、b:1 は true です。

 

そんなわけで、キーと値のそれぞれの頭にくっ付くこの暗号を消去することで、よりスッキリさせることができました。そうすると

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

こんなふうになって各項目が見た目にやさしくなります。

何が書かれていたか

_wp_attachment_metadata にはこんなことが書かれています。

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

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

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

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

実務でどう使うか

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

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

 

PHP や javascript でシリアライズされたデータを JSON に変換することができるそうなのでそっちを学んだほうが手っ取り早いと思いますが、ちょっと検索したくらいでは答えが見つからず、結局ちまちまと計算式を作って中途半端なJSON変換を行い、サイズや sizes を抜き出して使用しています。

ここの書き手はFileMakerを使ってWordPressの管理を行ってるので、FileMaker のスクリプトを使ってそれをやってます。

FileMakerでWordPressの_wp_attachment_metadataをJSONに変換して利用

コメントを残す

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

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