Как получить альтернативный текст (Alt Text) изображения во вложении?

31 авг. 2010 г., 01:10:35
Просмотры: 82.9K
Голосов: 39

Я использую файл 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 изображения.

0
Все ответы на вопрос 7
6
65

Недавно я проводил исследование для клиентского проекта, и вот вам на! — теперь могу использовать эти знания здесь!

После текста вы увидите категоризированный список большинства (всех?) функций для работы с изображениями в WordPress 3.0.1 (я сгруппировал их в некотором порядке, но не стоит слишком полагаться на мою классификацию).

В любом случае, отвечая на то, что (я думаю) вам нужно, а не на то, что вы спросили (ладно, я отвечу и на ваш вопрос, в конце), полагаю, вам нужна функция wp_get_attachment_image(), которая возвращает HTML-строку, содержащую следующие атрибуты:

  • 'src',
  • 'class',
  • 'alt' и
  • 'title'.

Функции для работы с изображениями в WordPress 3.0

Вот функции WordPress для работы с изображениями для вашего и чужого удобства (перейдите ниже, чтобы увидеть ответ на ваш точный вопрос):

Поддержка изображений/миниатюры

Прикрепленные файлы

MIME-типы

Загрузки

Файловая система

HTML

Низкоуровневая работа с изображениями:


Как и обещал, текст 'alt' изображения хранится в виде строки в таблице wp_postmeta с meta_key '_wp_attachment_image_alt'.

Как вы, вероятно, уже знаете, его можно загрузить с помощью простого вызова get_post_meta(), например:

$alt_text = get_post_meta($post->ID, '_wp_attachment_image_alt', true);

31 авг. 2010 г. 13:44:16
Комментарии

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

kevtrout kevtrout
31 авг. 2010 г. 14:04:12

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

MikeSchinkel MikeSchinkel
31 авг. 2010 г. 14:44:43

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

kevtrout kevtrout
31 авг. 2010 г. 18:21:52

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

MikeSchinkel MikeSchinkel
31 авг. 2010 г. 21:00:05

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

Jonathan Wold Jonathan Wold
13 июл. 2011 г. 00:02:09

Очень подробный ответ, отличная работа!

Bas van Dijk Bas van Dijk
23 апр. 2018 г. 12:31:09
Показать остальные 1 комментариев
2

Рекомендуется рассмотреть функцию 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().

24 апр. 2015 г. 01:38:28
Комментарии

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

Larzan Larzan
16 июл. 2015 г. 16:50:36

@Larzan Я бы не беспокоился о производительности - разве что вы получаете данные о сотнях изображений одновременно...

Tom Auger Tom Auger
17 июл. 2015 г. 17:17:05
0

Ответ Майка, конечно, правильный, но $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 )); 
}
11 февр. 2015 г. 11:43:28
0

Я выяснил, что альтернативный текст для вложений хранится в пользовательском метаполе "_wp_attachment_image_alt".

Таким образом, имея ID вложения, я смог получить альтернативный текст с помощью этого кода:

<?php echo get_post_meta($attachment_id, '_wp_attachment_image_alt', true) ?>
26 дек. 2011 г. 02:34:34
0

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

  $the_img = wp_get_attachment_image( get_post_thumbnail_id( get_the_ID() ) );
11 авг. 2017 г. 01:00:30
0

Если вы используете 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>
28 апр. 2017 г. 13:34:11
0

Если цивилизационные методы не работают:

alt="<?php echo explode("\"",get_the_post_thumbnail(get_the_ID()))[9]; ?>"
2 июн. 2022 г. 12:50:55