Удаление или обновление add_image_size в WordPress

4 дек. 2012 г., 17:32:03
Просмотры: 13.9K
Голосов: 16

Я работаю над темой, в которой определено несколько размеров изображений с помощью:

add_image_size( 'name', 500, 200, true );

Я хочу переопределить эти размеры из дочерней темы:

add_image_size( 'new-name', 400, 300, true );

Я знаю, что можно добавлять новые размеры, но если я добавлю с таким же именем:

add_image_size( 'name', 400, 300, true );

То будет использоваться функция из родительской темы - дочерняя игнорируется. Добавление дополнительных правил создает лишние изображения, которые никогда не будут использованы - это не критично, но не эффективно.

Существует ли функция для отмены регистрации добавленного размера изображения?

Спасибо!

Рэй

2
Комментарии

Не могли бы вы опубликовать весь соответствующий код? Вызовы add_image_size() просто находятся в functions.php без обертки, или они правильно обернуты в callback и подключены через after_setup_theme? Это критически важно для ответа на ваш вопрос.

Chip Bennett Chip Bennett
4 дек. 2012 г. 18:31:08

Привет, chip - спасибо за комментарий - ты прав, код обернут в after_setup_theme - значит, это снова вопрос приоритетов - я всегда это упускаю!

Q Studio Q Studio
4 дек. 2012 г. 19:37:48
Все ответы на вопрос 3
3
27

Функция 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 на нужном хуке.

4 дек. 2012 г. 18:42:07
Комментарии

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

Q Studio Q Studio
4 дек. 2012 г. 19:41:20

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

Zhianc Zhianc
22 апр. 2015 г. 15:57:25

потребовалось много времени, чтобы найти этот ответ. спасибо!

Jacob Raccuia Jacob Raccuia
5 янв. 2021 г. 17:43:09
0

Если кто-то хочет просто удалить дополнительные размеры изображений, а не изменять их параметры, используйте 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);
6 сент. 2017 г. 13:56:44
3
-1

В вашей теме Chile вам потребуется использовать add_action( 'after_setup_theme','new-name');

4 дек. 2012 г. 18:06:04
Комментарии

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

robin robin
4 дек. 2012 г. 18:07:00

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

fuxia fuxia
4 дек. 2012 г. 18:53:54

"new-name" — это просто идентификатор (handle) добавляемого размера изображения.

Q Studio Q Studio
4 дек. 2012 г. 19:42:07