Как добавить мета-бокс для загрузки изображений, используя загрузчик медиафайлов WordPress?

Вопрос или проблема

Я не хочу, чтобы это всплывающее окно thickbox появлялось при загрузке изображения через метабокс. Я хочу добавить всплывающее окно загрузки медиа WordPress при загрузке медиа с использованием метабокса. Есть идеи?http://wordpress.stackexchange.com/questions/67065/add-upload-media-button-in-meta-box-field

Я нашел лучшее решение, пожалуйста, проверьте его:

Код jQuery

jQuery(function($){
    /*
     * Событие выбора/загрузки изображения(й).
     */
    $('body').on('click', '.misha_upload_image_button', function(e){
        e.preventDefault();

            var button = $(this),
                custom_uploader = wp.media({
            title: 'Вставить изображение',
            library : {
                // раскомментируйте следующую строку, если вы хотите прикрепить изображение к текущему посту
                // uploadedTo : wp.media.view.settings.post.id, 
                type : 'image'
            },
            button: {
                text: 'Использовать это изображение' // текст метки кнопки
            },
            multiple: false // для выбора нескольких изображений установите в true
        }).on('select', function() { // у него также есть события "open" и "close"
            var attachment = custom_uploader.state().get('selection').first().toJSON();
            $(button).removeClass('button').html('<img class="true_pre_image" src="' + attachment.url + '" style="max-width:95%;display:block;" />').next().val(attachment.id).next().show();
            /* если вы установите multiple в true, здесь есть код для получения ID изображений
            var attachments = frame.state().get('selection'),
                attachment_ids = new Array(),
                i = 0;
            attachments.each(function(attachment) {
                attachment_ids[i] = attachment['id'];
                console.log( attachment );
                i++;
            });
            */
        })
        .open();
    });

    /*
     * Удаление изображения
     */
    $('body').on('click', '.misha_remove_image_button', function(){
        $(this).hide().prev().val('').prev().addClass('button').html('Загрузить изображение');
        return false;
    });

});

Functions.php


function misha_include_myuploadscript() {
    /*
     * Я рекомендую добавить дополнительные условия, чтобы не загружать скрипты на каждой странице
     * например:
     * if ( !in_array('post-new.php','post.php') ) return;
     */
    if ( ! did_action( 'wp_enqueue_media' ) ) {
        wp_enqueue_media();
    }

    wp_enqueue_script( 'myuploadscript', get_stylesheet_directory_uri() . '/customscript.js', array('jquery'), null, false );
}

add_action( 'admin_enqueue_scripts', 'misha_include_myuploadscript' );

function misha_image_uploader_field( $name, $value="") {
    $image=" button">Загрузить изображение";
    $image_size="full"; // лучше использовать размер миниатюры здесь (150x150 или около того)
    $display = 'none'; // состояние видимости кнопки "Удалить изображение"

    if( $image_attributes = wp_get_attachment_image_src( $value, $image_size ) ) {

        // $image_attributes[0] - URL изображения
        // $image_attributes[1] - ширина изображения
        // $image_attributes[2] - высота изображения

        $image=""><img src="" . $image_attributes[0] . '" style="max-width:95%;display:block;" />';
        $display = 'inline-block';

    } 

    return '
    <div>
        <a href="#" class="misha_upload_image_button' . $image . '</a>
        <input type="hidden" name="' . $name . '" id="' . $name . '" value="' . $value . '" />
        <a href="#" class="misha_remove_image_button" style="display:inline-block;display:' . $display . '">Удалить изображение</a>
    </div>';
}

/*
 * Добавить метабокс
 */
add_action( 'add_meta_boxes', 'misha_meta_box_add' );

function misha_meta_box_add() {
    add_meta_box('mishadiv', // ID метабокса
        'Больше настроек', // заголовок метабокса
        'misha_print_box', // функция обратного вызова, которая выводит HTML метабокса
        'post', // тип записи, куда добавляется
        'normal', // приоритет
        'high' ); // позиция
}

/*
 * HTML метабокса
 */
function misha_print_box( $post ) {
    $meta_key = 'second_featured_img';
    echo misha_image_uploader_field( $meta_key, get_post_meta($post->ID, $meta_key, true) );
}

/*
 * Сохранение данных метабокса
 */
add_action('save_post', 'misha_save');

