简体   繁体   中英

Making custom field appear in captions for image attachments (Wordpress)

I'm a designer (not a developer) working on a Wordpress site for a customer. Using the ACF-plugin I've set up a custom field on media files for photo credits. This works fine on featured images, where I can call it in single.php like this:

$post_thumbnail = get_post(get_post_thumbnail_id());
$credit = get_field('media_credit', $post_thumbnail);
if($credit):
echo '<div class="media-credit"><p>Photo: '.$credit.'</p></div>';
endif;

So I know the custom field works, and outputs the right data. However, I can't get it to work on image attachments in posts. What I have is this:

add_filter( 'img_caption_shortcode', 'my_img_caption_shortcode', 10, 3 );

function my_img_caption_shortcode( $empty, $attr, $content ){
    $attr = shortcode_atts( array(
        'id'      => '',
        'align'   => 'alignnone',
        'width'   => '',
        'caption' => ''
    ), $attr );

    if ( 1 > (int) $attr['width'] || empty( $attr['caption'] ) ) {
        return '';
    }

    if ( $attr['id'] ) {
        $attr['id'] = 'id="' . esc_attr( $attr['id'] ) . '" ';
    }
    //OUTPUT CREDIT
    $photographer = get_field( 'media_credit', $attachment_id );
    if ($photographer):$media_byline = '<br/><span class="media-credit">Photo: '.$photographer.'</span>';endif;

    return '<div ' . $attr['id']
    . 'class="wp-caption ' . esc_attr( $attr['align'] ) . '" '
    . do_shortcode( $content )
    . '<p class="wp-caption-text">' . $attr['caption'] . '' . $media_byline . '</p>'
    . '</div>';

}

If I remove the if-statement in OUTPUT it shows «Photo: » within the captions, after the text like it should, but it doesn't get any data. What am I missing?

(BTW – I know there are plugins that outputs image credits, but they tend to have styles and features I have to override, resulting in a spaghetti mess I'd hate to hand over to the next guy working on this site.)

Finally got this to work! :-D Instead of using $attachment_id , I got the ID from $attr , and then stripped the 'attachment_' prefix from output.

I also made separate fields for photographer and bureau, but I guess that's beside the point.

Here is the code:

function my_img_caption_shortcode( $empty, $attr, $content ){
    $attr = shortcode_atts( array(
        'id'      => '',
        'align'   => 'alignnone',
        'width'   => '',
        'caption' => ''
    ), $attr );

    if ( 1 > (int) $attr['width'] || empty( $attr['caption'] ) ) {
        return '';
    }

    $credit_id = $attr['id'];
    $credit_id = str_replace( 'attachment_', '', $credit_id );

    $photographer = get_field( 'media_credit', $credit_id );
    $bureau_credit = get_field( 'media_bureau', $credit_id );
    if ( $photographer && $bureau_credit ): $dash = ' / ';
    endif;
    if ( $photographer || $bureau_credit ): $media_byline = '<br/><span class="media-credit">PHOTO: '
        . $photographer . ''
        . $dash . '<span class="bureau-credit">'
        . $bureau_credit
        . '</span></span>';
    endif;

    return '<div id="attachment_' . $credit_id . '"'
    . 'class="wp-caption ' . esc_attr( $attr['align'] ) . '" '
    . do_shortcode( $content )
    . '<p class="wp-caption-text">' . $attr['caption'] . '' . $media_byline . '</p>'
    . '</div>';
}

add_filter( 'img_caption_shortcode', 'my_img_caption_shortcode', 10, 3 );

This solution is something I lifted from the AFC Media Credit-plugin , so credits to the developer.

I hope this is useful for anybody who wants to achieve something similar.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM