¿Cómo Recuperar el Texto Alt de una Imagen Adjunta?
Estoy usando un archivo attachment.php para mostrar versiones grandes de imágenes que han sido clickeadas en otro lugar. Me gustaría extraer el texto alt como un pie de foto debajo de la imagen con JavaScript, pero el texto alt no se incluye cuando se usa wp_get_attachment_image_src(). No creo que WordPress tenga una función para recuperarlo, así que necesito crear la mía. Para escribir esa función necesito saber... ¿Dónde se almacena el texto alt de una imagen?
Mi página de adjuntos usa wp_get_attachment_image_src()
, que no incluye el texto alt.
<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>
Esto muestra:
<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>
Soy consciente de que se está llamando a $post->post_excerpt
en el código anterior, pero no estoy seguro de con qué reemplazarlo para obtener el atributo alt de la imagen.
Recientemente hice una investigación para un proyecto de un cliente, así que ¡he aquí! puedo usarla aquí.
Después del texto verás una lista categorizada de la mayoría (¿todas?) las funciones de manejo de imágenes dentro de WordPress 3.0.1 (las agrupé con cierto orden, pero no le des demasiada credibilidad a mi categorización).
De cualquier forma, respondiendo a lo que (creo) necesitas en lugar de lo que preguntaste (vale, también responderé eso al final) creo que lo que necesitas es la función wp_get_attachment_image()
que devolverá una cadena HTML conteniendo estos atributos:
'src'
,'class'
,'alt'
y'title'
.
Funciones de manejo de imágenes en WordPress 3.0
Aquí están las funciones de manejo de imágenes de WordPress para tu referencia y la de otros (salta más abajo para la respuesta exacta a tu pregunta):
Soporte de Imágenes/Thumbnails
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 )
Adjuntos
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 )
Tipos 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 = '')
Subidas
Sistema de archivos
HTML
Manejo de imágenes de bajo nivel:
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)
Como prometí, el texto 'alt'
de la imagen se almacena como una cadena en wp_postmeta
con la meta_key '_wp_attachment_image_alt'
.
Como probablemente ya sabes, puedes cargarlo con un simple get_post_meta()
así:
$alt_text = get_post_meta($post->ID, '_wp_attachment_image_alt', true);

Bueno, no puedo evitar sentirme un poco tonto ahora que lo has mencionado. He usado wp_get_attachment_imgage()
antes y lo olvidé por completo. Tienes razón sobre lo que pensé que realmente necesitaba. Gracias por la información. También tienes razón sobre dónde se almacena el meta alt... miré en ese mismo lugar, pero se me escapó aunque debí haberlo estado viendo directamente. Eso me pasa por meterme en esto al final del día. ¡Gracias de nuevo!

Oye, no hay problema. Yo también he hecho preguntas realmente obvias en el pasado reciente en la lista de hackers solo para que la respuesta fuera evidentemente obvia tan pronto como alguien lo mencionó. Es fácil pasar algo por alto aquí o allá. Pero el verdadero beneficio de WordPress Answers es que cada pregunta y respuesta se convierte en un recurso para otros con preguntas similares en el futuro. ¡Incluso espero que en el futuro busque en Google cosas que respondí pero olvidé en algún momento!

Pregunta rápida: indicaste que wp_get_attachment_image()
devuelve un array con la src de la imagen y sus atributos. Parece que solo devuelve HTML que contiene la imagen y sus atributos. Igual cumple su función, solo que no sabía si estabas al tanto de algo que no está en la referencia de la función: http://codex.wordpress.org/Function_Reference/wp_get_attachment_image

@kevtrout: (con vergüenza) - Tienes razón, señor. Por primera vez aquí en StackExchange, solo leí el código y escribí esto sin probarlo. Actualizaré la respuesta más tarde después de atender mis obligaciones con el cliente.

@Mike - Solo un recordatorio rápido para actualizar la nota sobre wp_get_attachment_image como un array - eso me confundió un poco :). ¡Excelente respuesta por lo demás!

Considera revisar wp_prepare_attachment_for_js( $attachment )
, donde $attachment
es el objeto WP_Post del adjunto en sí.
Esta es un poco una función "todo en uno", pero proporciona un hash muy completo con mucha metainformación, incluyendo '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,
);
Esto es particularmente útil (como su nombre lo indica), para enviar la metainformación de la imagen adjunta a una vista wp.media mediante wp_send_ajax()
, pero eso no significa que no puedas usarlo para otros propósitos.
Me gusta abstraerme del campo de metadatos _wp_attachment_image_alt
, en caso de que el método para recuperar el texto alternativo cambie alguna vez (poco probable, pero concebible).
Sin embargo, creo que hay un caso para un método wp_get_attachment_image_alt()
.

Exactamente lo que estaba buscando. ¿Alguien tiene idea de su rendimiento? Con tantos valores diferentes que recupera... Me pregunto...

La respuesta de Mike es correcta, por supuesto, pero $alt_text = get_post_meta($post->ID, '_wp_attachment_image_alt', true);
puede devolver una cadena vacía.
Sin embargo, wp_get_attachment_image siempre obtiene un alt_text.
El equipo de WordPress aplica el siguiente truco: primero verifica el post_excerpt y luego obtiene el título.
if(empty($alt_text)) // Si no hay texto alternativo, usa el Caption
{
$attachment = get_post($post->ID);
$alt_text = trim(strip_tags( $attachment->post_excerpt ));
}
if(empty($alt_text)) // Finalmente, usa el título
{
$attachment = get_post($post->ID);
$alt_text = trim(strip_tags( $attachment->post_title ));
}

Descubrí que el texto alternativo para los archivos adjuntos se almacena en un metadato personalizado llamado "_wp_attachment_image_alt".
Así que, teniendo el ID del archivo adjunto, pude obtener el texto alternativo con este código:
<?php echo get_post_meta($attachment_id, '_wp_attachment_image_alt', true) ?>

Para complementar la respuesta de Mike, alguien podría encontrar esto útil. Es posible que necesites obtener el ID específico del adjunto, por lo que puedes hacerlo pasando el ID de la publicación a get_post_thumbnail_id
ejemplo:
$the_img = wp_get_attachment_image( get_post_thumbnail_id( get_the_ID() ) );

Si estás usando WP_Customize_Media_Control(), tu get_theme_mod() devolverá el ID del post, pero si usas el nuevo WP_Customize_Image_Control(), get_theme_mod() devolverá la URL de la imagen. Así fue como pude obtener el texto ALT usando WP_Customize_Image_Control().
Aquí está cómo lo hice. Espero que esto ayude a alguien por ahí.
// Esto obtiene la imagen / URL
$feature1 = get_theme_mod('feature_image_1');
// Esto obtiene el ID del post
$feature1_id = attachment_url_to_postid($feature1);
// Esto obtiene el texto ALT de la imagen que está configurado en el área de medios
$image1_alt = get_post_meta( $feature1_id, '_wp_attachment_image_alt', true );
Marcado HTML
<a href="<?php echo $feature1_url; ?>"><img class="img-responsive center-block" src="<?php echo $feature1; ?>" alt="<?php echo $image1_alt; ?>"></a>