function misha_save( $post_id ) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
        return $post_id;

    $meta_key = 'second_featured_img';

    update_post_meta( $post_id, $meta_key, $_POST[$meta_key] );

    // если вы хотите прикрепить загруженное изображение к этому посту, раскомментируйте строку:
    // wp_update_post( array( 'ID' => $_POST[$meta_key], 'post_parent' => $post_id ) );

    return $post_id;
}

Ответ или решение

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

Теория

Задача состоит в том, чтобы интегрировать стандартный медиа-менеджер WordPress в метабокс, таким образом, чтобы пользователи могли загружать и выбирать изображения без использования устаревших инструментов, таких как thickbox. При этом важно учитывать, как работает JS API WordPress и как правильно связать ваши скрипты с админ-панелью.

Пример

  1. Подключение скриптов и стилей

    Для начала, необходимо убедиться, что скрипты медиа-менеджера загружены на страницу администратора, где будет использоваться метабокс. Это достигается с помощью функции wp_enqueue_media() в functions.php.

    function misha_include_myuploadscript() {
       if (!did_action('wp_enqueue_media')) {
           wp_enqueue_media();
       }
    
       wp_enqueue_script('myuploadscript', get_stylesheet_directory_uri() . '/customscript.js', array('jquery'), null, false);
    }
    
    add_action('admin_enqueue_scripts', 'misha_include_myuploadscript');

    Здесь мы загружаем наши кастомные скрипты (например, customscript.js), которые отвечают за вызов медиа-менеджера.

  2. Создание метабокса

    Следующим шагом создаем метабокс с использованием стандартного API WordPress.

    add_action('add_meta_boxes', 'misha_meta_box_add');
    
    function misha_meta_box_add() {
       add_meta_box('mishadiv', // ID метабокса
           'More settings', // Заголовок метабокса
           'misha_print_box', // Функция вывода HTML внутри метабокса
           'post', // Тип записи
           'normal', // Позиция
           'high'); // Приоритет
    }

    Функция misha_print_box отвечает за вывод HTML кода внутри нашего метабокса.

  3. Создание формы загрузчика изображений

    В функции, выводящей HTML метабокса, мы используем jQuery для управления кнопкой загрузки изображений.

    function misha_print_box($post) {
       $meta_key = 'second_featured_img';
       echo misha_image_uploader_field($meta_key, get_post_meta($post->ID, $meta_key, true));
    }
    
    function misha_image_uploader_field($name, $value = "") {
       $image = " button\">Upload image";
       $image_size = "full"; 
       $display = 'none';
    
       if ($image_attributes = wp_get_attachment_image_src($value, $image_size)) {
           $image = '"><img src="' . $image_attributes[0] . '" style="max-width:95%;display:block;" />';
           $display = 'inline-block';
       } 
    
       return '
       <div>
           <a href="#" class="misha_upload_image_button' . $image . '</a>
           <input type="hidden" name="' . $name . '" id="' . $name . '" value="' . $value . '" />
           <a href="#" class="misha_remove_image_button" style="display:inline-block;display:' . $display . '">Remove image</a>
       </div>';
    }
  4. JavaScript для взаимодействия с медиа-менеджером

    И, наконец, с помощью jQuery мы подключаем кнопки загрузки и удаления изображений.

    jQuery(function($){
       $('body').on('click', '.misha_upload_image_button', function(e){
           e.preventDefault();
    
           var button = $(this),
               custom_uploader = wp.media({
                   title: 'Insert image',
                   library : {
                       type : 'image'
                   },
                   button: {
                       text: 'Use this image'
                   },
                   multiple: false
               }).on('select', function() {
                   var attachment = custom_uploader.state().get('selection').first().toJSON();
                   $(button).removeClass('button').html('<img class="true_pre_image" src="' + attachment.url + '" style="max-width:95%;display:block;" />').next().val(attachment.id).next().show();
               }).open();
       });
    
       $('body').on('click', '.misha_remove_image_button', function(){
           $(this).hide().prev().val('').prev().addClass('button').html('Upload image');
           return false;
       });
    });

Применение

Данный пример позволяет интегрировать стандартный интерфейс медиа WordPress непосредственно в ваш метабокс, обеспечивая единую и последовательную логику работы с медиафайлами. Это улучшает опыт работы администраторов с вашей темой или плагином и минимизирует необходимость в использовании сторонних решений. Кроме того, современные браузеры полностью поддерживают JavaScript API WordPress, обеспечивая широкую совместимость.

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

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

Оцените материал
Добавить комментарий

Капча загружается...