Eliminar o actualizar add_image_size en WordPress

4 dic 2012, 17:32:03
Vistas: 13.9K
Votos: 16

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

2
Comentarios

¿Podrías publicar el código completo que sea relevante? ¿Las llamadas a add_image_size() están simplemente sueltas en functions.php, o están correctamente envueltas dentro de un callback y enganchadas a after_setup_theme? Saber esto es crítico para responder tu pregunta.

Chip Bennett Chip Bennett
4 dic 2012 18:31:08

hola chip - gracias por tu comentario - tienes razón, está envuelto en after_setup_theme - así que esto es nuevamente cuestión de prioridades - ¡siempre se me olvida eso!

Q Studio Q Studio
4 dic 2012 19:37:48
Todas las respuestas a la pregunta 3
3
27

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.

4 dic 2012 18:42:07
Comentarios

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.

Q Studio Q Studio
4 dic 2012 19:41:20

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

Zhianc Zhianc
22 abr 2015 15:57:25

me tomó mucho tiempo encontrar esta respuesta. ¡gracias!

Jacob Raccuia Jacob Raccuia
5 ene 2021 17:43:09
0

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);
6 sept 2017 13:56:44
3
-1

En tu tema hijo necesitarás usar add_action( 'after_setup_theme','nuevo-nombre');

4 dic 2012 18:06:04
Comentarios

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

robin robin
4 dic 2012 18:07:00

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.

fuxia fuxia
4 dic 2012 18:53:54

"new-name" es simplemente el identificador del tamaño de imagen que se está añadiendo.

Q Studio Q Studio
4 dic 2012 19:42:07