Установите теги вложений из данных настраиваемого поля вложения


В настоящее время у меня есть пользовательское поле, добавленное в форму моего вложения под названием artist_credit с помощью крючка attachment_fields_to_edit. Когда человек вводит имя в поле "Кредит исполнителя", я хочу, чтобы он (если у него еще нет тега) назначил тег с этим именем тегам вложения при сохранении вложения.

У меня установлен плагин Медиа-теги Wordpress, который позволяет мне иметь поле в форме вложения для прикрепления терминов к таксономии media_tag. То проблема, которую я нахожу, заключается в том, что когда я использую крючок attachment_fields_to_save. Сохранение метаданных для artist_credit нормально (с использованием update_post_meta), просто, когда я использую wp_set_object_terms, чтобы затем добавить artist_credit в таксономию media_tag, он назначает его (теги назначаются, когда я повторяю get_the_terms для записи вложения), но затем, когда я снова перехожу к форме редактирования вложения, чтобы увидеть результаты, дополнительный кредитный тег вообще не присваивается записи вложения.

Моя единственная теория заключается в том, что значение таксономии media_tag выполняется ПОСЛЕ действия attachment_fields_to_save, и это понятно, оно, вероятно, выполняется со значением false, чтобы не добавлять термины. Интересно, что крючок save_post не срабатывает после редактирования деталей вложения, поэтому я, похоже, не могу использовать этот крючок для добавления этого значения artist_credit в таксономию media_tag для этого сообщения вложения. Есть какие-нибудь предложения о том, что я мог бы сделать?

Вот как я это делаю в настоящее время:

// Add custom fields to attachments
function example_add_attachment_fields($form_fields, $post) {

    // Create artist_credit custom field
    $form_fields['artist_credit'] = array(
            'label' => 'Artist Credit',
            'input' => 'text',
    );

    return $form_fields;
}
add_filter('attachment_fields_to_edit', 'example_add_attachment_fields', null, 2);

// Save attachment's custom fields' values
function example_save_attachment_fields($post, $attachment) {

    // Save extra attachment fields
    if ( isset($attachment['artist_credit']) ) {
        update_post_meta($post['ID'], 'artist_credit', $attachment['artist_credit']);

        // Add artist_credit as a term to the attachment post
        wp_set_object_terms( $post['ID'], $attachment['artist_credit'], 'media_tag', true );
    }

    return $post;
}
add_filter('attachment_fields_to_save', 'example_save_attachment_fields', null, 2);
Author: Matt Scheurich, 2012-05-05

1 answers

Мне удалось заставить его работать, но не полностью.

Во-первых, предоставленный вами код не извлекает уже сохраненную запись post_meta.

Я основал свой код на вводном коде этого руководства:
http://wpengineer.com/2076/add-custom-field-attachment-in-wordpress/

И я использую обычную таксономию post_tag вместо пользовательской.

И, наконец, есть ошибка, после того, как вы закроете iframe загрузки мультимедиа и нажмете "Обновить", теги будут удалены (понятия не имею почему), но если вы просто обновите браузер, теги будут там.

В любом случае, есть одна часть, которая может способствовать полному ответу:
- intval($post['ancestors'][0]) в функции wp_set_post_terms

add_filter( 'attachment_fields_to_edit', 'fb_attachment_fields_edit', 10, 2);
add_filter( 'attachment_fields_to_save', 'fb_attachment_fields_save', 10, 2);
function fb_attachment_fields_edit($form_fields, $post) {
    $form_fields['artist_credit']['label'] = __( 'Example Custom Field', '' );
    $form_fields['artist_credit']['value'] = get_post_meta($post->ID, 'artist_credit', true);
    $form_fields['artist_credit']['helps'] = __( 'A helpful text for this field.', '' );
    return $form_fields;
}
// save custom field to post_meta
function fb_attachment_fields_save($post, $attachment) {
    if ( isset($attachment['artist_credit']) && '' !== $attachment['artist_credit'] ) {
        update_post_meta($post['ID'], 'artist_credit', $attachment['artist_credit']);
        $check = wp_set_post_terms( intval($post['ancestors'][0]), $attachment['artist_credit'], 'post_tag', true );
    }
    return $post;
}
 1
Author: brasofilo, 2012-05-08 18:09:52