Удаление или обновление add_image_size в WordPress
Я работаю над темой, в которой определено несколько размеров изображений с помощью:
add_image_size( 'name', 500, 200, true );
Я хочу переопределить эти размеры из дочерней темы:
add_image_size( 'new-name', 400, 300, true );
Я знаю, что можно добавлять новые размеры, но если я добавлю с таким же именем:
add_image_size( 'name', 400, 300, true );
То будет использоваться функция из родительской темы - дочерняя игнорируется. Добавление дополнительных правил создает лишние изображения, которые никогда не будут использованы - это не критично, но не эффективно.
Существует ли функция для отмены регистрации добавленного размера изображения?
Спасибо!
Рэй

Функция add_image_size( $name, $width, $height, $crop )
достаточно гибкая, чтобы обрабатывать множественные вызовы с одинаковым $name
. Она просто перезаписывает существующее значение:
$_wp_additional_image_sizes[$name] = array( 'width' => absint( $width ), 'height' => absint( $height ), 'crop' => (bool) $crop );
Это означает, что для переопределения пользовательского размера изображения, заданного в родительской теме, достаточно убедиться, что ваш вызов add_image_size()
выполняется после вызова в родительской теме.
Предположим, что родительская тема делает следующее:
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' );
Тогда вызов add_image_size()
в родительской теме сработает на хуке after_setup_theme
с приоритетом по умолчанию (т.е. 10
).
(Примечание: если вызовы не обернуты в callback-функцию, то они сработают на хуке plugins_loaded
с приоритетом 10
.)
Ключевой момент: файл functions.php
дочерней темы обрабатывается раньше, чем родительской, поэтому если вы используете те же хуки для вызовов add_image_size()
, они будут перезаписаны вызовами из родительской темы.
Решение заключается в том, чтобы использовать более поздний хук или более низкий приоритет, гарантируя, что вызов add_image_size()
в дочерней теме сработает после вызова в родительской теме.
Это должно сработать, независимо от того, как родительская тема выполняет свои вызовы:
function child_theme_setup() {
add_image_size( 'name', 400, 300, true );
}
add_action( 'after_setup_theme', 'child_theme_setup', 11 );
Обратите внимание, что мы используем тот же хук after_setup_theme
, но с более низким приоритетом (т.е. 11
вместо 10
). Callback-функции выполняются в порядке от более высокого приоритета (меньшее число) к более низкому (большее число), начиная с приоритета 0
. Таким образом, callback с приоритетом 11
выполнится после callback с приоритетом 10
.
Также учтите, что сам хук after_setup_theme
срабатывает после хука plugins_loaded
, поэтому этот callback все равно переопределит родительскую тему, даже если она использует _doing_it_wrong()
, не оборачивая такие вызовы в соответствующий callback на нужном хуке.

отлично - спасибо, chip! - у меня они были с одинаковым приоритетом - понизил приоритет дочернего после родительского, и теперь все работает отлично.

Кажется, я не могу переопределить значение, если плагин вызывает add_image_size :(

Если кто-то хочет просто удалить дополнительные размеры изображений, а не изменять их параметры, используйте remove_image_size( string $name ), например:
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]);
}
}
// Добавляем нашу функцию к хуку after_setup_theme с приоритетом 11
add_action( 'after_setup_theme', 'pinboard_child_theme_setup', 11);

new-name здесь — это имя функции или любое другое имя, которое вы используете для своей основной функции

Добавьте объяснение к вашему ответу: почему и как это решает проблему? Обратите внимание, что new-name
является недопустимым именем для callback-функции.
