Comment récupérer le texte alternatif d'une pièce jointe d'image?

32

J'utilise un fichier attachment.php pour afficher de grandes versions d'images sur lesquelles on a cliqué ailleurs. J'aimerais extraire le texte alt de l'image en tant que légende sous l'image avec javascript, mais le texte alt n'est pas inclus lorsque wp_get_attachment_image_src () est utilisé. Je ne pense pas que WP ait une fonction pour le récupérer, alors j'ai besoin de la mienne. Pour écrire cette fonction, j'ai besoin de savoir ... Où le texte de remplacement d'une image est-il stocké?

Ma page de pièce jointe utilise wp_get_attachment_image_src(), qui n'inclut pas le texte alternatif.

<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>

Ceci montre:

<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>  

Je suis conscient du fait que le $post->post_excerptcode est appelé dans le code ci-dessus, mais je ne sais pas quoi remplacer par celui-ci pour obtenir l'attribut alt de l'image.

kevtrout
la source

Réponses:

53

J'ai récemment fait des recherches pour un projet client récemment, alors voilà que je peux l'utiliser ici!

Après le texte, vous verrez une liste catégorisée de la plupart (toutes?) Des fonctions de traitement des images à partir de WordPress 3.0.1 (je les ai groupées dans un semblant d'ordre, mais je ne mets pas trop de crédibilité dans ma catégorisation.)

Quoi qu'il en soit, en répondant à ce que vous avez besoin (je pense) au lieu de ce que vous avez demandé (d' accord, je vais aussi répondre à la fin ), je pense que ce dont vous avez besoin est la wp_get_attachment_image()fonction qui renverra une chaîne HTML contenant ces attributs:

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

WordPress 3.0 Fonctions de traitement d'images

Voici donc les fonctions de traitement des images de WordPress pour votre référence et celle des autres ( saut ci-dessous pour la réponse à votre question exacte ):

Support d'image / Miniatures

Attachement

Types MIME

Uploads

Système de fichiers

HTML

Traitement des images à bas niveau:


Comme promis, le texte de l' image 'alt'est stocké sous forme de chaîne wp_postmetaavec la méta_key de'_wp_attachment_image_alt' .

Comme vous le savez probablement déjà, vous pouvez le charger avec un simple get_post_meta()comme ceci:

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

Mike Schinkel
la source
1
Eh bien, je ne peux pas m'empêcher de me sentir un peu dopé maintenant que vous l'avez dit. Je l'ai déjà utilisé wp_get_attachment_imgage()et je l'ai complètement oublié. Vous avez raison sur ce dont je pensais avoir réellement besoin. Merci pour l'info. Vous avez également raison de savoir où est stockée la méta-alt. C'est ce que je reçois pour y entrer à la fin de la journée. Merci encore!
Kevtrout
Hé, pas de problème. J'ai récemment posé des questions très évidentes sur la liste des hackers, pour que la réponse soit évidente dès que quelqu'un en a parlé. Il est facile de rater quelque chose ici ou là. Mais le véritable avantage de WordPress Answers est que chaque question et réponse devient une ressource pour les autres avec des questions similaires à l'avenir. Je m'attends même à ce que je répète sur Google ce à quoi j'ai répondu mais que j'ai oublié par la suite!
MikeSchinkel
1
Question rapide: vous avez indiqué que wp_get_attachment_image()retourne un tableau des attributs d’image et de sécurité. Il semble ne renvoyer que du code HTML contenant l'image et ses attributs. Fait toujours le travail, mais je ne savais pas si vous saviez quelque chose qui ne figurait
kevtrout
1
@Mike - Juste un petit rappel pour mettre à jour la note à propos de wp_get_attachment_image en tant que tableau - cela m'a un peu dérouté :). Excellente réponse sinon!
Jonathan Wold
1
Réponse très détaillée, bravo!
Bas van Dijk
5

Envisagez de regarder wp_prepare_attachment_for_js( $attachment )où se $attachmenttrouve l'objet WP_Post de la pièce jointe.

C'est un peu une fonction "d'évier de cuisine", mais elle fournit un très bon hash avec une tonne de métadonnées, y compris '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,
    );

Ceci est particulièrement utile (comme son nom l'indique), pour envoyer la méta de l'image de pièce jointe à un wp.media View via wp_send_ajax(), mais cela ne signifie pas que vous ne pouvez pas l'utiliser à d'autres fins.

J'aime faire abstraction du _wp_attachment_image_altchamp meta post, au cas où la méthode de récupération du texte alternatif changerait (peu probable, mais concevable).

J'estime qu'il y a un cas pour une wp_get_attachment_image_alt()méthode cependant.

Tom Auger
la source
Exactement ce que je cherchais. Quelqu'un a-t-il une idée de ses performances? Avec tant de valeurs différentes, il récupère ... Je me demande ...
Larzan le
@Larzan Je ne m'inquiéterais pas des performances - à moins que vous obteniez des centaines de données d'images en même temps ...
Tom Auger
4

La réponse de Mike est correcte, bien sûr, mais $alt_text = get_post_meta($post->ID, '_wp_attachment_image_alt', true);peut renvoyer une chaîne vide.

wp_get_attachment_image , cependant, obtient toujours un alt_text.

L'équipe Wordpress applique l'astuce suivante en vérifiant d'abord le post_except, puis en obtenant le titre.

if(empty($alt_text)) // If not, Use the Caption
{
    $attachment = get_post($post->ID);
    $alt_text = trim(strip_tags( $attachment->post_excerpt ));
}
if(empty($alt_text)) // Finally, use the title
{ 
    $attachment = get_post($post->ID);
    $alt_text = trim(strip_tags( $attachment->post_title )); 
}
GUI Junkie
la source
2

J'ai découvert que le texte Alt des pièces jointes était stocké dans une méta personnalisée appelée "_wp_attachment_image_alt".

Donc, ayant l'identifiant de la pièce jointe, j'ai pu obtenir le texte alternatif avec ce code:

<?php echo get_post_meta($attachment_id, '_wp_attachment_image_alt', true) ?>
Chilljul
la source
0

Si vous utilisez WP_Customize_Media_Control (), votre get_theme_mod () renverra l'identifiant de publication, mais si vous utilisez le nouveau WP_Customize_Image_Control (), get_theme_mod () retournera l'URL de l'image, ce qui m'a permis d'obtenir le texte alt de WP_Customize_Image ()

Voici comment j'ai pu le faire. J'espère que cela aide quelqu'un là-bas

// This is getting the image / url
$feature1 = get_theme_mod('feature_image_1');

// This is getting the post id
$feature1_id = attachment_url_to_postid($feature1);

// This is getting the alt text from the image that is set in the media area
$image1_alt = get_post_meta( $feature1_id, '_wp_attachment_image_alt', true );

Balisage

<a href="<?php echo $feature1_url; ?>"><img class="img-responsive center-block" src="<?php echo $feature1; ?>" alt="<?php echo $image1_alt; ?>"></a>
DevTurtle
la source
0

Pour ajouter à la réponse de Mike, cela pourrait être utile. Vous aurez peut-être besoin d'obtenir l'ID spécifique de la pièce jointe. Vous pouvez donc le faire en transmettant l'ID de publication à l' get_post_thumbnail_idexemple:

  $the_img = wp_get_attachment_image( get_post_thumbnail_id( get_the_ID() ) );
Uriahs Victor
la source