Иногда является хорошей практикой вставить в произвольное поле (Custom Field’s) wordpress какой ссылку, id либо какой  либо атрибут файла из медиабиблиотеки, но ещё лучшей практикой будет создать метабокс (Meta Box) который имел бы возможность загрузить файл , сразу же добавить его в библиотеку и уже после сгенерировать произвольное поле с атрибутами файла.

Очевидно что решить задачу должно помочь богатое или не очень (доподлинно неизвестно) Media uploader API, к слову об этом очень мало чего известно, поэтому пришлось смотреть исходники.

Создадим плагин пусть он будет добавлять метабокс в который загружаются документы Exel.

<?php
/*
Plugin Name: Field uploder js
Plugin URI: http://alkoweb.ru
Author: Petrozavodsky
Author URI: http://alkoweb.ru
*/
if (is_admin()) { //подключаем в админке js файл зависящий от jquery (jquery в админке подключен по умолчанию).
    function ll_uploader_xls_scripts()
    {
        wp_enqueue_script('xls-uploader', plugin_dir_url(__FILE__) . 'js/uploader.js', array('jquery'), '0.1', false);
    }

    add_action('admin_head', 'll_uploader_xls_scripts');
}


add_action('add_meta_boxes', 'uploder_extra_fields', 1);

function uploder_extra_fields() {
    add_meta_box( 'uploader_js', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high'  );
}

function extra_fields_box_func()
{
global $post;
//создаем метабокс
    ?>
    <input id="xls-uploader-input" type="text" name="extra[file_id]"  value="<?php echo get_post_meta($post->ID, 'file_id', 1); ?>" style="width:50%"/>
    </pre>
    <p id="xls-uploader-name">Файл не выбран</p>
    <hr/>
    <button id="xls-uploader-submit" class="button button-primary button-large">Выбрать файл</button>
    <input type="hidden" name="extra_fields_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>"/>
<?php
}

add_action('save_post', 'uploader_js_filds_update', 0);

function uploader_js_filds_update($post_id)
{
    if (!wp_verify_nonce($_POST['extra_fields_nonce'], __FILE__)) return false; // проверка
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return false; // если это автосохранение
    if (!current_user_can('edit_post', $post_id)) return false; // если юзер не имеет право редактировать запись
    if (!isset($_POST['extra'])) return false;
    // Все ОК! Теперь, нужно сохранить/удалить данные
    $_POST['extra'] = array_map('trim', $_POST['extra']);
    foreach ($_POST['extra'] as $key => $value) {
        if (empty($value)) {
            delete_post_meta($post_id, $key); // удаляем поле если значение пустое
        }
        update_post_meta($post_id, $key, $value); // add_post_meta() работает автоматически
    }
    return $post_id;
}



//Цепляемся к "виртуальному" так сказать экшену свою функцию
add_action('wp_ajax_xls_autocomplet', 'xls_autocomplet');
add_action('wp_ajax_nopriv_xls_autocomplet', 'xls_autocomplet');
//Собственно функция
function xsl_autocomplet()
{
    url_to_postid($_POST['url_file']);

 

Теперь javascript:

var $ = jQuery.noConflict();
$(document).ready(function () {
/* Обработка события .click() кнопки */
    $("#xls-uploader-submit").click(function () {

        tb_show("Загрузить файл.", "media-upload.php?type=file&TB_iframe=true");
        return false;
    });

    /* Обрабатываем результаты */
    window.send_to_editor = function (html) {
        $("#xls-uploader-input").val($(html).attr('href'));
        tb_remove();
    };

    $('#xls-uploader-process').click(function (e) {
        e.preventDefault();
        var data = 'url_file=' + $("#xls-uploader-input").val();
        $.ajax({
            type: 'post',
            url: '/wp-admin/admin-ajax.php?action=xml_autocomplet',
            data: data,
            success: function (result) {
                console.log('готово!')
            }
        });
    });
});

Здесь стоит обратить внимание  на строку media-upload.php?type=file&TB_iframe=true это строка GET запроса к Media Uploader с параметрами .

Например если открыть http://you-dev-site.com/wp-admin/media-upload.php?type=file&TB_iframe=true то можно увидеть окно загрузчика которое формируется при помощи GET параметров.

tupe —  строка   принимающая значения image,audio,video,file, и т.д.  По умолчанию file. На что это влияет.

TB_iframe — каких то конкретных комментариев в коде не нашел, но если поэкспериментировать то можно заметить что без этого параметра открывается какой то старый , дряхлый TinyMCE загрузчик и верстка едет так что смело ставим true.

Есть ещё целая туча параметров , есть подозрение что некоторые из них уже Deprecated, все не проверял ( пока не было повода).

Итог — имеем плагин который может загружать файл и сохранять его id в произвольное поле.

Что это дает — ну много чего так:

<?php
 var_dump( wp_get_attachment_metadata(get_post_meta($post->ID, 'file_id', 1)) );
?>

по id можно вообще всю информацию о файле получить.

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

 

Источник http://alkoweb.ru/dobavlenie-zagruzchika-media-uploader-k-proizvolnomu-polyu-wordpress/