Кастомный загрузчик вложений. Почти готово!
Данный код находится в functions.php моей темы и создает кастомную иконку загрузки рядом со стандартной иконкой загрузки в редакторе WordPress.
Изображения, загруженные через эту иконку, получают специальную метку _imageTop в wp_postmeta, чтобы отличать их от стандартных вложений (это позволяет мне работать с ними как с отдельной коллекцией "прикрепленных" изображений).
У меня возникло 3 проблемы, которые, уверен, решаются просто:
1) Фильтр attachment_fields_to_save не применяется, хотя я вижу echo-текст в окне media-upload.php. Я знаю это, потому что мета _imageTop записывается в базу только когда я убираю проверку if(isset)
2) После загрузки изображений, мне нужно нажать "Сохранить все изменения", чтобы мета _imageTop сохранилась в базу. Идеально было бы сохранять данные сразу после загрузки, без необходимости нажимать "Сохранить все изменения". Вероятно, это связано с тем, что обработчик attachment_fields_to_save срабатывает только по хуку "Сохранить все изменения". Тем не менее, я хочу разобраться, как заставить его работать сразу после загрузки изображений.
3) Я хочу убрать ссылку "Вставить в запись" с экрана.
//Загрузка кастомных изображений
function my_customImages($initcontext)
{
global $post;
?>
<script type="text/javascript">
jQuery(document).ready(function() {
var fileInput = '';
jQuery('#wpe-uploadAttachments').click(function() {
fileInput = jQuery(this).prev('input');
formfield = jQuery('#upload_image').attr('name');
post_id = jQuery('#post_ID').val();
tb_show('my Product Images', 'media-upload.php?post_id='+post_id+'&type=image&my_idCustomAttachment=true&TB_iframe=true');
return false;
});
});
</script>
<?php
return $initcontext. '<input type="hidden" id="post_ID" value="'. $post->ID .'" /> Изображения товара:<a id="wpe-uploadAttachments" href="javascript:;" class="mceButton mceButtonEnabled" onmousedown="return false;" onclick="return false;" title="Нажмите здесь, чтобы загрузить изображения товара для этой записи"><img src="'.get_bloginfo('template_directory') .'/img/upload-icon.gif"" /></a>';
}
add_filter('media_buttons_context', 'my_customImages');
function my_image_attachment_fields_to_save($post, $attachment) {
update_post_meta($post['ID'], '_imageTop', true);
return $post;
}
if(isset($_GET['my_idCustomAttachment'])){
echo "Это правда";
add_filter("attachment_fields_to_save", "my_image_attachment_fields_to_save", null , 2);
}

1) Фильтр attachment_fields_to_save не применяется, хотя я вижу текст, выведенный через echo, в окне media-upload.php. Я знаю это, потому что метаполе _imageTop записывается в базу данных только когда я комментирую проверку if(isset)
Попробуйте заменить $_GET на $_POST и посмотрите, сработает ли это. Если да, то вам нужно проверять и $_POST тоже.
2) После загрузки изображений мне приходится нажимать "Сохранить все изменения", чтобы метаполе _imageTop сохранилось в базу данных. В идеале, я хочу сохранять данные сразу после загрузки, без необходимости нажимать "Сохранить все изменения". Вероятно, это происходит потому, что обработчик attachment_fields_to_save срабатывает только на хуке "Сохранить все изменения". Тем не менее, я хочу разобраться, как заставить его срабатывать сразу после загрузки изображений.
Если хук не срабатывает, единственное что можно сделать - вызвать функцию хука напрямую. Если это невозможно (например, у вас нет кода, который выполняется в этот момент), нужно искать другой экшен, в который можно вцепиться, например тот, который срабатывает после загрузки. Вероятно, есть какой-то хук при сохранении изображения в медиатеку. Вы можете тогда также сохранить свое пользовательское поле в базу данных. Просто чтобы оно сохранилось. Я не знаю, сможет ли WordPress корректно обработать это с его системой ревизий, так что нужно пробовать.
3) Я хочу убрать ссылку "Вставить в запись" с экрана.
Сходу не знаю, как это можно сделать, вам следует проверить код ядра на предмет хуков, которые можно переопределить.
