Вопрос или проблема
Вот в чем дело. Я использую загрузчик медиафайлов WP на фронтенде. Мне нужно, чтобы он пов behavior по-разному в зависимости от определенного действия.
Я прикрепляю медиафайлы на конкретной странице одного пользовательского типа записи.
Это небольшой фрагмент из моего кода. Я использую это для вызова медиатеки.
var uploader = wp.media({
title: 'Загрузить изображение',
multiple: false
}).open()
.on('select', function(e){
// Здесь будет код
});
Затем я фильтрую библиотеку, чтобы показать только определенные вложения, используя этот фильтр и используя $_REQUEST для получения текущего ID записи:
function show_current_user_attachments( $query = array() ) {
// Измените запрос здесь, чтобы показать только вложения текущего пользователя
return $query;
}
add_filter( 'ajax_query_attachments_args', 'show_current_user_attachments', 10, 1 );
Пока все идет хорошо, но мне нужна еще одна отдельная логика для текущей записи. Мне нужно вызвать другой wp.media, который полностью отличается от этого. Он не должен иметь функцию загрузки изображений и должен показывать другие вложения в библиотеке.
Проще говоря, мой вопрос в том, как я могу расширить wp.media и передать разные аргументы, которые я могу обработать в фильтре ‘ajax_query_attachments_args’, чтобы у меня было 2 совершенно разных всплывающих окна с медиаподбором с разной функциональностью?
Спасибо заранее!
Вам придется создать два разных медиамодальных окна, которые вызываются в зависимости от события клика. Вот немного кода из недавнего проекта, где я добавил эти кнопки в визуальный редактор tinyMCE:
jQuery(document).ready(function($){
$(document).on('click', '.mce-my_upload_button', upload_image_tinymce);
$(document).on('click', '.mce-my_upload_pdf_button', upload_pdf_tinymce);
function upload_image_tinymce(e) {
e.preventDefault();
var $input_field = $('.mce-my_input_image');
var custom_uploader = wp.media.frames.file_frame = wp.media({
title: 'Добавить изображение',
button: {
text: 'Добавить изображение'
},
library: {
type: 'image'
},
multiple: false
});
custom_uploader.on('select', function() {
var attachment = custom_uploader.state().get('selection').first().toJSON();
$input_field.val(attachment.sizes.medium.url);
});
custom_uploader.open();
}
function upload_pdf_tinymce(e) {
e.preventDefault();
var $input_field = $('.mce-my_input_pdf');
var custom_uploader = wp.media.frames.file_frame = wp.media({
title: 'Добавить PDF',
button: {
text: 'Добавить PDF'
},
library: {
type: 'application/pdf'
},
multiple: false
});
custom_uploader.on('select', function() {
var attachment = custom_uploader.state().get('selection').first().toJSON();
$input_field.val(attachment.url);
});
custom_uploader.open();
}});
Надеюсь, это поможет!
Ответ или решение
Для создания различных всплывающих окон загрузчика мультимедиа в WordPress в зависимости от конкретного действия, вам необходимо определить две разные функции для триггера различных медиапопапов с различной функциональностью. Вот пошаговое руководство, как это можно сделать.
Шаг 1: Создание различных функций для загрузки
Вы можете использовать событие "click" для выполнения различных функций, в зависимости от того, какая кнопка была нажата. Ниже приведен пример кода, где создаются два разных загрузчика: один для изображений, другой для PDF-файлов.
jQuery(document).ready(function($) {
$(document).on('click', '.upload_image_button', upload_image);
$(document).on('click', '.upload_pdf_button', upload_pdf);
function upload_image(e) {
e.preventDefault();
var image_uploader = wp.media({
title: 'Добавить изображение',
button: {
text: 'Добавить изображение'
},
library: {
type: 'image' // Ограничиваем только для изображений
},
multiple: false
});
image_uploader.on('select', function() {
var attachment = image_uploader.state().get('selection').first().toJSON();
// обработка выбранного изображения
console.log(attachment);
});
image_uploader.open();
}
function upload_pdf(e) {
e.preventDefault();
var pdf_uploader = wp.media({
title: 'Добавить PDF',
button: {
text: 'Добавить PDF'
},
library: {
type: 'application/pdf' // Ограничиваем только для PDF
},
multiple: false
});
pdf_uploader.on('select', function() {
var attachment = pdf_uploader.state().get('selection').first().toJSON();
// обработка выбранного PDF
console.log(attachment);
});
pdf_uploader.open();
}
});
Шаг 2: Фильтрация загружаемых вложений
Теперь вы можете использовать фильтр ajax_query_attachments_args
для изменения запроса вложений в зависимости от типа загружаемого файла или другого условия. Например, если вы хотите отобразить только вложения текущего пользователя:
function custom_attachment_filter($query) {
// Дополнительные условия фильтрации
if (isset($_REQUEST['custom_action'])) {
$query['author'] = get_current_user_id(); // Ограничиваем вложения по автору
}
return $query;
}
add_filter('ajax_query_attachments_args', 'custom_attachment_filter', 10, 1);
Шаг 3: Запуск в зависимости от действия
Теперь, когда у вас есть две разные функции для загрузки, рассмотрите возможность передачи параметров в запрос, чтобы ваши фильтры могли работать с ними.
// Пример добавления параметров в URL
function upload_image(e) {
e.preventDefault();
var image_uploader = wp.media({
title: 'Добавить изображение',
button: {
text: 'Добавить изображение'
},
library: {
type: 'image'
},
multiple: false
});
// Передаем специальный параметр
image_uploader.on('open', function() {
image_uploader.params = { custom_action: 'upload_image' };
});
image_uploader.on('select', function() {
var attachment = image_uploader.state().get('selection').first().toJSON();
console.log(attachment);
});
image_uploader.open();
}
Заключение
Следуя этим шагам, вы сможете реализовать два различных медиапопапа с уникальной функциональностью в WordPress, которые будут работать в зависимости от определенных действий пользователей. Убедитесь, что ваша логика в фильтре правильно обрабатывает условия для различных загрузчиков, чтобы они показывали правильные вложения в зависимости от выбранного пользователем действия.