Сохранение медиа - Какой хук срабатывает?

30 мая 2012 г., 16:15:38
Просмотры: 15.8K
Голосов: 8

Привет,

Я пытаюсь выполнить некоторый код, который сработает при сохранении изображения в медиабиблиотеке. Как обычно, я выбираю файл, загружаю его, ввожу метаданные и нажимаю "Сохранить". В этот момент мне нужно подключиться к WordPress и перенаправить пользователя на другой URL. Вместо того чтобы показывать список загруженных медиафайлов, я хочу перенаправить пользователя на инструмент для редактирования изображений.

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

Спасибо,

2
Комментарии

Попробуйте использовать Hikari Hooks Troubleshooter. Этот инструмент помог мне найти нужный хук для пользовательского действия.

cpilko cpilko
30 мая 2012 г. 18:23:18

Ричард, вы уверены, что ни один из ответов на ваши вопросы не является правильным? Пожалуйста, проверьте FAQ, особенно раздел "Как правильно задавать вопросы здесь?"...

brasofilo brasofilo
29 июн. 2012 г. 08:12:32
Все ответы на вопрос 3
0

На самом деле нет хука, который срабатывает после загрузки медиафайлов, по крайней мере, насколько мне известно. Проблема с доступными хуками в процессе загрузки и сохранения медиафайлов и их данных заключается в том, что они ограничены определенной частью процесса, поэтому их использование ненадежно. Например, хук add_attachment срабатывает после завершения загрузки нового файла, но до редактирования его метаданных. Если на этом этапе попытаться перенаправить пользователя, это может нарушить процесс загрузки последующих файлов, если их несколько. Однако этот хук может подойти для других типов действий.

Для вашего конкретного случая можно использовать хук действия admin_init и проверить, находимся ли мы на странице медиатеки после загрузки или редактирования файла. Мы можем определить это, сохранив количество вложений перед загрузкой и сравнив его с количеством после загрузки:

add_action('admin_init', 'redirect_after_media_save');  
function redirect_after_media_save() {  

    global $pagenow;  

    // при посещении страницы загрузки сохраняем количество вложений  
    if ( $pagenow == 'media-new.php' ) {  
        $attachments_before = array_sum((array)wp_count_attachments());  
        update_option('count_attach_before', $attachments_before);  
    }  

    if ( $pagenow == 'upload.php' ) { // мы на странице медиатеки  

        // получаем количество вложений до и после загрузки  
        $attachments_before = get_option('count_attach_before');  
        $attachments_after = array_sum((array)wp_count_attachments());  

        if (  
            // если были загружены новые файлы  
            ( wp_get_referer() == admin_url('media-new.php') && $attachments_after > $attachments_before )  
            ||  
            // или если только что отредактировали медиафайл  
            isset($_GET['posted'])  
        ) {  
                // перенаправляем в нужное место  
                wp_redirect(admin_url());  
                exit;  
        }  
    }  
}  

Этот код перенаправит пользователя в админку после успешной загрузки или редактирования медиафайла. Вы можете адаптировать его под свои нужды. Также можно выбрать другой хук админки вместо admin_init, если требуется выполнить действия, отличные от перенаправления.

19 нояб. 2012 г. 01:46:01
0

Возможно, ответ немного запоздалый, но у меня была похожая ситуация, и я хочу поделиться решением.

В файле functions.php темы (создание плагина тоже подошло бы) я использовал хук 'add_attachment' для создания нового поста (произвольного типа записи 'talk') на основе каждого нового загруженного файла. Конечно, пример можно немного улучшить, но это сработало для обработки каждого загружаемого медиафайла.

<?php
function cpt_from_attachment($attachment_ID)
{          
    global $current_user;
    get_currentuserinfo();

    $attachment_post = get_post( $attachment_ID );

    $type = get_post_mime_type($attachment_ID);
    if(strpos($type, 'audio') === 0)
    {
        // Создаем новый объект произвольного типа записи только для аудиофайлов
        $my_post = array(
          'post_title'    => $attachment_post->post_title,
          'post_content'  => $attachment_post->post_content,
          'post_type'   => 'talk',
          'post_author'   => $current_user->ID
        );

        // Вставляем произвольный тип записи в базу данных
        $post_id = wp_insert_post( $my_post );
        wp_update_post( array(
                'ID' => $attachment_ID ,
                'post_parent' => $post_id
            )
        );
        wp_set_post_terms( $post_id, get_post_meta($attachment_ID, "artist", true), 'speaker' );
    }
}

add_action("add_attachment", 'cpt_from_attachment');
2 июл. 2014 г. 23:25:17
0

Похоже, что при сохранении медиафайла нет действия, но есть фильтр. К сожалению, это означает, что вы можете выполнить некоторые действия, но не можете выводить что-либо напрямую, иначе это нарушит работу фильтра.

add_filter('attachment_fields_to_save', 'attachment_stuff');
function attachment_stuff($stuff){

    //Здесь можно выполнять действия, но не выводите что-либо напрямую, иначе это нарушит работу фильтра.

    return $stuff;
}

$stuff на самом деле является массивом полей, используемых на странице медиафайла. Вы можете попробовать другие подходы, например, подключиться к более общему хуку админ-панели и проверять значение $_GET['action'] на 'editattachment'.

27 июн. 2012 г. 02:24:53