【WordPress】メディアライブラリの画像を自動でWebP化して軽量化する方法

【WordPress】メディアライブラリの画像を自動でWebP化して軽量化する方法 WordPress

Webサイトの表示速度を改善するうえで、画像の軽量化は重要な施策のひとつです。特にWordPressではメディアライブラリに大量の画像がアップロードされるため、自動でWebP形式に変換して容量を削減することで、パフォーマンス向上とSEO対策に効果が期待できます。

スポンサーリンク

WebPとは|次世代の画像フォーマット

WebP(ウェッピー)はGoogleが開発した画像フォーマットで、JPEGやPNGと比較して高い圧縮率を誇ります。画質をほとんど落とさずにファイルサイズを大幅に削減できるため、表示速度の高速化やモバイル環境での通信量削減に有効です。

サーバーのWebP対応状況を確認する

WebP画像を生成するには、PHPのGDライブラリやImagickライブラリがWebPに対応している必要があります。以下のコードを一時的に設置し、対応状況を確認しましょう。

WebP対応状況の確認
<?php
if (imagetypes() & IMG_WEBP) {
  echo 'WebP対応済み';
} else {
  echo 'WebP非対応';
}
?>

「WebP非対応」と表示された場合は、サーバー管理者に連絡してGDまたはImagickのWebP対応を有効にしてもらう必要があります。

画像アップロード時にWebPを自動生成するコード

以下のコードをfunctions.phpに追加することで、JPEGおよびPNG画像がアップロードされた際に、同時にWebP形式の画像も自動生成されます。

functions.php:全サイズをWebP化
function create_webp_on_upload($metadata, $attachment_id) {
  if (!function_exists('imagewebp')) {
    return $metadata;
  }

  $upload_dir = wp_upload_dir();
  $base_dir = trailingslashit($upload_dir['basedir']) . dirname($metadata['file']) . '/';

  // オリジナルファイルをWebP化
  convert_file_to_webp(get_attached_file($attachment_id));

  // thumbnail・medium・large等、生成された全サイズもWebP化する
  if (!empty($metadata['sizes']) && is_array($metadata['sizes'])) {
    foreach ($metadata['sizes'] as $size) {
      convert_file_to_webp($base_dir . $size['file']);
    }
  }

  return $metadata;
}
add_filter('wp_generate_attachment_metadata', 'create_webp_on_upload', 10, 2);

function convert_file_to_webp($file) {
  $mime_type = wp_check_filetype($file)['type'];
  $image = null;

  switch ($mime_type) {
    case 'image/jpeg':
      $image = imagecreatefromjpeg($file);
      break;
    case 'image/png':
      $image = imagecreatefrompng($file);
      imagepalettetotruecolor($image);
      imagealphablending($image, true);
      imagesavealpha($image, true);
      break;
    default:
      return;
  }

  if ($image) {
    $webp_path = preg_replace('/\.(jpe?g|png)$/i', '.webp', $file);
    imagewebp($image, $webp_path, 80);
    imagedestroy($image);
  }
}
オリジナルファイルだけでなく全サイズを変換する必要がある
WordPressはアップロード時にthumbnail・medium・large等の複数のリサイズ済みサイズも生成し、記事本文やテーマで実際に表示されるのは大抵これらのリサイズ版です(エディタの既定の挿入サイズは通常「large」)。オリジナルファイルだけをWebP化すると、リサイズ版に対応するWebPファイルが存在せず、後述の<picture>タグで指定しても404になってしまいます。$metadata['sizes']をループしてすべてのサイズを処理する必要があります。

この処理により、オリジナルおよび各リサイズサイズについて、同じディレクトリ内に.webp形式の画像が生成されます。

WebP画像をHTMLで出し分ける方法

生成されたWebP画像をブラウザに適切に表示するには、<picture>タグを活用する方法が一般的です。

picture要素でのフォールバック
<picture>
  <source srcset="画像パス.webp" type="image/webp">
  <img src="画像パス.jpg" alt="代替テキスト">
</picture>

これにより、WebPに対応したブラウザではWebP画像が表示され、未対応のブラウザではJPEGやPNG画像が表示されるため、互換性を保ちつつ軽量化が可能です。

より簡単な方法:WordPress公式のimage_editor_output_formatフィルター

WordPress 5.8以降では、アップロード時に生成される全サイズの出力形式を変換できる公式フィルターimage_editor_output_formatが用意されています。GD・ImageMagickのどちらの画像エディタを使っていても機能し、手動でGD関数を1ファイルずつ処理する必要がありません。

functions.php:公式フィルターで全サイズを一括WebP化
function convert_uploads_to_webp($output_format, $filename, $mime_type) {
  if ('image/jpeg' === $mime_type) {
    $output_format['image/jpeg'] = 'image/webp';
  }
  if ('image/png' === $mime_type) {
    $output_format['image/png'] = 'image/webp';
  }
  return $output_format;
}
add_filter('image_editor_output_format', 'convert_uploads_to_webp', 10, 3);

この方法では、生成される各サイズの画像がJPEG/PNGの代わりに直接WebPとして保存されます(オリジナル形式と併存させるのではなく置き換える点が、上記の手動実装との違いです)。ほとんどのモダンブラウザはWebPに対応しているため、シンプルに導入したい場合はこちらの方法がおすすめです。

既存の画像をWebP化したい場合

すでにアップロード済みの画像についても、プラグインやWP-CLIなどを使えば一括変換が可能です。たとえば、以下のような無料プラグインがあります。

  • WebP Express:Apache/Nginxに応じた設定が可能で、ブラウザに応じた画像出し分けも自動対応。
  • EWWW Image Optimizer:WebPを含む多形式に対応し、CDN連携も可能。

手動で変換したい場合は、cwebpなどのCLIツールで対応することもできます。

関連記事

よくある質問(FAQ)

QWordPressでアップロード時に画像をWebP形式に自動変換するには?
AWordPress 5.8以降ならimage_editor_output_formatフィルターで全サイズを一括変換できます。オリジナルと併存させたい場合はwp_generate_attachment_metadataフィルターでGD・ImageMagickによる変換処理を自作します。またはImagify・ShortPixelなどのプラグインが簡単です。
Q既存の画像を一括でWebP変換するには?
AWP-CLIのwp media regenerateコマンドでサムネイルを再生成する際に、image_editor_output_formatフィルターを事前に設定しておけば新しいサイズがWebPで生成されます。または変換プラグインのバッチ処理機能を使います。
QWebPに非対応のブラウザへのフォールバックはどうすればいいですか?
Apictureタグのsource要素でWebP版とJPEG/PNG版の両方を指定し、ブラウザが対応形式を選択するようにします。ただしimage_editor_output_formatで置き換える方式ではオリジナル形式が残らないため、フォールバックが必要な場合はwp_generate_attachment_metadataで両形式を生成する自作実装を使ってください。

まとめ

WordPressにおける画像のWebP化は、サイト表示の高速化とユーザビリティの向上に大きく貢献します。functions.phpにコードを追加するだけで導入できるため、まずは自サイトの対応状況を確認し、導入を検討してみましょう。