As per outlined in the comments, by fixing a typo in my save function, and setting the third parameter in get_post_meta()
to true, and false in selected()
it worked liked a charm. Thanks everyone!
Here’s the working code in case anyone is trying to add a select list custom field to their media manager:
/*
Add license field to media attachments
*/
function add_custom_field_license( $form_fields, $post ) {
$license_field = get_post_meta($post->ID, 'license_field', true);
$form_fields['license_field'] = [
'label' => 'License',
'input' => 'html',
'html' => "<select name="attachments[{$post->ID}][license_field]" id='attachments-{$post->ID}-license_field'>
<option value="none" " . selected($license_field, "none", false) . ">None (all rights reserved)</option>
<option value="CC0" " . selected($license_field, "CC0", false) . ">CC0</option>
<option value="CC BY" " . selected($license_field, "CC BY", false) . ">CC BY</option>
<option value="CC BY-NC" " . selected($license_field, "CC BY-NC", false) . ">CC BY-NC</option>
<option value="CC BY-SA" " . selected($license_field, "CC BY-SA", false) . ">CC BY-SA</option>
<option value="CC BY-NC-ND" " . selected($license_field, "CC BY-NC-ND", false) . ">CC BY-NC-ND</option>
</select>",
];
return $form_fields;
}
add_filter('attachment_fields_to_edit', 'add_custom_field_license', null, 2);
/*
Save license field to media attachments
*/
function save_custom_field_license($post, $attachment) {
if( isset($attachment['license_field']) ){
update_post_meta($post['ID'], 'license_field', sanitize_text_field( $attachment['license_field'] ) );
}else{
delete_post_meta($post['ID'], 'license_field' );
}
return $post;
}
add_filter('attachment_fields_to_save', 'save_custom_field_license', null, 2);