Удаление или обновление 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! - у меня они были с одинаковым приоритетом - понизил приоритет дочернего после родительского, и теперь все работает отлично.
Q Studio
Кажется, я не могу переопределить значение, если плагин вызывает add_image_size :(
Zhianc
Если кто-то хочет просто удалить дополнительные размеры изображений, а не изменять их параметры, используйте 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 здесь — это имя функции или любое другое имя, которое вы используете для своей основной функции
robin
Добавьте объяснение к вашему ответу: почему и как это решает проблему? Обратите внимание, что new-name является недопустимым именем для callback-функции.
fuxia