Eliminar o actualizar add_image_size en WordPress
Estoy trabajando en un tema que tiene varios tamaños de imágenes definidos correctamente usando:
add_image_size( 'nombre', 500, 200, true );
Me gustaría sobrescribir estos tamaños definidos desde el tema hijo:
add_image_size( 'nuevo-nombre', 400, 300, true );
Sé que puedo agregar nuevos tamaños, pero si uso el mismo nombre, es decir:
add_image_size( 'nombre', 400, 300, true );
Entonces se usa la llamada de función del tema padre - la del tema hijo es ignorada - agregar reglas adicionales crea imágenes extra que nunca se usarán - no es tan malo, pero no es eficiente.
¿Existe alguna función para desregistrar un tamaño de imagen añadido?
¡Saludos!
Ray

La función add_image_size( $name, $width, $height, $crop )
es lo suficientemente elegante como para manejar múltiples llamadas utilizando el mismo $name
. Simplemente sobrescribe el valor existente:
$_wp_additional_image_sizes[$name] = array( 'width' => absint( $width ), 'height' => absint( $height ), 'crop' => (bool) $crop );
Esto significa que todo lo que necesitas hacer para anular la definición del tamaño de imagen personalizado del Tema padre es asegurarte de que tu llamada a add_image_size()
se ejecute después de la llamada del Tema padre.
Suponiendo que el Tema padre haga lo siguiente:
function parent_theme_setup() {
add_image_size( 'name', 500, 200, true );
add_image_size( 'new-name', 400, 300, true );
}
add_action( 'after_setup_theme', 'parent_theme_setup' );
Entonces, la llamada a add_image_size()
del Tema padre se ejecuta en el hook after_setup_theme
, con la prioridad predeterminada (es decir, 10
).
(Nota: si las llamadas no están envueltas en un callback, entonces se ejecutan en el hook plugins_loaded
, con prioridad 10
).
Aquí está la parte crítica: el archivo functions.php
del Tema hijo se analiza antes que el del Tema padre, por lo que si usas los mismos hooks para ejecutar tus llamadas a add_image_size()
, serán sobrescritas por las llamadas a add_image_size()
del Tema padre.
La solución es usar un hook posterior o una prioridad más baja, para asegurar que la llamada a add_image_size()
del Tema hijo se ejecute después de la del Tema padre.
Esto debería funcionar, independientemente de cómo el Tema padre ejecute sus llamadas:
function child_theme_setup() {
add_image_size( 'name', 400, 300, true );
}
add_action( 'after_setup_theme', 'child_theme_setup', 11 );
Observa que usamos el mismo hook after_setup_theme
, pero con una prioridad más baja (es decir, 11
en lugar de 10
). Los callbacks se ejecutan en orden desde la prioridad más alta (número más bajo) hasta la prioridad más baja (número más alto), comenzando con la prioridad 0
. Por lo tanto, un callback enganchado con prioridad 11
se ejecutará después que un callback enganchado con prioridad 10
.
También ten en cuenta que el hook after_setup_theme
en sí mismo se ejecuta después del hook plugins_loaded
, por lo que este callback aún anulará al Tema padre, incluso si el Tema padre está _doing_it_wrong()
al no envolver dichas llamadas en un callback apropiado, enganchado a un hook adecuado.

excelente - ¡gracias chip! - los tenía ambos con la misma prioridad - ajusté el hijo para que se ejecutara después del padre y ahora todo funciona bien.

parece que no puedo sobrescribir el valor si un plugin está llamando a add_image_size :(

Si alguien quiere simplemente eliminar los tamaños de imagen adicionales, en lugar de cambiar las dimensiones, usa remove_image_size( string $name ), por ejemplo:
function pinboard_child_theme_setup( $sizes) {
$image_size_names = array('thumbnail', 'medium', 'large',
'slider-thumb', 'blog-thumb', 'teaser-thumb', 'gallery-1-thumb',
'gallery-2-thumb', 'gallery-3-thumb', 'image-thumb', 'video-thumb');
$image_size_names_length = count($image_size_names);
for($x = 0; $x < $image_size_names_length; $x++) {
remove_image_size($image_size_names[$x]);
}
}
add_action( 'after_setup_theme', 'pinboard_child_theme_setup', 11);

"new-name" aquí es el nombre de la función o cualquier nombre que estés utilizando para tu función principal

Añade una explicación a tu respuesta: ¿por qué y cómo resuelve el problema? Ten en cuenta que new-name
es un nombre de callback inválido.
