Как добавить новую вкладку в менеджер загрузки медиафайлов с набором пользовательских изображений?

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

Я хотел бы добавить новую вкладку в загрузчик менеджера и внутри списка изображений из

theme_folder/images/patterns

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

function custom_media_upload_tab_name( $tabs ) {
    $newtab = array( 'tab_slug' => 'Patterns' );
    return array_merge( $tabs, $newtab );
}

add_filter( 'media_upload_tabs', 'custom_media_upload_tab_name' );

function custom_media_upload_tab_content() {
    // Add you content here.
    echo 'Hello content';
}
add_action( 'media_upload_tab_slug', 'custom_media_upload_tab_content' );

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

enter image description here

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

Я прошел через все предложения, но кажется, что никто не читает вопрос.
Как было рекомендовано
“Я пробовал что-то вроде этого, чтобы добавить вкладку, но это не работает для меня, так как она добавляет вкладки на стороне медиа-менеджера, но на загрузке изображений эта вкладка не видна.”

Так что пока никто не может найти решение для этого.

Это старая тема, но для меня все еще актуальна.
Я возился с этим и пришел к такому коду для добавления вкладки медиа здесь, может, кто-то захочет продолжить решать, как обрабатывать контент для вкладки? 🙂

add_action('admin_enqueue_scripts', function(){
    wp_enqueue_script( 'my-media-tab', plugin_dir_url( __FILE__ ) . '/js/mytab.js', array( 'jquery' ), '', true );
});

А затем файл js:

var l10n = wp.media.view.l10n;
wp.media.view.MediaFrame.Select.prototype.browseRouter = function( routerView ) {
    routerView.set({
        upload: {
            text:     l10n.uploadFilesTitle,
            priority: 20
        },
        browse: {
            text:     l10n.mediaLibraryTitle,
            priority: 40
        },
        my_tab: {
            text:     "My tab",
            priority: 60
        }
    });
};

РЕДАКТИРОВАТЬ:
Ок, ну. Для обработки контента я не нашел хорошего способа сделать это с помощью wp.media. Мое текущее решение — два слушателя, один для открытия библиотеки медиа и один для нажатия в меню маршрутизатора медиа;

jQuery(document).ready(function($){
    if ( wp.media ) {
        wp.media.view.Modal.prototype.on( "open", function() {
            if($('body').find('.media-modal-content .media-router a.media-menu-item.active')[0].innerText == "My tab")
                doMyTabContent();
        });
        $(wp.media).on('click', '.media-router a.media-menu-item', function(e){
            if(e.target.innerText == "My tab")
                doMyTabContent();
        });
    }
});

функция doMyTabContent(); это просто что-то вроде;

function doMyTabContent() {
    var html="<div class="myTabContent">";
    //My tab content here
    html += '</div>';
    $('body .media-modal-content .media-frame-content')[0].innerHTML = html;
}

Я уверен, что это можно сделать более деликатным способом. Кто бы это ни читал и у кого есть лучшее решение, пожалуйста, дайте знать 🙂

Согласно Кодексу WordPress вы можете добавить пользовательскую вкладку в загрузчик медиа следующим образом:

// добавить вкладку
add_filter('media_upload_tabs', 'my_upload_tab');
function my_upload_tab($tabs) {
    $tabs['mytabname'] = "My Tab Name";
    return $tabs;
}

// вызвать новую вкладку с помощью wp_iframe
add_action('media_upload_mytabname', 'add_my_new_form');
function add_my_new_form() {
    wp_iframe( 'my_new_form' );
}

// содержимое вкладки
function my_new_form() {
    echo media_upload_header(); // Эта функция используется для вывода заголовков загрузчика медиа и т.д.
    echo '<p>Пример HTML-контента здесь.</p>';
}

Надеюсь, это вам поможет.

Добавить вкладку / кнопку внутри модального окна ‘Выбрать или загрузить медиа’ в WordPress

