Как отфильтровать в всплывающем окне “Добавить медиа”, чтобы показать только “неприкрепленные” медиа.

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

Есть идеи, как взломать 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.

Шаги для реализации функции фильтрации непривязанных медиафайлов:

  1. Редактирование файла 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
               }
           };
       }
    });
  2. Обновление функции фильтрации в 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, могут быть перезаписаны в результате обновления ядра. Рекомендуется добавить свои изменения в дочернюю тему или использовать плагин для пользовательских скриптов, чтобы избежать потери изменений при обновлении.

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

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