Вопрос или проблема
У меня зарегистрированы следующие размеры, которые я проверил с помощью Regenerate Thumbnails.
thumbnail => 185x125 (кроп)
shop_thumbnail => 150x62 (кроп)
alm-thumbnail => 150x150 (кроп)
Используя следующий код, я получаю неправильный размер:
$test = wp_get_attachment_image_src( $id, 'shop_thumbnail' );
/*
$test = array(
"http://.../2018/02/underwear-150x150.png",
62,
62
)
*/
Но если я использую эту функцию для получения метаданных, пользовательский размер явно определен…
$test = wp_get_attachment_metadata( $id );
/*
$test = array(
["width"]=> int(177)
["height"]=> int(436)
["file"]=> string(21) "2018/02/underwear.png"
["sizes"]=> array(
"thumbnail"]=>
array(4) {
["file"]=> string(21) "underwear-177x125.png"
["width"]=> int(177)
["height"]=> int(125)
["mime-type"]=> string(9) "image/png"
}
// ...другие размеры
["shop_thumbnail"]=>
array(4) {
["file"]=> string(20) "underwear-150x62.png"
["width"]=> int(150)
["height"]=> int(62)
["mime-type"]=> string(9) "image/png"
}
)
Как видите, shop_thumbnail действительно существует во втором примере, но не возвращается в первом примере. Я проверил, что файл 150×62 существует, и он есть.
Почему wp_get_attachment_image_src возвращает неправильный размер? Похоже, что он использует alm-thumbnail, даже несмотря на то, что ajax load more вообще не используется на этой странице.
Много “возможных дубликатов” говорят, что мне нужно определить $content_width, но я не смог решить проблему этим.
Обновление: Изменение ‘shop_thumbnail’ на array(150, 62)
работает, но это не идеально, так как shop_thumbnail используется на всех шаблонах WooCommerce. Я все еще хотел бы разобраться в этом.
Попробуйте эту функцию:
woocommerce_get_product_thumbnail();
Это, похоже, стандартная функция для получения миниатюры продукта, как можно видеть в базе кода wc
По умолчанию она будет возвращать woocommerce_thumbnail, но, похоже, принимает и другие размеры в первом параметре.
Ответ или решение
Причины, по которым функция wp_get_attachment_image_src
может возвращать неправильный размер изображения, даже если размер существует, могут быть различными. В вашем случае есть несколько моментов, на которые стоит обратить внимание:
-
Регистрация размеров изображений: Убедитесь, что размеры изображений зарегистрированы правильно в функции
add_image_size()
. Если вы добавляли новые размеры после загрузки изображений, вам необходимо использовать плагин для регенерации миниатюр, что вы уже сделали. Это позволит WordPress создать новые размеры для всех загруженных ранее изображений. -
Приоритет функций WooCommerce: WooCommerce иногда переопределяет стандартные функции WordPress, такие как
wp_get_attachment_image_src
, чтобы использовать свои собственные функции для получения изображений продуктов. В вашем случае, если вы используете функциюwoocommerce_get_product_thumbnail()
, это может быть причиной получения неверного размера. Она может в первую очередь обращаться к стандартным размерам, зарегистрированным WooCommerce, а не к вашим кастомным размерам. -
Кэширование: Если вы используете кэширование на сайте (плагины кэширования или кэш браузера), это может влиять на то, какие размеры загружаются. Попробуйте очистить кэш и загрузить страницу заново, чтобы устранить эту возможность.
-
Использование других функций: Если вы хотите, чтобы размеры, по умолчанию используемые WooCommerce, были также применены к вашему коду, вы можете использовать функцию
woocommerce_get_product_thumbnail()
. Эта функция принимает параметры, которые позволяют вам указать, какой размер изображения использовать:echo woocommerce_get_product_thumbnail('shop_thumbnail');
Это обеспечит, что WooCommerce правильно обрабатывает ваш запрос на нужный размер изображения.
-
Проверка контекстов вызова: Если вы используете функцию внутри различных контекстов (например, в цикле, в AJAX-запросах и т. д.), убедитесь, что вы правильным образом передаёте ID вложения. Неправильный ID может привести к неправильному размеру получаемого изображения.
-
Отладка: Вы можете использовать функцию
error_log()
или другие методы отладки, чтобы выводить значения переменных и убедиться, что вы получаете правильные данные.
В итоге, чтобы решить вашу проблему с получением неверного размера изображения, рекомендуется использовать woocommerce_get_product_thumbnail()
для надежного обращения к нужному размеру, а также следовать рекомендациям по проверке контекстов и кэширования.