Кастомный загрузчик вложений. Почти готово!

23 нояб. 2010 г., 19:36:51
Просмотры: 656
Голосов: 4

Данный код находится в 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 .'" />&nbsp;&nbsp;&nbsp;Изображения товара:<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
Комментарии

Скотт, можно ли где-то скачать вашу тему?

hakre hakre
23 нояб. 2010 г. 22:16:11
Все ответы на вопрос 1
0

1) Фильтр attachment_fields_to_save не применяется, хотя я вижу текст, выведенный через echo, в окне media-upload.php. Я знаю это, потому что метаполе _imageTop записывается в базу данных только когда я комментирую проверку if(isset)

Попробуйте заменить $_GET на $_POST и посмотрите, сработает ли это. Если да, то вам нужно проверять и $_POST тоже.

2) После загрузки изображений мне приходится нажимать "Сохранить все изменения", чтобы метаполе _imageTop сохранилось в базу данных. В идеале, я хочу сохранять данные сразу после загрузки, без необходимости нажимать "Сохранить все изменения". Вероятно, это происходит потому, что обработчик attachment_fields_to_save срабатывает только на хуке "Сохранить все изменения". Тем не менее, я хочу разобраться, как заставить его срабатывать сразу после загрузки изображений.

Если хук не срабатывает, единственное что можно сделать - вызвать функцию хука напрямую. Если это невозможно (например, у вас нет кода, который выполняется в этот момент), нужно искать другой экшен, в который можно вцепиться, например тот, который срабатывает после загрузки. Вероятно, есть какой-то хук при сохранении изображения в медиатеку. Вы можете тогда также сохранить свое пользовательское поле в базу данных. Просто чтобы оно сохранилось. Я не знаю, сможет ли WordPress корректно обработать это с его системой ревизий, так что нужно пробовать.

3) Я хочу убрать ссылку "Вставить в запись" с экрана.

Сходу не знаю, как это можно сделать, вам следует проверить код ядра на предмет хуков, которые можно переопределить.

25 нояб. 2010 г. 00:08:53