WordPressで自動画像最適化プラグインを自作するまでの道のり

~NekoPixel Optimizer 開発記録~

はじめに

WordPressに画像をアップロードしたら、そのまま自動で

  • 圧縮
  • WebP/AVIF変換
  • 最大サイズ以上は縮小
  • EXIF削除

までやってくれたら便利ですよね。
ShortPixelやImagifyといったプラグインもありますが、今回は「新規アップロードだけで十分」と割り切って、自作してみました。

この記事は、失敗も含めて実装が完成するまでの手順を記録したものです。


最初の挑戦:とりあえずプラグイン化

最小コード

wp-content/plugins/neko-pixel-optimizer/neko-pixel-optimizer.php を作成し、以下を記述。

<?php
/**
 * Plugin Name: NekoPixel Optimizer (Stage A)
 * Description: 最小機能テスト。JPEG/WebP/AVIFの品質を固定。
 * Version: 0.0.1a
 */
if (!defined('ABSPATH')) exit;

add_filter('wp_editor_set_quality', function($q, $mime){
    if ($mime === 'image/avif') return 60;
    if ($mime === 'image/webp') return 75;
    if ($mime === 'image/jpeg') return 82;
    return $q;
}, 10, 2);

👉 結果:有効化できた!
でもまだ「圧縮だけ」。WebPやAVIFへの変換は入ってない。


Stage B:WebP/AVIF変換を追加

add_filter('image_editor_output_format', function($formats){
    $target = null;
    if (function_exists('imageavif')) {
        $target = 'image/avif';
    } elseif (function_exists('imagewebp')) {
        $target = 'image/webp';
    } elseif (class_exists('Imagick')) {
        $f = @Imagick::queryFormats();
        if (is_array($f) && in_array('AVIF',$f,true)) $target = 'image/avif';
        elseif (is_array($f) && in_array('WEBP',$f,true)) $target = 'image/webp';
    }
    if ($target) {
        $formats['image/jpeg'] = $target;
        $formats['image/png']  = $target;
    }
    return $formats;
});

👉 結果

  • JPEG/PNG → WebP(またはAVIF)で生成されるようになった!
  • WordPress標準の「150×150」「768×768」などのサムネイルが、ちゃんとWebP/AVIFになってた。

Stage C:縮小とEXIF削除を入れたら失敗💥

ここで「オリジナル縮小」と「EXIF削除」を一気に入れたら…

重大なエラーで有効化できず

Parse error や Unexpected token が出て、何度も修正する羽目に。
原因は コピペ時の全角クォート/BOM混入/Imagickの扱い
→ 一気にやるのは危険、と学んだ。


Stage C1:縮小だけ試す

add_filter('wp_handle_upload', function($upload){
    $file = $upload['file'];
    $editor = wp_get_image_editor($file);
    if (!is_wp_error($editor)) {
        $editor->resize(2560, 2560, false);
        $editor->set_quality(82);
        $editor->save($file);
    }
    return $upload;
});

👉 結果:オリジナルが 2560px 以内に縮小されるのを確認。


Stage C2:EXIF削除だけ試す

add_filter('image_make_intermediate_size', function($resized_path){
    if (!class_exists('Imagick')) return $resized_path;
    try {
        $img = new Imagick($resized_path);
        $img->stripImage();
        $img->writeImage($resized_path);
        $img->clear(); $img->destroy();
    } catch(\Throwable $e) {
        error_log('[NekoPixel] strip failed: '.$e->getMessage());
    }
    return $resized_path;
});

👉 結果:EXIFが消えた!
Imagickがない環境だとスキップされるので安全。


Stage D:C1+C2の合体版

縮小とEXIF削除を両方入れた安定版。
3000×3000pxの画像をアップしたら…

  • オリジナル → 2560pxに縮小
  • サムネイル → WebP/AVIF生成
  • EXIF情報 → 消えている

やっと実用的になった✨


Stage E:GUI化

最後に、管理画面から設定できるように改造。
「設定 → NekoPixel」で以下が変更可能:

  • JPEG/WebP/AVIF品質値
  • 最大幅・最大高さ
  • EXIF削除のON/OFF
  • AVIF優先のON/OFF

👉 記事投稿画面からドラッグ&ドロップで画像を入れても、ちゃんと最適化される!


学んだこと

  • 一気に機能を盛るとすぐ落ちる → 機能を分けて小刻みにテスト
  • 全角クォート・BOM混入が地雷(スマホエディタ注意)
  • WordPressはアップロード処理が共通なので「記事に直接挿入」でもメディア経由と同じく動く

まとめ

自作プラグイン「NekoPixel Optimizer」で実現できたこと:

  • 新規アップロード時に自動最適化
  • WebP/AVIF変換
  • 品質調整・縮小・EXIF削除
  • 管理画面でGUI設定

既存の画像一括最適化はまだ未対応ですが、必要になったら追加すればOK。


おわりに

ShortPixelやImagifyを使わなくても、WordPress標準のフックで十分実用的な最適化が可能です。
「まずは新規だけ最適化できればOK」という人には、これで十分!

以下の記事に全コードを記載しています。

WordPressで画像を自動最適化する自作プラグイン

コメント

タイトルとURLをコピーしました