Сохранить информацию о камере как метаданные при загрузке изображения?

8

Я пытаюсь, чтобы WordPress автоматически сохранял метаданные «кредит», которые хранятся в загружаемых мной изображениях. Я знаю, что это будет введено в качестве пользовательского метаполя поста с помощью update_post_meta().

«Кредитная» информация собирается wp_read_image_metadata(), но media_handle_upload()не использует ее. Он использует только информацию «заголовок» и «заголовок», собранные из изображения для post_contentи post_titleсоответственно.

Я нашел несколько примеров того, как добавить пользовательские поля метаданных вложения после загрузки при редактировании изображения, но поскольку WP уже собирает эту информацию из метаданных изображения, я бы хотел найти способ сохранить ее как изображение загружен

Мне неясно, какие шаги нужно предпринять, чтобы подключиться media_handle_upload()(кажется, что это не так), чтобы я мог позвонить, update_post_metaчтобы сохранить «кредитную» строку для вложения.

edeneye
источник
1
Это отличный вопрос, я постараюсь ответить на него, когда у меня будет время, или добавлю вознаграждение. Я попытался в течение 15 минут, и он выдал несколько удивительно подробных ошибок, таких как «произошла ошибка при загрузке. Пожалуйста, попробуйте позже», даже если это работало.
Wyck
2
Привет @ Wyck, действительно отличный Q, я думаю, что я работал над этим в то же время;)
brasofilo

Ответы:

7

Вы можете использовать wp_generate_attachment_metadata:

Эта функция генерирует метаданные для вложения изображения. Он также создает миниатюру и другие промежуточные размеры вложения изображения на основе размеров, определенных на Settings_Media_Screen.

Вторым аргументом фильтра является идентификатор вложения, поэтому не должно быть проблем с добавлением мета-сообщения:

add_filter( 'wp_generate_attachment_metadata', 'manipulate_metadata_wpse_91177', 10, 2 );

function manipulate_metadata_wpse_91177( $metadata, $attachment_id ) 
{
    // var_dump( $metadata['image_meta'] );
    // Credit is inside $metadata['image_meta']['credit']
    return $metadata;
}

Проверка содержимого $metadata['image_meta']с помощью FirePHP, вот результаты:

aperture: 4
camera: "DMC-FZ100"
caption: ""
copyright: ""
created_timestamp: 1352136868
credit: ""
focal_length: "9.2"
iso: "100"
shutter_speed: "0.003125"
title: "Double Dip"

[Обновить]
Полное тестовое добавление пользовательского столбца на экране библиотеки мультимедиа ( /wp-admin/upload.php) для отображения метаинформации поста:

add_filter( 'wp_generate_attachment_metadata', 'manipulate_metadata_wpse_91177', 10, 2 );
add_filter( 'manage_upload_columns', 'camera_info_column_wpse_91177' );
add_action( 'manage_media_custom_column', 'camera_info_display_wpse_91177', 10, 2 );

function manipulate_metadata_wpse_91177( $metadata, $attachment_id ) 
{
    update_post_meta( $attachment_id, 'photo_title', $metadata['image_meta']['title'] );
    update_post_meta( $attachment_id, 'photo_camera', $metadata['image_meta']['camera'] );
    return $metadata;
}

function camera_info_column_wpse_91177( $columns ) 
{
    $columns['cam_info'] = 'Camera Info';    
    return $columns;
}

function camera_info_display_wpse_91177( $column_name, $post_id ) 
{
    if( 'cam_info' != $column_name || !wp_attachment_is_image( $post_id ) )
        return;

    $title = get_post_meta( $post_id, 'photo_title', true );
    $camera = get_post_meta( $post_id, 'photo_camera', true );
    $echo_title = $title ? 'Title: ' . $title . '<br />' : '';
    $echo_camera = $camera ? 'Camera: ' . $camera : '';
    echo $echo_title . $echo_camera;
}

информация о камере

Отчасти связанные вопросы и ответы: создание новой категории при сохранении на основе информации о публикации

brasofilo
источник
Я думаю, что я неправильно понял вопрос, к счастью, вы ответили, я пытался установить поле «кредит» в разделе медиа-бокса, чтобы конечный пользователь мог изменить его, если он хочет изменить его по сравнению с тем, что сказал exif. ..
Wyck
@brasofilo Еще раз спасибо. Кстати, почему $ attachment_id должен быть вторым аргументом фильтра? Это не работает, если это первый аргумент. Я не смог найти разъяснения в документах add_filter.
Edeneye
@brasofilo Спасибо еще раз. Это имеет смысл, глядя на вызов apply_filters для wp_generate_attachment_metadata. Я смотрел на саму функцию, а не на вызов apply_filters.
Edeneye