Вопрос или проблема
Есть идеи, как взломать WP 3.8.x для этой функции?
Не могу предоставить рабочий пример, но есть соответствующий раздел в wp-includes/js/media-views.js на строке 3173:
media.view.AttachmentFilters.Uploaded = media.view.AttachmentFilters.extend({
createFilters: function() {
var type = this.model.get('type'),
types = media.view.settings.mimeTypes,
text;
if ( types && type )
text = types[ type ];
this.filters = {
all: {
text: text || l10n.allMediaItems,
props: {
uploadedTo: null,
orderby: 'date',
order: 'DESC'
},
priority: 10
},
uploaded: {
text: l10n.uploadedToThisPost,
props: {
uploadedTo: media.view.settings.post.id,
orderby: 'menuOrder',
order: 'ASC'
},
priority: 20
}
};
}
});
Один фильтр ссылается на uploadedTo: null
, а другой на uploadedTo: media.view.settings.post.id
. Это эквивалентно “Все вложения” и “вложенные в текущий пост”.
Когда вложение не присоединено, его значение uploadedTo
равно 0. Я пытался создать новый фильтр для этого, но он не вернул никаких вложений (у меня в базе данных есть неподключенные загрузки).
Строка 581 wp-includes/js/media-models.js показывает, как устроен механизм фильтрации:
uploadedTo: function( attachment ) {
var uploadedTo = this.props.get('uploadedTo');
if ( _.isUndefined( uploadedTo ) )
return true;
return uploadedTo === attachment.get('uploadedTo');
}
Я предполагал, что нулевое значение пройдет через _.isUndefined(), но это не так. Так что я в полном недоумении. Но, возможно, это подскажет вам или кому-то другому правильное направление. Медиафреймворк все еще в основном не документирован.
Ответ или решение
Для того чтобы отфильтровать загруженные медиафайлы в всплывающем окне "Добавить медиа" (Add Media Popup) и показать только "непривязанные" медиафайлы в WordPress версии 3.8.x, вам необходимо внести изменения в JavaScript файлы ядра WordPress.
Шаги для реализации функции фильтрации непривязанных медиафайлов:
-
Редактирование файла
media-views.js
:Найдите файл
media-views.js
, который обычно находится в директорииwp-includes/js/
. Нам нужно создать новый фильтр для получения непривязанных медиафайлов.В этом файле, на строке 3173, добавьте новый объект фильтра для непривязанных медиафайлов:
media.view.AttachmentFilters.Unattached = media.view.AttachmentFilters.extend({ createFilters: function() { var type = this.model.get('type'), types = media.view.settings.mimeTypes, text; if ( types && type ) text = types[ type ]; this.filters = { all: { text: text || l10n.allMediaItems, props: { uploadedTo: null, orderby: 'date', order: 'DESC' }, priority: 10 }, uploaded: { text: l10n.uploadedToThisPost, props: { uploadedTo: media.view.settings.post.id, orderby: 'menuOrder', order: 'ASC' }, priority: 20 }, unattached: { // Новый фильтр text: l10n.unattachedMediaItems, // Вы можете добавить локализацию для отображаемого текста props: { uploadedTo: 0, // Установим uploadedTo в 0 для фильтрации непривязанных orderby: 'date', order: 'DESC' }, priority: 30 } }; } });
-
Обновление функции фильтрации в
media-models.js
:Затем вам нужно убедиться, что фильтры работают корректно. Найдите функцию
uploadedTo
в файлеmedia-models.js
, которая находится на строке 581:uploadedTo: function( attachment ) { var uploadedTo = this.props.get('uploadedTo'); if ( _.isUndefined( uploadedTo ) ) return true; return uploadedTo === attachment.get('uploadedTo'); }
Чтобы фильтр для непривязанных медиафайлов работал корректно, добавьте условие, которое позволит фильтровать значения
uploadedTo
, равные 0.Измените проверку следующим образом:
uploadedTo: function( attachment ) { var uploadedTo = this.props.get('uploadedTo'); if ( _.isUndefined( uploadedTo ) ) return true; // Добавим условие для проверки на равенство нулю return uploadedTo === attachment.get('uploadedTo') || (uploadedTo === 0 && attachment.get('uploadedTo') === '0'); }
Завершение:
После внесения этих изменений, в вашем всплывающем окне "Добавить медиа" должен появиться новый фильтр "Непривязанные" (Unattached), который будет отображать только те медиафайлы, которые не привязаны ни к одному посту.
Замечание:
Обратите внимание, что изменения, внесенные в файлы ядра WordPress, могут быть перезаписаны в результате обновления ядра. Рекомендуется добавить свои изменения в дочернюю тему или использовать плагин для пользовательских скриптов, чтобы избежать потери изменений при обновлении.