Here’s one little snippet that took a while to work out so I thought I’d post it here in case its useful for others.

I had a custom field using ACF (Advanced custom fields plugin) that added an extra field to uploaded images that I wanted to use to sort them in a gallery. Adding the extra field via ACF was very easy but I wanted to copy the title of the image and use that in my custom field.

There are many different hooks for manipulating uploaded media such as ‘edit_attachment’ and ‘attachment_fields_to_save’ but now of them seemed to work when the image was uploaded, only when some of the other attachment data was edited and the ajax save was fired. What I wanted was the image to upload and automatically populate the custom field. After a lot of searching around I came across the ‘add_attachment’ hook which seemed to do the trick with my test code.

The next problem was automating the copy of the title text over to my custom field. The WordPress function ‘update_post_meta’ seemed like it might be a good option but it just would not work. It turned out that ACF deals with its custom fields in a slightly different way and in fact has its own update function called ‘update_field’. This did the trick and the following snippet of code now copies the title to my custom field as an image is uploaded.

function copy_title_to_custom_field( $post_ID ) {

$attachment_title = get_the_title( $post_ID );
update_field( 'image_order_title', $attachment_title, $post_ID );

}
add_action( 'add_attachment', 'copy_title_to_custom_field' );

Now the clever bit I need this for is to use a custom field to order a set of gallery images by numeric values. I have a photography website were I want the user to be able to name a set of photos, upload them in one batch and have them all display in the correct order. WordPress doesn’t seem to deal with this very well so it’s taken a bit of hammering into shape to get it to work properly and the only way to successfully order numeric file names is to use ‘orderby=meta_value_num’ BUT you can only seem to do this with custom fields! What a headache!