Jak pobrać tekst alternatywny załącznika do obrazu?

32

Korzystam z pliku załącznika.php, aby wyświetlić duże wersje obrazów, które zostały kliknięte w innym miejscu. Chciałbym wyciągnąć tekst alternatywny obrazu jako podpis pod obrazem za pomocą javascript, ale tekst alternatywny nie jest uwzględniany, gdy używana jest wp_get_attachment_image_src (). Nie sądzę, że WP ma funkcję jej odzyskiwania, więc potrzebuję własnej. Aby napisać tę funkcję, muszę wiedzieć ... Gdzie jest przechowywany tekst alternatywny dla obrazu?

Używa mojej strony załącznika wp_get_attachment_image_src(), która nie zawiera tekstu alternatywnego.

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

To pokazuje:

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

Wiem, że $post->post_excerptjest wywoływany w powyższym kodzie, ale nie jestem pewien, co go zastąpić, aby uzyskać atrybut alt obrazu.

kevtrout
źródło

Odpowiedzi:

53

Niedawno przeprowadziłem kilka badań dla projektu klienckiego, więc od razu zacznę go używać!

Po tekście zobaczysz skategoryzowaną listę większości (wszystkich?) Funkcji obsługi obrazów z poziomu WordPress 3.0.1 (pogrupowałem je w pozornym porządku, ale nie przypisuję zbyt dużej wiarygodności mojej kategoryzacji).

W każdym razie, odpowiadając na to, czego potrzebujesz (myślę) zamiast tego, o co prosiłeś (ok , ja też na to odpowiem na końcu ) Myślę, że potrzebujesz wp_get_attachment_image()funkcji, która zwróci ciąg HTML zawierający te atrybuty:

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

Funkcje obsługi obrazu WordPress 3.0

Oto funkcje obsługi obrazów WordPress w celach informacyjnych dla ciebie i innych ( przejdź poniżej, aby uzyskać odpowiedź na dokładne pytanie ):

Obsługa obrazów / miniatury

Załącznik

Rodzaje MIME

Przesłane

System plików

HTML

Obsługa obrazów niskiego poziomu:


Zgodnie z obietnicą tekst obrazu 'alt'jest przechowywany jako ciąg znaków w wp_postmetameta_key z'_wp_attachment_image_alt' .

Jak zapewne już wiesz, możesz załadować go za pomocą prostego polecenia get_post_meta():

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

MikeSchinkel
źródło
1
Cóż, nie mogę nie poradzić na to, że czuję się trochę głupio, kiedy to powiedziałeś. Użyłem już wp_get_attachment_imgage()wcześniej i zupełnie o tym zapomniałem. Masz rację co do tego, co myślałem, że tak naprawdę potrzebuję. Dzięki za informację. Masz również rację co do miejsca, w którym przechowywana jest alt meta ... Spojrzałem właśnie w to miejsce, ale uniknęło mnie to, chociaż musiałem się na to gapić. To właśnie dostaję za to, że dostaję się do niego pod koniec dnia. Dzięki jeszcze raz!
kevtrout
Hej, nie ma problemu. W niedawnej przeszłości zadałem też kilka naprawdę oczywistych pytań na liście hakerów, aby odpowiedź była rażąco oczywista, gdy tylko ktoś o tym wspomniał. Łatwo jest przeoczyć coś tu lub tam. Ale prawdziwą korzyścią WordPress Answers jest każde pytanie, a odpowiedź staje się źródłem informacji dla innych z podobnymi pytaniami w przyszłości. Spodziewam się nawet, że odpowiem na Google, na które odpowiedziałem, ale zapomniałem w przyszłości!
MikeSchinkel,
1
Szybkie pytanie: wskazałeś, że wp_get_attachment_image()zwraca tablicę obrazu src i atrybutów. Wygląda na to, że zwraca tylko HTML zawierający obraz i jego atrybuty. Nadal wykonuje to zadanie, po prostu nie wiedziałem, czy wiesz coś, czego nie ma w funkcji ref: codex.wordpress.org/Function_Reference/wp_get_attachment_image
kevtrout
1
@ Mike - Krótkie przypomnienie, aby zaktualizować notatkę o wp_get_attachment_image jako tablicę - to mnie trochę zaskoczyło :). W przeciwnym razie doskonała odpowiedź!
Jonathan Wold
1
Bardzo szczegółowa odpowiedź, dobra robota!
Bas van Dijk
5

Zastanów się wp_prepare_attachment_for_js( $attachment ), gdzie $attachmentjest obiekt WP_Post samego załącznika.

Jest to trochę funkcja „zlewu kuchennego”, ale zapewnia bardzo ładny skrót z mnóstwem metadanych, w tym „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,
    );

Jest to szczególnie przydatne (jak sama nazwa wskazuje), do wysyłania meta obrazu załącznika do wp.media View przez wp_send_ajax(), ale to nie znaczy, że nie można go użyć do innych celów.

Lubię abstrakcji od _wp_attachment_image_altpola meta post, na wypadek gdyby metoda pobierania tekstu alternatywnego kiedykolwiek się zmieniła (mało prawdopodobne, ale możliwe).

Wydaje mi się jednak, że istnieje wp_get_attachment_image_alt()metoda na tę metodę.

Tom Auger
źródło
Dokładnie tego szukałem. Czy ktoś ma pojęcie o jego wydajności? Przy tak wielu różnych wartościach, które pobiera ... Zastanawiam się ...
Larzan
@Larzan Nie martwiłbym się wydajnością - chyba, że ​​jednocześnie otrzymujesz setki danych obrazów ...
Tom Auger,
4

Odpowiedź Mike'a jest oczywiście poprawna, ale $alt_text = get_post_meta($post->ID, '_wp_attachment_image_alt', true);może zwrócić pusty ciąg znaków.

wp_get_attachment_image jednak zawsze otrzymuje tekst alt_text.

Zespół Wordpress stosuje następującą sztuczkę, najpierw sprawdzając post_except, a następnie uzyskując tytuł.

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
źródło
2

Dowiedziałem się, że tekst alternatywny dla załączników był przechowywany w niestandardowej meta o nazwie „_wp_attachment_image_alt”

Mając identyfikator załącznika, udało mi się uzyskać tekst alternatywny za pomocą tego kodu:

<?php echo get_post_meta($attachment_id, '_wp_attachment_image_alt', true) ?>
chilljul
źródło
0

Jeśli używasz WP_Customize_Media_Control (), twoja metoda get_theme_mod () zwróci identyfikator postu, ale jeśli używasz nowej WP_Customize_Image_Control (), get_theme_mod () zwróci adres URL obrazu, dzięki temu mogłem uzyskać tekst alternatywny za pomocą WP_Customize_Image_Control ()

Oto jak mogłem to zrobić. Mam nadzieję, że to pomoże komuś tam

// 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 );

Narzut

<a href="<?php echo $feature1_url; ?>"><img class="img-responsive center-block" src="<?php echo $feature1; ?>" alt="<?php echo $image1_alt; ?>"></a>
DevTurtle
źródło
0

Aby dodać do odpowiedzi Mike'a, ktoś może uznać to za przydatne. Może być konieczne uzyskanie określonego identyfikatora załącznika, aby to zrobić, przekazując identyfikator posta na get_post_thumbnail_idprzykład:

  $the_img = wp_get_attachment_image( get_post_thumbnail_id( get_the_ID() ) );
Uriahs Victor
źródło