経緯
前回は wp_prepare_attachment_for_js
のフィルターフックを使ってメディアファイル挿入時に代替テキスト・タイトル・キャプション・説明を挿入する方法を模索しました。
しかし、ギャラリーブロックで自動補完を適用させるためには画像を1つ1つ選択解除・選択し直しをして行かなければならず、手間だと感じました。
そこで、ブロックエディタ上のメディア一覧からメディアファイルを選択する時ではなく、当初の想定の通りそもそもメディアファイルアップロード時にこれら4つの項目を埋める方法を模索することにします。
実装 (PoC / 失敗)
最初は以下の記事から wp_handle_upload
を使おうと思いましたが、メディアファイルアップロード時とメタ情報の生成タイミングは異なるようなので没。
次に wp_generate_attachment_metadata
, wp_update_attachment_metadata
を利用でいないかと考えました。
特に今回はファイルアップロードは正規の方法で、メタ情報だけ生成・更新できれば良いので……。
<?php
function Gakutensoku2( $metadata, $attachment_id )
{
// 埋め込むテキスト (決め打ち)
$preset = '画像の説明です。';
if ( empty( $metadata['image_meta']['alt'] ) ) {
// 代替テキストが空ならば $preset で埋める。
$metadata['image_meta']['alt'] = $preset;
}
if ( empty( $metadata['image_meta']['caption'] ) ) {
// キャプションが空ならば $preset で埋める。
$metadata['image_meta']['caption'] = $preset;
}
if ( empty( $metadata['image_meta']['description'] ) ) {
// 説明が空ならば $preset で埋める。
$metadata['image_meta']['description'] = $preset;
}
// タイトルを $preset で上書き。
$metadata['image_meta']['title'] = $preset;
return apply_filters( 'wp_update_attachment_metadata', $metadata, $attachment_id );
}
add_filter( 'wp_generate_attachment_metadata', 'Gakutensoku2', 10, 2 );
タイトルは問答無用で書き換え、他の3つの代替テキスト・キャプション・説明は該当項目が空欄だった場合に挿入する、というようなコードです。
これをプラグインとしてインストールして挙動を観察したところ、またまた自分の意図した挙動とは異なる挙動をしたので深堀りすることにしました……。
深堀り
元々 caption
, title
は image_meta
の配列に存在しているので良いのですが、 alt
, description
は存在していなかったのでどこから持ってくるのだろうか、と思いつつもプラグインを有効化してメディアファイルをアップロード。
すると wp_postmeta
テーブルに上述4つのデータもパラメータとしてシリアライズデータの中に含まれました。
しかし、メディアファイルの編集画面に遷移すると、いずれの項目もブランクのままでした。あれ……データベースには入っているのに反映されない……?
ということで、手動で代替テキスト・キャプション・説明を埋めて保存し、どこにどう書き込まれるのかを観察します。
何ということでしょう!まさかの wp_postmeta
ではなく wp_posts
に存在しているではありませんか。
メディアファイル編集画面での見出し | データベースの項目 | データベースの列名 |
---|---|---|
タイトル | 記事タイトル | post_title |
キャプション | 抜粋 | post_excerpt |
説明 | 本文 | post_content |
このような対応になっています。まさかメタ情報ではなく記事データそのもののレコードの中に含んでいるとは……。
しかし、そうすると代替テキストだけが見当たりません。
そしてこれまた想定外だったのですが、代替テキストだけは wp_postmeta
に格納されていました。しかも前回確認した _wp_attachment_metadata
というキーにシリアライズされて入ってくるのではなく、 _wp_attachment_image_alt
という別のキーで単独の値として。
……流石にこの挙動は想定外でした。
しかも、この部分は当然といえばそうなのですが、4つの項目はメディア一覧で選択する際にプリセットとしてきちんと埋まっており、当初想定していた $metadata['image_meta']
の値は参照されない、ということが分かりました。
そうすると、別テーブルにそれぞれデータを書き込みに行く必要があるため、処理が複雑化しそう、というところと、フィルターフックとしてどれを使用すれば良いのか見当を付けることが難しそうだったため、この時点でこの方法はいったん取りやめることにしました。
そのため、最終的に妥協して前回の方法を一度採用してみることにしました……。思ったよりもメディアファイルの扱い、煩雑ですね……。
参考
wp_handle_upload
を使用するアイディア
- 画像をアップロードする時に、画像処理(フィルター)をかけてみる。(wp_generate_attachment_metadata):【88日目】WordPress1日1プラグイン – アルパカ@ラボ
- wordpressのwp_handle_upload関数を使ってローカルファイルをメディアへアップロードする|開発|システム開発・構築の神様
- wp_handle_upload() – Function | Developer.WordPress.org
MIMEタイプ
wp_generate_attachment_metadata
, wp_update_attachment_metadata
を使用するアイディア
- WordPressで添付ファイルを操作するのに便利なフック | work.log
- WordPressに添付ファイル情報だけ追加するメモ | work.log
- wp_generate_attachment_metadata() – Function | Developer.WordPress.org
- wp_update_attachment_metadata() – Function | Developer.WordPress.org
- 「WordPress wp_update_attachment_metadata メディア(添付ファイル)のメタ情報を更新する」参考サイトまとめ|ワードプレスプラグインサブスクプラン
- wp_update_attachment_metadata – WordPress私的マニュアル
- wp_read_image_metadata() – Function | Developer.WordPress.org