Como registrar tamaños de imagen y regenerarlos con PHP en WordPress

Contents

Introducción

En este tutorial detallado aprenderás a registrar tamaños de imagen personalizados en WordPress y a regenerar esas imágenes programáticamente con PHP. Cubriremos desde las funciones básicas para declarar nuevos tamaños, hasta scripts robustos para regenerar imágenes en lote (incluyendo buenas prácticas sobre memoria, tiempo de ejecución y seguridad). Todo el código de ejemplo está listo para pegarse en tu theme o plugin.

Por qué registrar tamaños personalizados

WordPress crea versiones intermedias de las imágenes subidas según los tamaños registrados. Registrar tamaños personalizados te permite adaptar imágenes a diseños específicos (slider, ficha, thumbnails de lista, imágenes retina, etc.). Si añades o cambias tamaños después de haber subido imágenes, las versiones antiguas no se crearán de forma automática por eso es necesario regenerar.

Funciones clave

  • add_image_size( name, width, height, crop ) — Registra un tamaño adicional.
  • set_post_thumbnail_size( width, height, crop ) — Define el tamaño del thumbnail por defecto.
  • wp_generate_attachment_metadata( attachment_id, file ) — Genera metadatos y tamaños intermedios para un attachment.
  • wp_update_attachment_metadata( attachment_id, metadata ) — Guarda los metadatos generados.
  • image_make_intermediate_size( file, width, height, crop ) — Crea una versión intermedia concreta de un archivo.

Registrar tamaños: ejemplo práctico

A continuación un ejemplo típico que podrías incluir en functions.php de tu tema o, mejor aún, en un plugin específico para mantener separados los cambios.

 crop exacto)
    add_image_size( custom-800x600, 800, 600, true )
    add_image_size( hero-wide, 1920, 600, false ) // no crop: proporción libre
    // Tamaños para retina: 2x de un tamaño 400x300 => 800x600 (mostrar con srcset o con atributo data)
    add_image_size( card-retina, 1600, 1200, true )
    // Para miniaturas en el admin
    set_post_thumbnail_size( 150, 150, true )
}
?>

Mostrar la imagen registrada en plantillas

Después de registrar, para mostrar esa imagen en single.php o loop:


Regenerar tamaños con PHP (en servidor)

El enfoque más directo y seguro es usar wp_generate_attachment_metadata() y luego actualizar el attachment con wp_update_attachment_metadata(). Esto hace que WordPress cree todas las versiones intermedias según los tamaños actualmente registrados.

Función para regenerar un attachment


Regenerar todas las imágenes (por lotes para evitar timeouts)

Regenerar todo en una sola petición puede agotar memoria o tiempo de ejecución. Recomendado: procesar por lotes (por ejemplo 50 por petición) y usar paginación (offset) o WP-CLI para procesos en background. Ejemplo de script por lotes:

 attachment,
        post_status    => inherit,
        posts_per_page => posts_per_batch,
        paged          => paged,
        post_mime_type => image,
        fields         => ids,
    )

    query = new WP_Query( args )
    if ( ! query->have_posts() ) {
        return array( processed => 0, total => 0 )
    }

    processed = 0
    foreach ( query->posts as att_id ) {
        res = mi_regenerar_attachment( att_id )
        if ( res === true ) {
            processed  
        } else {
            // Puedes loguearlo, p.ej. error_log( print_r(res, true) )
        }
    }

    return array( processed => processed, count => count( query->posts ) )
}
?>

Ejecutarlo desde un endpoint seguro (muy útil para UI)

Puedes crear un endpoint admin-ajax o una página en el admin que reciba paginación y vaya llamando al script anterior. Asegura la petición con capacidades (current_user_can) y con nonces para evitar abusos.

Uso de WP-CLI para regenerar (recomendado para grandes sitios)

Si tienes acceso a WP-CLI es la forma más fiable y eficiente de regenerar imágenes. Ejemplo de comando personalizado (archivo PHP para un plugin que añade un comando):

 attachment,
                    post_mime_type => image,
                    posts_per_page => per_page,
                    paged => page,
                    fields => ids,
                ) )
                if ( empty( query->posts ) ) {
                    break
                }
                foreach ( query->posts as att_id ) {
                    WP_CLI::log( Regenerando {att_id}... )
                    res = mi_regenerar_attachment( att_id )
                    if ( is_wp_error( res ) ) {
                        WP_CLI::warning( Error en {att_id}:  . res->get_error_message() )
                    }
                }
                page  
            } while ( count( query->posts ) >= per_page )
            WP_CLI::success( Proceso completado. )
        }
    }

    WP_CLI::add_command( mi-regen, Mi_Regen_Command )
}
?>

Consideraciones prácticas y buenas prácticas

  1. Backup: Haz copia de seguridad de uploads/ antes de regenerar en masa por si necesitas revertir.
  2. Memoria y tiempo: Aumenta temporalmente memory_limit y max_execution_time para peticiones grandes, o usa WP-CLI para evitar problemas.
  3. Procesamiento por lotes: Implementa paginación o colas para no sobrecargar el servidor.
  4. Retina y srcset: WordPress genera srcset con las imágenes intermedias para retina suele crearse un tamaño de doble resolución o usar image_srcset para servirlo correctamente.
  5. Cache CDN: Si usas CDN, purga o invalida caché de las imágenes después de regenerar, porque los nombres de archivo suelen mantenerse pero el contenido cambia.
  6. Permisos: Asegúrate de que el usuario que ejecuta PHP tiene permisos de escritura en uploads/.

Casos especiales

Si necesitas generar solo ciertos tamaños

Puedes usar image_make_intermediate_size() para generar un tamaño concreto a partir del archivo original y luego actualizar manualmente el metadata. Ejemplo:

resize( 800, 600, true )
    if ( ! is_wp_error( resized_file ) ) {
        new_file = img->save()
        // Ahora, agregar la info a metadata[sizes][mi-tamano] con los campos adecuados
    }
}
?>

Eliminar tamaños antiguos

Si cambias o eliminas un tamaño y quieres limpiar las versiones antiguas del servidor, deberás inspeccionar los metadatos (get_post_meta(_wp_attachment_metadata)) y borrar manualmente los archivos obsoletos (con wp_delete_file o unlink) y luego actualizar los metadatos. Esto requiere cuidado: siempre hacer backup.

Resumen final

1) Registra tamaños con add_image_size en after_setup_theme. 2) Para que imágenes existentes reflejen los nuevos tamaños, usa wp_generate_attachment_metadata() y wp_update_attachment_metadata() para cada attachment. 3) Ejecuta en lotes o con WP-CLI para evitar timeouts. 4) Ten en cuenta backups, permisos y CDN. Con los ejemplos anteriores puedes adaptar la regeneración a una UI, endpoint seguro o comando de WP-CLI según tus necesidades.



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *