ACF – Saving the first gallery image as the featured image
Published onI decided to use the Advanced Custom Fields Gallery field to show some images on a specific post type. Easy enough, but I wanted to set the featured image from the first gallery image, as there’s a performance hit involved in retrieving all those gallery arrays on, say an archive or search results page. A quick Googling and I found some code that almost did it:
http://support.advancedcustomfields.com/forums/topic/display-1-gallery-picture-on-archive-page/
The answer from marius.stuparu almost did do the job, namely:
| function set_featured_image_from_gallery() { | |
| $has_thumbnail = get_the_post_thumbnail($post->ID); | |
| if ( !$has_thumbnail ) { | |
| $images = get_field('gallery', false, false); | |
| $image_id = $images[0]; | |
| if ( $image_id ) { | |
| set_post_thumbnail( $post->ID, $image_id ); | |
| } | |
| } | |
| } | |
| add_action( 'save_post', 'set_featured_image_from_gallery' ); |
However, I noticed straight away a couple of problems. I’m using this in a functions.php file, i.e. outside the loop, so global $post was required, plus some changes to get_field.
But more than that, the code was giving a load of trying to get property of non-object errors when saving other post objects in the backend, such as menus. The solution was changing the hook from save_post to save_post_{$post-type}, which is documented in the Codex entry for save_post; its been there since 3.7.
So the solution then, which doesn’t give any errors, is below.
| function set_featured_image_from_gallery() { | |
| global $post; | |
| $post_id = $post->ID; | |
| $has_thumbnail = get_the_post_thumbnail($post_id); | |
| if ( !$has_thumbnail ) { | |
| $images = get_field('image_gallery', $post_id, false); | |
| $image_id = $images[0]; | |
| if ( $image_id ) { | |
| set_post_thumbnail( $post_id, $image_id ); | |
| } | |
| } | |
| } | |
| add_action( 'save_post_property', 'set_featured_image_from_gallery' ); |