tcd-theme.comで2017年に公開した記事の画像は、3枚に2枚(1,098枚中725枚)がaltなしでした。

全部の記事で数えると、画像17,650枚のうち4,342枚、4枚に1枚がaltなしです。今年の記事でも、3枚に1枚(1,680枚中521枚)が空でした。


WordPressで記事販売ができる「YOMERU」
記事を、そのまま収益に。
WordPressサイトで記事の有料販売ができる
無料のプラグイン「YOMERU」。

altとは

altは、画像の内容を文章で伝えるための属性です。HTMLでは、画像のタグに alt=”〜” の形で書きます。WordPressでは、メディアの「代替テキスト」の欄に入れた文章が、altとして出力されます。

  • 目の不自由な人が使う読み上げソフトは、画像の代わりにaltを読み上げる
  • 回線の状態などで画像が表示されないとき、代わりにaltが表示される
  • 検索エンジンは、altも手がかりにして画像の内容を理解する

参考:画像に関するSEOのベストプラクティス(Google 検索セントラル)

区切り線や飾りのアイコンのように、内容を伝える必要のない画像は、あえてaltを空(alt=””)にするのが正しい書き方です。空のaltが、すべて間違いというわけではありません。

参考:Decorative Images(W3C)

tcd-theme.comで数えてみた結果

記事の本文に入っている画像を、公開した年ごとに数えました。

記事の画像のうち、altが空の割合(公開年別)

内部リンクの漏れは新しい記事ほど多かったのに対して、altが空の画像は、年によって大きくばらついています。2016年までは、2013年(20%)と2014年(17%)を除いて1割未満です。2017年に66%、2019年に60%と跳ね上がり、2021年は5%まで下がりましたが、2022年は30%、2025年は28%、2026年は31%と、また増えています。

空のaltの画像を開いていくと、操作画面のスクリーンショットが目立ちました。古いか新しいかよりも、その時期に誰がどんな手順で記事を書いていたかで変わっている、と考えています。

altが空の画像を洗い出す手順

1. 集計用のスクリプトを用意する

内部リンクのときと同じように、AIに次のように頼みました。

WordPressの管理画面で、ブラウザのコンソールから実行するJavaScriptを書いてください。
REST APIで公開中の投稿をすべて取得し、本文の画像のうちaltが空のものを探して、
「記事タイトル」「記事URL」「画像URL」「画像の直前の文章」をCSVファイルで保存するものです。
データの書き換えはしないでください。

できあがり、tcd-theme.comで動かしたスクリプトが次のものです。記事のデータを読み込んで数えるだけで、サイトの記事や設定は書き換えません。

(async () => {
  const api = wpApiSettings.root + 'wp/v2/posts';
  const headers = { 'X-WP-Nonce': wpApiSettings.nonce };
  const text = (html) => html.replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();

  // 公開中の記事を100件ずつ取得
  const posts = [];
  for (let page = 1; ; page++) {
    const res = await fetch(`${api}?per_page=100&page=${page}&context=edit&_fields=link,title.raw,content.raw`, { headers });
    if (!res.ok) break;
    const items = await res.json();
    posts.push(...items);
    if (items.length < 100) break;
  }

  // altが空の画像と、その直前の文章を集める
  const rows = [];
  let total = 0;
  posts.forEach((p) => {
    const blocks = p.content.raw.split(/\r?\n\s*\r?\n/);
    blocks.forEach((block, i) => {
      (block.match(/<img\b[^>]*>/gi) || []).forEach((img) => {
        total++;
        const alt = img.match(/\balt\s*=\s*"([^"]*)"/i);
        if (alt && alt[1].trim() !== '') return;
        const src = (img.match(/\bsrc\s*=\s*"([^"]+)"/i) || [])[1] || '';
        rows.push([p.title.raw, p.link, src, text(blocks[i - 1] || '').slice(-100)]);
      });
    });
  });

  // CSVで保存
  const csv = '' + [['記事タイトル', '記事URL', '画像URL', '直前の文章'], ...rows]
    .map((r) => r.map((v) => `"${String(v).replace(/"/g, '""')}"`).join(','))
    .join('\n');
  const a = document.createElement('a');
  a.href = URL.createObjectURL(new Blob([csv], { type: 'text/csv' }));
  a.download = 'empty-alt.csv';
  a.click();

  console.log(`画像${total}枚のうち、altが空の画像:${rows.length}枚`);
})();

2. 管理画面で実行する

