wp.media js — как отключить вкладку «Загрузка файла»

Когда нужно использовать медиатеку WordPress (окно Медиатеки) в качестве средства для выбора картинки из медиатеки и только для этого, вкладка загрузки файлов «Upload Files» не нужна, более того, в некоторых случаях она может мешать логике кода, потому что позволяет загружать файл в медиатеку.

Чтобы было понятнее о чем речь, приведу пример. У нас есть форма в которой файлы загружаются в медиатеку нестандартно, но также в этой форме нам нужно иметь возможность выбрать и установить какую-либо уже загруженную в медиатеку картинку. В этом случае вкладка загрузки картинки через стандартное окно медиатеки нам не нужна: она будет мешать, потому что ломать логику загрузки картинок.

Как отключить вкладку загрузки картинок в медиатеку WordPress?

Сделать это можно изменить дефолтную опцию router прямо перед вызовом фрейма wp.media. В этой опции мы указываем метод (анонимную функцию), которая устанавливает вкладки (роуты).

Так как нам нужна одна вкладка, то указываем только её — browse: {} — без параметров (в параметрах указывается название вкладки и приоритет. Вкладка у нас одна, поэтому ничего из этого нам не нужно).

Речь идет о таком коде:

wp.media.controller.Library.prototype.defaults.router = function( routerView ) {
	routerView.set({
		browse: {}
	})
}

Весь код, чтобы понимать контекст где используется приведенный кусок кода:

(function($){

	$('.loadimage-wrap').each(function(){

		let frame
		let $wrap  = $(this)
		let $img   = $wrap.find('img')
		let $input = $wrap.find('input[type="hidden"]')

		$wrap.on( 'click', '.select-media-btn', function(){

			// отключим таб Upload Files
			// оставим только возможность выбора картинок
			// за доп.инфо см. метод `browseRouter` в `wp-includes/js/media-views.js`
			wp.media.controller.Library.prototype.defaults.router = function( routerView ) {
				routerView.set({
					browse: {}
				})
			}

			// создаем и показываем фрейм
			frame = wp.media.frames.kmbframe = wp.media({
				title   : 'Select Media',
				// Library WordPress query arguments.
				library : {
					type : 'image'
				},
				multiple: false,
				button: {
					text: 'Select'
				}
			})

			frame.on( 'select', function() {
				attachment = frame.state().get('selection').first().toJSON();
				$img.attr( 'src', attachment.url );

				$wrap.data('usetype') === 'url' ? $input.val( attachment.url ) : $input.val( attachment.id );
			});

			frame.on( 'open', function(){
				if( $input.val() )
					frame.state().get('selection').add( wp.media.attachment( $input.val() ) );
			});

			frame.open();
		})
	})

})(jQuery)

В результате получим:

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