jQuery(document).ready(function ($) {
  console.log('Hello, bdkoder!');

  var l10n = wp.media.view.l10n;

  // Расширение прототипа MediaFrame.Select для добавления пользовательских вкладок и контента
  var frame = wp.media.view.MediaFrame.Select;
  wp.media.view.MediaFrame.Select = frame.extend({
    initialize: function () {
      frame.prototype.initialize.apply(this, arguments);

      var State = wp.media.controller.State.extend({
        insert: function () {
          console.log("Something...");
          this.frame.close();
        }
      });

      this.states.add([
        new State({
          id: "my_tab",
          search: false,
          title: "My Tab"
        })
      ]);

      // При рендере
      this.on("content:render:my_tab", this.renderMyTabContent, this);
    },
    browseRouter: function (routerView) {
      routerView.set({
        upload: {
          text: l10n.uploadFilesTitle,
          priority: 20
        },
        browse: {
          text: l10n.mediaLibraryTitle,
          priority: 40
        },
        my_tab: {
          text: "My Tab",
          priority: 60
        }
      });
    },
    renderMyTabContent: function () {
      var MyTabContent = wp.Backbone.View.extend({
        tagName: "div",
        className: "my-tab-content",
        template: wp.template("my-tab-template"),
        active: false,
        toolbar: null,
        frame: null
      });

      var view = new MyTabContent();

      this.content.set(view);
    }
  });

  // Добавить пользовательский шаблон на страницу
  $('body').append('<script type="text/html" id="tmpl-my-tab-template"><h3>My Custom Tab Content</h3><p>Это контент моей пользовательской вкладки.</p></script>');
});

enter image description here

   function axcoto_genify_media_menu($tabs) {
            $newtab = array('genify'  => __('Axcoto Genify', 'axcotogenify'));
            return array_merge($tabs, $newtab);
            }
            add_filter('media_upload_tabs', 'axcoto_genify_media_menu');

           array('genify' => __('Axcoto Genify', 'axcotogenify'));


        function axcoto_genify_media_process() {
        media_upload_header();
        echo 'hello';
        }
        function axcoto_genify_media_menu_handle() {
        return wp_iframe( 'axcoto_genify_media_process');
        }



 if ( ( is_array( $content_func ) && ! empty( $content_func[1] ) && 0 === strpos( (string) $content_func[1], 'media' ) ) || 0 === strpos( $content_func, 'media' ) )
        wp_enqueue_style( 'media' );

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

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

Теория (Theory)

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

  1. Добавление вкладки: Мы используем фильтр media_upload_tabs, чтобы добавить новую вкладку в интерфейс загрузчика.
  2. Отображение контента вкладки: С помощью JavaScript и PHP мы будем управлять содержимым, подгружая наши изображения.
  3. Программирование на JavaScript: Управление интерфейсом загружается через скрипты, расширяющие работу медиабиблиотеки WordPress.

Пример (Example)

Рассмотрим пример с использованием кода, который поможет в добавлении вкладки и отображении нужного контента.

Добавление вкладки

function my_upload_tab($tabs) {
    $tabs['my_custom_tab'] = __('Моя вкладка', 'textdomain');
    return $tabs;
}
add_filter('media_upload_tabs', 'my_upload_tab');

function render_my_custom_tab() {
    wp_iframe('my_custom_tab_content');
}

function my_custom_tab_content() {
    echo media_upload_header();
    ?>
    <div id="my-custom-content">
        <h3>Содержимое пользовательской вкладки</h3>
        <?php
        // Получение изображений из директории
        $images = glob(get_template_directory() . '/images/patterns/*.{jpg,png,gif}', GLOB_BRACE);
        foreach ($images as $image) {
          echo '<img src="' . get_template_directory_uri() . '/images/patterns/' . basename($image) . '" style="width:100px;height:100px;margin:5px;">';
        }
        ?>
    </div>
    <?php
}
add_action('media_upload_my_custom_tab', 'render_my_custom_tab');

Применение (Application)

  1. Фильтр media_upload_tabs: Этот хук позволяет добавлять вкладки. Мы создали my_custom_tab, которая появляется в медиабиблиотеке.

  2. Функция wp_iframe: Она используется для запуска функции внутри iframe, что идеально подходит для отображения интерфейсных элементов.

  3. JavaScript для управления содержимым: Для установки и отображения содержимого вкладки мы будем использовать JavaScript:

jQuery(document).ready(function($) {
    if (wp.media) {
        wp.media.view.Modal.prototype.on('open', function() {
            if ($('body').find('.media-router a.media-menu-item.active')[0].innerText === "Моя вкладка") {
                // Пример функции отображения содержания вкладки
                renderMyCustomContent();
            }
        });
        $(wp.media).on('click', '.media-router a.media-menu-item', function(e) {
            if (e.target.innerText === "Моя вкладка") {
                renderMyCustomContent();
            }
        });
    }

    function renderMyCustomContent() {
        var html = '<div class="custom-content">' +
            '<h3>Пользовательский контент</h3>' +
            '<p>Здесь можно добавить логическую часть для отображения пользователей картинок, галерей и т.д.</p>' +
            '</div>';
        $('body .media-modal-content .media-frame-content').html(html);
    }
});

Заключение

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

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

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