Как получить атрибуты title/alt изображения?
В моей светлой теме не настроен атрибут alt для слайдера на главной странице. Я добавил alt-текст для изображения через интерфейс медиабиблиотеки. Я добавил следующий код для отображения alt-текста/атрибута, но он не отображается:
<img class="homepage-slider_image" src="http://www.blabla.com/wp-content/uploads/2013/06/cms-website4-1800x800.jpg" alt="" />
Вот код:
<?php
// Получаем мета-данные изображения слайдера
$image = get_post_meta(get_the_ID(), WPGRADE_PREFIX.'homepage_slide_image', true);
if (!empty($image)) {
$image = json_decode($image);
// Получаем альтернативный текст изображения
$image_alt = get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true);
if ( empty( $image_alt )) {
// Если alt пустой, используем заголовок
$image_alt = $attachment->post_title;
}
if ( empty( $image_alt )) {
// Если заголовок пустой, используем подпись
$image_alt = $attachment->post_excerpt;
}
// Получаем заголовок изображения
$image_title = $attachment->post_title;
$image_id = $image->id;
// Получаем URL изображения
$image = wp_get_attachment_image_src( $image_id, 'blog-huge', false);
// Выводим тег изображения с alt
echo '<img class="homepage-slider_image" src="'.$image[0].'" alt="'. $image_alt .'" />';
}
?>

Для получения атрибутов alt и title изображения достаточно только его ID (идентификатора вложения).
$image_id = get_post_thumbnail_id();
$image_alt = get_post_meta($image_id, '_wp_attachment_image_alt', TRUE);
$image_title = get_the_title($image_id);
В качестве бонуса - вот как получить src изображения. Вместе с вышеуказанными атрибутами этого достаточно для формирования статической разметки изображения.
$size = 'my-size' // По умолчанию 'thumbnail', если не указано.
$image_src = wp_get_attachment_image_src($image_id, $size)[0];

Ваша проблема заключается в том, что вы не передаёте правильный ID вложения в функции get_post_meta()
и get_the_title()
.
Вот ваш код для получения атрибута alt
изображения:
$image_alt = get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true);
Он правильный, но переменная $attachment->ID
не определена в вашем коде, поэтому функция ничего не возвращает.
Исходя из вашего кода, похоже, что вы сохраняете ID изображения как мета-поле и затем получаете его этим кодом:
$image = get_post_meta(get_the_ID(), WPGRADE_PREFIX.'homepage_slide_image', true);
Итак, предполагая, что $image->id
в вашем коде корректен, вам следует заменить это:
$image_alt = get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true);
На это:
$image_alt = get_post_meta( $image->id, '_wp_attachment_image_alt', true);
Это для получения атрибута alt
, а для получения заголовка:
$image_title = get_the_title( $image->id );

Я использую быструю функцию во всех своих темах для получения данных вложения изображения:
//получить метаданные вложения
if ( !function_exists('wp_get_attachment') ) {
function wp_get_attachment( $attachment_id )
{
$attachment = get_post( $attachment_id );
return array(
'alt' => get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ),
'caption' => $attachment->post_excerpt,
'description' => $attachment->post_content,
'href' => get_permalink( $attachment->ID ),
'src' => $attachment->guid,
'title' => $attachment->post_title
);
}
}
Надеюсь, это будет полезно!

$image = get_post_meta(get_the_ID(), WPGRADE_PREFIX . 'homepage_slide_image', true);
if (!empty($image)) {
$image = json_decode($image);
$image_id = $image->id;
$img_meta = wp_prepare_attachment_for_js($image_id);
$image_title = $img_meta['title'] == '' ? esc_html_e('Отсутствует заголовок','{domain}') : $img_meta['title'];
$image_alt = $img_meta['alt'] == '' ? $image_title : $img_meta['alt'];
$image_src = wp_get_attachment_image_src($image_id, 'blog-huge', false);
echo '<img class="homepage-slider_image" src="' . $image_src[0] . '" alt="' . $image_alt . '" />';
}
Обратите внимание, что я не проверял ваш $image->id
, просто предположил, что у вас правильный ID вложения. Остальное берется из $img_meta
. Если отсутствует alt, мы используем заголовок изображения, если заголовок отсутствует, вы увидите текст "Отсутствует заголовок", чтобы напомнить вам заполнить его.

Окей, я нашел ответ, которого ни у кого нет в сети, я искал его несколько дней. Имейте в виду, что это работает только если ваша тема или плагин использует WP_Customize_Image_Control(). Если вы используете WP_Customize_Media_Control(), то get_theme_mod() вернет ID, а не URL.
В моем случае я использовал более новую версию WP_Customize_Image_Control().
Много постов на форумах предлагают использовать get_attachment_id(), который больше не работает. Я использовал attachment_url_to_postid().
Вот как я смог это сделать. Надеюсь, это поможет кому-то.
// Получаем URL изображения
$feature1 = get_theme_mod('feature_image_1');
// Получаем ID поста
$feature1_id = attachment_url_to_postid($feature1);
// Получаем ALT-текст изображения, установленный в медиабиблиотеке
$image1_alt = get_post_meta( $feature1_id, '_wp_attachment_image_alt', true );
Разметка
<a href="<?php echo $feature1_url; ?>"><img class="img-responsive center-block" src="<?php echo $feature1; ?>" alt="<?php echo $image1_alt; ?>"></a>

По-настоящему WordPress-овым решением будет использование предоставленной функции get_image_tag()
для получения HTML-тега изображения, передавая в функцию id и alt в качестве аргументов. Другие ответы уже объясняют, как получить атрибут alt.
Эта функция также автоматически обрабатывает атрибуты srcset и sizes, которые вам в противном случае пришлось бы указывать вручную с помощью wp_get_attachment_image_srcset
, чтобы обеспечить современную браузерную оптимизацию загрузки изображений.
