(WordPress) メディアファイルを投稿に挿入する際にタイトルや代替テキストを自動で補完するプラグイン 2 (意図した挙動と異なるので没)

経緯

前回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, titleimage_meta の配列に存在しているので良いのですが、 alt, description は存在していなかったのでどこから持ってくるのだろうか、と思いつつもプラグインを有効化してメディアファイルをアップロード。

すると wp_postmeta テーブルに上述4つのデータもパラメータとしてシリアライズデータの中に含まれました。

しかし、メディアファイルの編集画面に遷移すると、いずれの項目もブランクのままでした。あれ……データベースには入っているのに反映されない……?

手動で代替テキスト・キャプション・説明・タイトルを埋めて保存する
手動で代替テキスト・キャプション・説明・タイトルを埋めて保存する

ということで、手動で代替テキスト・キャプション・説明を埋めて保存し、どこにどう書き込まれるのかを観察します。

タイトル=タイトル・説明=本文・キャプション=抜粋として wp_posts に格納された
タイトル=タイトル・説明=本文・キャプション=抜粋として wp_posts に格納された

何ということでしょう!まさかの wp_postmeta ではなく wp_posts に存在しているではありませんか。

メディアファイル編集画面での見出しデータベースの項目データベースの列名
タイトル記事タイトルpost_title
キャプション抜粋post_excerpt
説明本文post_content

このような対応になっています。まさかメタ情報ではなく記事データそのもののレコードの中に含んでいるとは……。

しかし、そうすると代替テキストだけが見当たりません。

代替テキストだけは wp_postmeta に格納された
代替テキストだけは wp_postmeta に格納された

そしてこれまた想定外だったのですが、代替テキストだけwp_postmeta に格納されていました。しかも前回確認した _wp_attachment_metadata というキーにシリアライズされて入ってくるのではなく_wp_attachment_image_alt という別のキーで単独の値として

……流石にこの挙動は想定外でした。

メディア一覧ではきちんと4つの項目がプリセットとして使用される
メディア一覧ではきちんと4つの項目がプリセットとして使用される

しかも、この部分は当然といえばそうなのですが、4つの項目はメディア一覧で選択する際にプリセットとしてきちんと埋まっており、当初想定していた $metadata['image_meta'] の値は参照されない、ということが分かりました。

そうすると、別テーブルにそれぞれデータを書き込みに行く必要があるため、処理が複雑化しそう、というところと、フィルターフックとしてどれを使用すれば良いのか見当を付けることが難しそうだったため、この時点でこの方法はいったん取りやめることにしました。

そのため、最終的に妥協して前回の方法を一度採用してみることにしました……。思ったよりもメディアファイルの扱い、煩雑ですね……。

参考

wp_handle_upload を使用するアイディア

MIMEタイプ

wp_generate_attachment_metadata, wp_update_attachment_metadata を使用するアイディア

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。