I would like to set the contents of a custom field called featured_image_author
as the caption for that post’s featured image. Is that possible?
You need to create an acf/save_post filter and update the image post with it
add_filter('acf/save_post', 'update_featured_image_caption', 20, 1);
function update_featured_image_caption($post_id) {
// get the featured image id of the post
$id = get_post_thumbnail_id();
// if not set, exit
if (!$id) {
return;
}
// get the field you want to use for the image captions
$excerpt = get_field('your-field-name', $post_id);
// if not set, exit
if (!$excerpt) {
return;
}
// get the attachment post
$attachment = get_psot($id);
// alter the caption (post_excerpt)
$attachment->post_excerpt = $excerpt;
// disable this filter to prevent infinite loop
remove_filter('acf/save_post', 'update_featured_image_caption', 20);
// update the attachment post
wp_update_post($attachment);
// re-enable this filter
add_filter('acf/save_post', 'update_featured_image_caption', 20, 1);
}
It caused a critical error when I updated a post.
Turn on debugging, there might be an error in my code since I typed it here https://codex.wordpress.org/WP_DEBUG
Support pointed out that there is a typo, but this worked perfectly for me. Fixed typo below:
add_filter('acf/save_post', 'update_featured_image_caption', 20, 1);
function update_featured_image_caption($post_id) {
// get the featured image id of the post
$id = get_post_thumbnail_id();
// if not set, exit
if (!$id) {
return;
}
// get the field you want to use for the image captions
$excerpt = get_field('your-field-name', $post_id);
// if not set, exit
if (!$excerpt) {
return;
}
// get the attachment post
$attachment = get_post($id);
// alter the caption (post_excerpt)
$attachment->post_excerpt = $excerpt;
// disable this filter to prevent infinite loop
remove_filter('acf/save_post', 'update_featured_image_caption', 20);
// update the attachment post
wp_update_post($attachment);
// re-enable this filter
add_filter('acf/save_post', 'update_featured_image_caption', 20, 1);
}