~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」という人には、これで十分!
以下の記事に全コードを記載しています。
 
  
  
  
  
コメント