удалить или обновить add_image_size

16

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

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

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

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

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

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

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

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

Ура!

луч

Q Studio
источник
Можете ли вы опубликовать весь код, который имеет отношение к делу? Являются ли add_image_size()звонки просто сидеть неприкрыто в functions.php, или они правильно завернуты внутри обратного вызова, и навешиваются after_setup_theme? Знание того, что имеет решающее значение для ответа на ваш вопрос.
Чип Беннетт
Привет чип - спасибо за ваш комментарий - вы правы, он обернут в after_setup_theme - так что это снова о приоритетах - я всегда скучаю по этому!
Q Studio

Ответы:

22

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).

(Примечание: если вызовы не обернуты в обратный вызов, то они срабатывают в plugins_loadedловушке, в приоритете 10.)

Вот важная часть: файл дочерней темы functions.phpанализируется перед темой родительской темы , поэтому, если вы используете те же перехватчики для запуска своих add_image_size()вызовов, они будут переопределены 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. 0Обратные вызовы запускаются в порядке от более высокого приоритета (более низкий номер) к более низкому приоритету (более высокий номер), начиная с приоритета . Таким образом, обратный вызов, подключенный к приоритету, 11будет запускаться после обратный вызов подключен в приоритет 10.

Следует также отметить , что after_setup_themeсам крючок срабатывает после того, как на plugins_loadedкрючок, так что этот обратный вызов будет по- прежнему переопределить родительскую тему, даже если родительская тема является _doing_it_wrong(), не оборачивать таких вызовов в соответствующей функции обратного вызова, крючками в соответствующий крючок.

Чип Беннетт
источник
отлично - спасибо чип! - У меня у них обоих был одинаковый приоритет, - надрезал ребенка после родителя, и все работало нормально.
Q Studio
Я не могу перезаписать значение, если плагин вызывает add_image_size :(
Zhianc
1

Если кто-то хочет просто сбросить дополнительные размеры изображения, а не изменять размеры, используйте 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]);
    }   
}
add_action( 'after_setup_theme', 'pinboard_child_theme_setup', 11);
Юлия В
источник
-1

В вашей теме чили вам нужно использовать add_action( 'after_setup_theme','new-name');

Робин
источник
new-name - это имя функции или имя, которое вы используете для своей основной функции
robin
Добавьте в свой ответ объяснение: почему и как это решает проблему? Обратите внимание, что new-nameэто недопустимое имя обратного вызова.
fuxia
«new-name» - это просто дескриптор добавляемого размера изображения.
Q Studio