Как получить альтернативный текст (Alt Text) изображения во вложении?
Я использую файл attachment.php для отображения увеличенных версий изображений, по которым кликнули в другом месте. Я хотел бы с помощью JavaScript получить альтернативный текст изображения в качестве подписи под ним, но alt-текст не включается при использовании wp_get_attachment_image_src(). Я не думаю, что в WordPress есть функция для его получения, поэтому мне нужно создать свою. Чтобы написать эту функцию, мне нужно знать... Где хранится альтернативный текст изображения?
Моя страница вложения использует wp_get_attachment_image_src()
, которая не включает альтернативный текст.
<div class = "entry">
<?php
if ( wp_attachment_is_image( $post->id ) ) :
$att_image = wp_get_attachment_image_src( $post->id, "large");?>
<a href="<?php echo wp_get_attachment_url($post->id); ?>"
title="<?php the_title(); ?>"
rel="attachment">
<img class="attached_img"
src="<?php echo $att_image[0];?>"
width="<?php echo $att_image[1];?>"
height="<?php echo $att_image[2];?>"
class="attachment-medium"
alt="<?php $post->post_excerpt; ?>" />
</a>
} <?php endif;?>
</div>
Это показывает:
<div class = "entry">
<a href="http://www.example.com/wp-content/uploads/2010/07/photo_namejpg"
title="My_Photo_Title"
rel="attachment">
<img class="attached_img"
src="http://www.example.com/wp-content/uploads/2010/07/photo_name_and_size.jpg"
width="393"
height="500"
class="attachment-medium"
alt="" />
</a>
</div>
Я знаю, что в приведенном выше коде вызывается $post->post_excerpt
, но я не уверен, чем его заменить, чтобы получить атрибут alt изображения.

Недавно я проводил исследование для клиентского проекта, и вот вам на! — теперь могу использовать эти знания здесь!
После текста вы увидите категоризированный список большинства (всех?) функций для работы с изображениями в WordPress 3.0.1 (я сгруппировал их в некотором порядке, но не стоит слишком полагаться на мою классификацию).
В любом случае, отвечая на то, что (я думаю) вам нужно, а не на то, что вы спросили (ладно, я отвечу и на ваш вопрос, в конце), полагаю, вам нужна функция wp_get_attachment_image()
, которая возвращает HTML-строку, содержащую следующие атрибуты:
'src'
,'class'
,'alt'
и'title'
.
Функции для работы с изображениями в WordPress 3.0
Вот функции WordPress для работы с изображениями для вашего и чужого удобства (перейдите ниже, чтобы увидеть ответ на ваш точный вопрос):
Поддержка изображений/миниатюры
set_post_thumbnail_size( $width = 0, $height = 0, $crop = FALSE )
add_image_size( $name, $width = 0, $height = 0, $crop = FALSE )
get_intermediate_image_sizes()
wp_constrain_dimensions( $current_width, $current_height, $max_width=0, $max_height=0 )
Прикрепленные файлы
get_attached_file( $attachment_id, $unfiltered = false )
is_local_attachment($url)
update_attached_file( $attachment_id, $file )
wp_attachment_is_image( $post_id = 0 )
wp_count_attachments( $mime_type = '' )
wp_delete_attachment( $post_id, $force_delete = false )
wp_get_attachment_image($attachment_id, $size = 'thumbnail', $icon = false, $attr = '')
wp_get_attachment_image_src($attachment_id, $size='thumbnail', $icon = false)
wp_get_attachment_metadata( $post_id = 0, $unfiltered = false )
wp_get_attachment_thumb_file( $post_id = 0 )
wp_get_attachment_thumb_url( $post_id = 0 )
wp_get_attachment_url( $post_id = 0 )
wp_insert_attachment($object, $file = false, $parent = 0)
wp_update_attachment_metadata( $post_id, $data )
MIME-типы
wp_match_mime_types($wildcard_mime_types, $real_mime_types)
wp_mime_type_icon( $mime = 0 )
wp_post_mime_type_where($post_mime_types, $table_alias = '')
Загрузки
Файловая система
HTML
Низкоуровневая работа с изображениями:
wp_load_image( $file )
image_constrain_size_for_editor($width, $height, $size = 'medium')
image_downsize($id, $size = 'medium')
image_get_intermediate_size($post_id, $size='thumbnail')
image_hwstring($width, $height)
image_make_intermediate_size($file, $width, $height, $crop=false)
image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 )
image_resize_dimensions($orig_w, $orig_h, $dest_w, $dest_h, $crop = false)
Как и обещал, текст 'alt'
изображения хранится в виде строки в таблице wp_postmeta
с meta_key '_wp_attachment_image_alt'
.
Как вы, вероятно, уже знаете, его можно загрузить с помощью простого вызова get_post_meta()
, например:
$alt_text = get_post_meta($post->ID, '_wp_attachment_image_alt', true);

Что ж, теперь, когда вы это сказали, я чувствую себя немного глупо. Я раньше использовал wp_get_attachment_imgage()
, но совершенно забыл об этой функции. Вы правы насчёт того, что мне на самом деле нужно. Спасибо за информацию. Вы также правы насчёт того, где хранится мета-атрибут alt... Я заглядывал именно туда, но пропустил его, хотя, должно быть, смотрел прямо на него. Вот что бывает, когда берёшься за дело в конце дня. Ещё раз спасибо!