「投稿」→「新規投稿」の画面を開き、ブラウザの「検証」→「Console」に貼り付けて、Enterキーを押します。Chromeでは、初めて貼り付けるときに「allow pasting」と入力するよう求められます。数えるのは「投稿」だけで、固定ページやカスタム投稿は入りません。実行のしかたは、内部リンクの記事と同じです。

tcd-theme.comでは1分ほどで「画像17650枚のうち、altが空の画像:4342枚」と表示され、「empty-alt.csv」というファイルが保存されました。

3. AIにaltを考えてもらう

CSVの「画像URL」を開いて画像を保存し、「直前の文章」と一緒にAIに渡します。ClaudeやChatGPTなら、画像を何枚かまとめて添付できます。

ブログ記事の画像に付けるalt(代替テキスト)を考えてください。
添付の画像それぞれについて、記事の中で直前に書かれている文章も参考にして、
画像を見られない人にも何が写っているかが伝わる文を、40文字以内で書いてください。
キーワードを詰め込んだり、「〜の画像」で終わらせたりしないでください。

画像1の直前の文章:プラグインを有効化すると、ダッシュボードに「Japanized Popup」という項目が表示されます。
画像2の直前の文章:クーポン配布
画像3の直前の文章:LINE友だち追加

tcd-theme.comの「Japanized Popup」の記事で、altが空だった画像3枚を渡すと、次のような文章が返ってきました。

直前の文章 AIが考えたalt
プラグインを有効化すると、ダッシュボードに「Japanized Popup」という項目が表示されます。 管理画面のメニューに追加された「Japanized Popup」と、ポップアップの一覧画面
クーポン配布 画面中央に表示された、10%OFFクーポンの登録を促すポップアップ
LINE友だち追加 画面右下に表示された、LINEの友だち追加を促すポップアップ

「クーポン配布」「LINE友だち追加」のような短い見出しだけでは、画像の中身は分かりません。AIは画像の文字や配置まで読み取って、どこに何が表示されているのかを補ってくれました。

画面中央に表示された、10%OFFクーポンの登録を促すポップアップ

40文字以内と頼みましたが、1枚目は45文字でした。中身は3枚とも画像と合っていましたが、文字数や言い回しは、画像と見比べてから使います。

4. altを入れ直す

本文の画像と、アイキャッチ画像では、直す場所が違います。

直す場所
本文の画像 記事の編集画面で、画像ごとにaltを入れ直す
アイキャッチ画像 「メディア」で、画像の「代替テキスト」に入れる

本文の画像のaltは、画像を記事に入れたときに、記事の本文の中に書き込まれます。あとから「メディア」で代替テキストを入れても、すでに公開している記事のaltは変わりません。記事を開いて、画像ごとに入れ直します。

アイキャッチ画像は、WordPress標準の関数(the_post_thumbnail)で表示するテーマなら、「メディア」の代替テキストがそのまま使われます。

メディアの代替テキストの欄

「メディア」の一覧で画像をクリックして開き、「代替テキスト」(①)に入れます。この画面では、入力欄から離れると自動で保存されます。

ただし、tcd-theme.comでは、メディアに代替テキストを入れても、記事ページのアイキャッチは alt=”” のまま出力されていました。関連記事などのサムネイルも、altは記事のタイトルか空でした。テーマが、メディアの代替テキストを使わずに表示しているためです。

自分のテーマがどちらかは、記事ページのソースを開き、アイキャッチの img タグの alt を見れば分かります。メディアの代替テキストが使われていないテーマなら、本文の画像から手を付けます。

これから書く記事で漏らさないために

画像をアップロードしたら、その場で「代替テキスト」を入れてから記事に入れます。本文の画像は、記事に入れたときのaltがそのまま残るためです。公開前のチェックには、チェックリストを作れるプラグインも使えます。

まとめ

まずは自分のテーマで、アイキャッチのaltがどこから出ているかを、記事ページのソースで確かめます。メディアの代替テキストが使われていれば、アイキャッチはメディアで直せます。使われていなければ、スクリプトで出したCSVのうち、アクセスの多い記事の本文の画像から入れ直していきます。

魅力的なブログがつくれる
WordPressテーマ集
WordPressテーマ「PANDORA」
レイアウト自由自在なブログ・メディアを構築。
WordPressテーマ「NULL」
技術や知見をシェアする開発者ブログを構築。
WordPressテーマ「Muum」
デザイン・SEOともに最高峰のブログに。
WordPressテーマ「Cherie」
華やかなブログで集客できるテンプレート。