WordPressで投稿タイプごとにサムネイルサイズを変更する方法

WordPressでは、投稿にアップロードされた画像は自動的に複数のサムネイルサイズにリサイズされます。しかし、特定の投稿タイプごとに生成されるサムネイルサイズを制御したい場合もあるでしょう。

例えば、「works」投稿タイプでは works-detailworks-list のみ、「news」投稿タイプでは news-detailnews-list のみ生成されるようにしたい場合、適切なフィルターを使用することで実現できます。

本記事では、投稿タイプごとに生成されるサムネイルサイズを制御する方法を解説します。


WordPressの画像リサイズの仕組み

WordPressでは、画像をアップロードすると add_image_size() で登録されたサイズが自動的に生成されます。これを制御するには、 intermediate_image_sizes_advanced フィルターを利用します。

このフィルターを使用すると、特定の投稿タイプに応じて許可するサムネイルサイズを指定できます。


投稿タイプごとにサムネイルサイズを制限するコード

以下のコードを functions.php に追加することで、投稿タイプごとに異なるサムネイルサイズを設定できます。

function filter_image_sizes_by_post_type($sizes, $metadata, $attachment_id)
{
    // 画像が添付されている投稿を取得
    $attachment = get_post($attachment_id);
    if (!$attachment || $attachment->post_type !== 'attachment') {
        return $sizes; // 添付ファイルでなければ処理しない
    }

    // 添付元の投稿を取得
    $parent_post = get_post($attachment->post_parent);
    if (!$parent_post) {
        return $sizes; // 親投稿がない場合はそのまま返す
    }

    $post_type = get_post_type($parent_post); // 画像が添付されている投稿の投稿タイプを取得

    // 許可するサムネイルサイズを投稿タイプごとに設定
    $allowed_sizes = [];
    if ($post_type === 'works') {
        $allowed_sizes = ['works-detail', 'works-list'];
    } elseif ($post_type === 'news') {
        $allowed_sizes = ['news-detail', 'news-list'];
    }

    // 許可されていないサイズを削除
    foreach ($sizes as $size => $data) {
        if (!in_array($size, $allowed_sizes)) {
            unset($sizes[$size]);
        }
    }

    return $sizes;
}
add_filter('intermediate_image_sizes_advanced', 'filter_image_sizes_by_post_type', 10, 3);

コードの解説

  1. 画像が添付されている投稿を取得する
  • $attachment = get_post($attachment_id); で、アップロードされた画像の情報を取得。
  • 画像以外(通常の投稿など)の場合は処理しないように if (!$attachment || $attachment->post_type !== 'attachment') を追加。
  1. 画像がどの投稿に添付されているかを確認
  • get_post($attachment->post_parent); で、画像の親投稿を取得。
  • 画像が投稿に紐付いていない場合は $sizes をそのまま返す。
  1. 投稿タイプごとに許可するサムネイルサイズを指定
  • works 投稿タイプ → works-detail, works-list
  • news 投稿タイプ → news-detail, news-list
  • その他の投稿タイプは何も生成しないようにする。
  1. 不要なサイズを削除
  • $sizes 配列から、許可リスト ($allowed_sizes) にないサイズを unset($sizes[$size]); で削除。

カスタム画像サイズの登録

もし works-detailnews-list などのカスタムサイズが未登録なら、 functions.php に以下のコードを追加して登録しておきます。

add_action('after_setup_theme', function () {
    add_image_size('works-detail', 800, 600, true);
    add_image_size('works-list', 400, 300, true);
    add_image_size('news-detail', 600, 400, true);
    add_image_size('news-list', 300, 200, true);
});

add_image_size() を使うことで、カスタムサイズの画像が適切に生成されるようになります。


動作確認方法

1. 画像のメタデータを確認する

以下のコードを functions.php で実行すると、特定の画像がどのサイズで生成されているか確認できます。

$attachment_id = 123; // 確認したい画像のIDを設定
$metadata = wp_get_attachment_metadata($attachment_id);
print_r($metadata);

2. 画像が正しく制限されているか確認

実際に「works」や「news」タイプの投稿に画像をアップロードし、wp-content/uploads/ にあるファイルを確認してみてください。指定したサイズのみが生成されていることが確認できるはずです。


動作環境

  • WordPress 6.7.1
  • PHP 8.3.8
  • MySQL 8.0.39
  • さくらのレンタルサーバー

まとめ

  • intermediate_image_sizes_advanced フィルターを使用すると、投稿タイプごとに生成する画像サイズを制限できる。
  • get_post($attachment->post_parent) を利用して、画像がどの投稿に添付されているか確認する。
  • unset($sizes[$size]) で不要なサイズを削除。
  • add_image_size() でカスタム画像サイズを登録しておく。

この方法を活用することで、不要な画像の生成を防ぎ、サーバーのストレージを節約しながら効率的な画像管理が可能になります。ぜひ試してみてください!

コメント

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