Эй, без проблем. Я сам недавно задавал несколько очевидных вопросов в списке хакеров, только чтобы понять, что ответ был прямо перед глазами, как только кто-то его озвучил. Здесь легко что-то упустить. Но главное преимущество WordPress Answers в том, что каждый вопрос и ответ становится ресурсом для других людей с похожими вопросами в будущем. Я даже ожидаю, что в будущем сам буду гуглить вещи, на которые отвечал, но потом забыл!

Быстрый вопрос: вы указали, что wp_get_attachment_image()
возвращает массив с src изображения и атрибутами. Но, кажется, она возвращает только HTML-код с изображением и его атрибутами. Всё равно делает своё дело, просто не знал, известно ли вам что-то, чего нет в справочнике функции: http://codex.wordpress.org/Function_Reference/wp_get_attachment_image

@kevtrout: (краснеет) - Вы правы, сэр. Впервые здесь, на StackExchange, я просто прочитал код и написал это без тестирования. Обновлю ответ позже, после того как разберусь с обязательствами перед клиентом.

@Mike - Просто быстрое напоминание обновить примечание о wp_get_attachment_image как о массиве - это немного сбило меня с толку :). В остальном отличный ответ!

Рекомендуется рассмотреть функцию wp_prepare_attachment_for_js( $attachment )
, где $attachment
— это объект WP_Post самого вложения.
Это своего рода "универсальная" функция, но она предоставляет удобный массив с множеством метаданных, включая 'alt':
$response = array(
'id' => $attachment->ID,
'title' => $attachment->post_title,
'filename' => wp_basename( $attachment->guid ),
'url' => $attachment_url,
'link' => get_attachment_link( $attachment->ID ),
'alt' => get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ),
'author' => $attachment->post_author,
'description' => $attachment->post_content,
'caption' => $attachment->post_excerpt,
'name' => $attachment->post_name,
'status' => $attachment->post_status,
'uploadedTo' => $attachment->post_parent,
'date' => strtotime( $attachment->post_date_gmt ) * 1000,
'modified' => strtotime( $attachment->post_modified_gmt ) * 1000,
'menuOrder' => $attachment->menu_order,
'mime' => $attachment->post_mime_type,
'type' => $type,
'subtype' => $subtype,
'icon' => wp_mime_type_icon( $attachment->ID ),
'dateFormatted' => mysql2date( get_option('date_format'), $attachment->post_date ),
'nonces' => array(
'update' => false,
'delete' => false,
'edit' => false
),
'editLink' => false,
'meta' => false,
);
Эта функция особенно полезна (как следует из названия) для передачи метаданных изображения в wp.media View через wp_send_ajax()
, но это не означает, что её нельзя использовать для других целей.
Мне нравится идея абстрагироваться от метаполя _wp_attachment_image_alt
на случай, если метод получения альтернативного текста когда-нибудь изменится (маловероятно, но возможно).
Я также считаю, что было бы полезно иметь метод wp_get_attachment_image_alt()
.

Именно то, что я искал. У кого-нибудь есть представление о производительности? С таким количеством различных значений, которые она извлекает... Интересно...

Ответ Майка, конечно, правильный, но $alt_text = get_post_meta($post->ID, '_wp_attachment_image_alt', true);
может вернуть пустую строку.
Однако wp_get_attachment_image всегда получает alt_text.
Команда WordPress применяет следующий трюк: сначала проверяет post_except, а затем получает заголовок.
if(empty($alt_text)) // Если пусто, используем подпись
{
$attachment = get_post($post->ID);
$alt_text = trim(strip_tags( $attachment->post_excerpt ));
}
if(empty($alt_text)) // В крайнем случае используем заголовок
{
$attachment = get_post($post->ID);
$alt_text = trim(strip_tags( $attachment->post_title ));
}

Я выяснил, что альтернативный текст для вложений хранится в пользовательском метаполе "_wp_attachment_image_alt".
Таким образом, имея ID вложения, я смог получить альтернативный текст с помощью этого кода:
<?php echo get_post_meta($attachment_id, '_wp_attachment_image_alt', true) ?>

Дополняя ответ Майка, кому-то может пригодиться следующее. Возможно, вам потребуется получить конкретный ID вложения, это можно сделать, передав ID записи в функцию get_post_thumbnail_id
. Пример:
$the_img = wp_get_attachment_image( get_post_thumbnail_id( get_the_ID() ) );

Если вы используете WP_Customize_Media_Control(), функция get_theme_mod() вернет ID записи. Но если вы используете новый WP_Customize_Image_Control(), get_theme_mod() вернет URL изображения. Вот как я смог получить альтернативный текст при использовании WP_Customize_Image_Control().
Вот как я это сделал. Надеюсь, это поможет кому-то.
// Получаем изображение / URL
$feature1 = get_theme_mod('feature_image_1');
// Получаем ID записи
$feature1_id = attachment_url_to_postid($feature1);
// Получаем альтернативный текст изображения, установленный в медиабиблиотеке
$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>
