Хук в wp.media для добавления новой вкладки

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

Это проблема, возникающая при создании плагина. Я хочу добавить вкладку в модальное окно wp.media.view.MediaFrame.Select или, если поможет общий подход:

В кастомизаторе я хочу перехватить любое модальное окно, которое появляется с использованием wp.media, просто чтобы, например, добавить alert().

Это почти оно, и я уже застрял в выяснении того, как строятся эти модальные окна и как к ним подключиться.
Что я вижу:

  • wp.media().frame.on('open', ...) не может быть использован, так как фрейм существует только после нажатия кнопки.
  • Запасной вариант — переписать wp.media(), но это не звучит как разумное решение.

Что я не хочу:

  • “Использовать media_upload_tabs или media_upload_tab_slug“, потому что такой PHP не учитывается в кастомизаторе.
  • “Перехватывать каждую кнопку и обрабатывать нажатие”
  • “Искать фреймы через window.Timeout каждую секунду”
  • Хакерские решения приветствуются, чтобы выяснить, что возможно, но не помогут как ОСНОВНОЕ решение.

Заранее спасибо всем экспертам wp.media здесь! 🙂

Чтобы глобально подключиться к модальному окну wp.media и добавить пользовательскую функциональность — например, добавить новую вкладку или вызвать alert — вы можете расширить прототип wp.media.view.MediaFrame.Select. Этот метод позволяет вам внедрять код каждый раз, когда инициализируется новый медиафрейм, включая использование в кастомизаторе WordPress.

Вот как вы можете достичь этого:

(function($) {

    // Сохраняем оригинальную функцию инициализации
    var originalInitialize = wp.media.view.MediaFrame.Select.prototype.initialize;

    // Расширяем прототип MediaFrame.Select
    wp.media.view.MediaFrame.Select.prototype.initialize = function() {

        // Вызываем оригинальный метод инициализации, чтобы гарантировать правильную настройку фрейма
        originalInitialize.apply(this, arguments);

        // Ваш пользовательский код здесь
        // Например, показать alert, когда модальное окно медиа инициализировано
        alert('Модальное окно медиа инициализировано!');

        // Настраиваем слушателя событий для добавления пользовательской вкладки, когда создается маршрутизатор
        this.on('router:create:browse', this.addCustomTab, this);
    };

    // Определяем функцию для добавления пользовательской вкладки
    wp.media.view.MediaFrame.Select.prototype.addCustomTab = function(routerView) {
        routerView.set({
            // Определите вашу пользовательскую вкладку
            myCustomTab: {
                text: 'Моя пользовательская вкладка', // Метка вкладки
                priority: 100,        // Позиция вкладки
                click: function() {   // Действие при нажатии на вкладку
                    // Переключаемся на режим вашего пользовательского контента
                    this.content.mode('myCustomContent');
                }
            }
        });
    };

    // Переопределяем bindHandlers, чтобы включить ваш пользовательский режим контента
    var originalBindHandlers = wp.media.view.MediaFrame.Select.prototype.bindHandlers;
    wp.media.view.MediaFrame.Select.prototype.bindHandlers = function() {
        // Вызываем оригинальный метод bindHandlers
        originalBindHandlers.apply(this, arguments);

        // Добавляем обработчик для вашего пользовательского режима контента
        this.on('content:render:myCustomContent', this.renderCustomContent, this);
    };

    // Определяем функцию для рендеринга вашего пользовательского контента
    wp.media.view.MediaFrame.Select.prototype.renderCustomContent = function() {
        // Создайте новый вид для вашего пользовательского контента
        var view = new wp.media.View({
            className: 'my-custom-content',
            controller: this
        });

        // Устанавливаем содержимое вида
        view.$el.html('<h1>Мой пользовательский контент</h1><p>Это контент в пользовательской вкладке.</p>');

        // Отображаем вид в модальном окне
        this.content.set(view);
    };

})(jQuery);

.

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

Добавление новой вкладки в модальное окно wp.media

Если вы разрабатываете плагин и хотите расширить функциональность модального окна wp.media.view.MediaFrame.Select, добавив новую вкладку, вы можете добиться этого, модифицируя прототипы встроенных функций WordPress. Такой подход позволит вам внедрять свои изменения в любые модальные окна, включая те, которые используются в настройщике (Customizer).

Основной принцип

Для начала мы изменим метод инициализации MediaFrame.Select, чтобы выполнять дополнительные действия при открытии модального окна. Мы также добавим обработчик событий, который создаст пользовательскую вкладку. Рассмотрим основной шаг за шагом:

  1. Переопределение инициализации: Сначала мы сохраним оригинальную инициализацию и создадим новую, в которой добавим нужный функционал.
  2. Создание пользовательской вкладки: В рамках нового метода инициализации мы добавим вкладку с определённым контентом.
  3. Рендеринг пользовательского контента: Нам нужно будет создать метод для отображения содержимого на новой вкладке.

Вот как может выглядеть решение:

(function($) {

    // Сохраняем оригинальную функцию инициализации
    var originalInitialize = wp.media.view.MediaFrame.Select.prototype.initialize;

    // Расширяем прототип MediaFrame.Select
    wp.media.view.MediaFrame.Select.prototype.initialize = function() {

        // Вызываем оригинальный метод инициализации
        originalInitialize.apply(this, arguments);

        // Здесь будет ваш код - например, можно вывести алерт при инициализации
        alert('Модальное окно медиа инициализировано!');

        // Устанавливаем обработчик события для добавления кастомной вкладки
        this.on('router:create:browse', this.addCustomTab, this);
    };

    // Функция для добавления пользовательской вкладки
    wp.media.view.MediaFrame.Select.prototype.addCustomTab = function(routerView) {
        routerView.set({
            myCustomTab: {
                text: 'Моя Кастомная Вкладка', // Заголовок вкладки
                priority: 100,                // Порядок отображения
                click: function() {           // Действие при нажатии на вкладку
                    // Переход к вашему пользовательскому контенту
                    this.content.mode('myCustomContent');
                }
            }
        });
    };

    // Переопределяем bindHandlers для включения вашего пользовательского контента
    var originalBindHandlers = wp.media.view.MediaFrame.Select.prototype.bindHandlers;
    wp.media.view.MediaFrame.Select.prototype.bindHandlers = function() {
        // Вызываем оригинальный метод
        originalBindHandlers.apply(this, arguments);

        // Добавляем обработчик для вашего пользовательского контента
        this.on('content:render:myCustomContent', this.renderCustomContent, this);
    };

    // Функция для рендеринга вашего пользовательского контента
    wp.media.view.MediaFrame.Select.prototype.renderCustomContent = function() {
        // Создаем новое представление для вашего контента
        var view = new wp.media.View({
            className: 'my-custom-content',
            controller: this
        });

        // Устанавливаем содержание представления
        view.$el.html('<h1>Мой Пользовательский Контент</h1><p>Это содержимое в кастомной вкладке.</p>');

        // Отображаем представление в модальном окне
        this.content.set(view);
    };

})(jQuery);

Подведение итогов

Используя вышеописанный код, вам удастся добавить новую вкладку в модальное окно wp.media, а также обеспечить поддержку пользовательского контента, который будет выводиться при её активации. Этот подход является более чистым и эффективным по сравнению с обходными решениями, такими как хакерские методы или частое отслеживание состояния модального окна. Вы сможете легко настраивать и расширять функциональность вашего плагина.

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

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

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