Установите теги вложений из данных настраиваемого поля вложения
В настоящее время у меня есть пользовательское поле, добавленное в форму моего вложения под названием 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);
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;
}