Принудительное отображение документов в диалоге с изображениями


У меня возникла сложная проблема... ...для пользовательского типа постов под названием "Ресурсы" я использовал функцию "Избранное изображение" или "миниатюра" в WordPress, чтобы пользователи могли прикреплять документы к "Ресурсам". Сам процесс работает точно так, как ожидалось и ожидалось.

Однако, настраивая сайт, кто-то допустил ошибку, загрузил два документа и назначил их неправильным "Ресурсам". Так что Resource A -> Document B и Resource B -> Document A.

При попытке переключить их и щелчке "Редактировать показанное изображение" вы не можете просмотреть ни один из документов. Они нажали "Удалить показанное изображение", а затем "Установить показанное изображение", и когда откроется диалог, документов по-прежнему не будет.

В медиатеке Wordpress есть все загруженные и прикрепленные документы. Видимый, с предварительным просмотром и т.д. Как и ожидалось. Вот первые две строки медиатеки. Вы можете увидеть тонны PDF-файлов, которые были успешно загружены. Media Library

Единственное место, где эта проблема похоже, что в фактическом диалоговом окне МУЛЬТИМЕДИА "Избранное изображение" WordPress не будет отображать никаких PDF-файлов.

Вот сегмент поддержки CPT:

$rsc_supports = array(
     'title',
     'editor',
     'thumbnail',
     'page-attributes'
);

Как я уже сказал, все работает отлично - даже загрузка и прикрепление PDF-файлов в виде "эскизов", которые будут связаны в качестве вложений с CPT. Когда PDF-файл прикреплен и вы "Нажимаете, чтобы отредактировать", открывается диалог, и вы можете увидеть прикрепленный PDF-файл в списке. Единственным недостатком является то, что модальное/всплывающее/диалоговое окно "Избранное изображение", которое загружается, предназначен для фильтрации всего, кроме изображений. Вот как выглядит это диалоговое окно на "Ресурсе", к которому ничего не прикреплено. Featured Image Dialogue

Однако, если вы просмотрите другой ресурс, к которому уже прикреплен PDF-файл, вы получите следующее: With PDF Attached

Я пробовал раскрывающийся список фильтрации и даты, и они не решают эту проблему.

Я считаю, что это сделано специально. Поэтому мой вопрос таков: "Как мне изменить это диалоговое окно, чтобы отображать все файлы, а не просто образы?"

Author: Tony Djukic, 2020-06-03

2 answers

Так что это может быть банально..

Я имею в виду, по сравнению с переопределением панели/компонента изображений по умолчанию в редакторе блоков Гутенберга, что не совсем сложно, но это намного проще и в основном просто требует нескольких строк пользовательского кодирования. (прочитайте до конца, чтобы понять, что я имею в виду)

И я также попробовал и протестировал его работу (как со старым/классическим редактором, так и с редактором блоков Гутенберга) на WordPress 5.4.2 (последняя версия на момент написания), а также как WordPress 5.4.1.

Поэтому для того, что вы пытаетесь сделать, вы можете переопределить wp.media.model.Query.prototype.sync() (определено в wp-includes/js/media-models.js) какая функция используется модальным изображением по умолчанию для запроса вложений через AJAX (admin-ajax.php?action=query-attachments).

Полный (JS) код

wp.media.model.Query.prototype.sync = function( method, model, options ) {
    var args, fallback;

    // Overload the read method so Attachment.fetch() functions correctly.
    if ( 'read' === method ) {
        options = options || {};
        options.context = this;
        options.data = _.extend( options.data || {}, {
            action:  'query-attachments',
            post_id: wp.media.model.settings.post.id
        });

        // Clone the args so manipulation is non-destructive.
        args = _.clone( this.args );

        // Determine which page to query.
        if ( -1 !== args.posts_per_page ) {
            args.paged = Math.round( this.length / args.posts_per_page ) + 1;
        }

        if ( wp.media.frame && 'featured-image' === wp.media.frame.options.state ) {
            // Here I'm allowing image and PDF files only.
            args.post_mime_type = 'image, application/pdf';
        }

        options.data.query = args;
        return wp.media.ajax( options );

    // Otherwise, fall back to `Backbone.sync()`.
    } else {
        /**
         * Call wp.media.model.Attachments.sync or Backbone.sync
         */
        fallback = Attachments.prototype.sync ? Attachments.prototype : Backbone;
        return fallback.sync.apply( this, arguments );
    }
};

Но единственное, что я там добавил, это этот условный блок:

if ( wp.media.frame && 'featured-image' === wp.media.frame.options.state ) {
    // Here I'm allowing image and PDF files only.
    args.post_mime_type = 'image, application/pdf';
}

, который проверяет, является ли текущий открытый модал модальным изображением, и если да, то мы изменяем post_mime_type аргумент который определяет тип(ы) MIME запрашиваемых вложений.

И вот как вы можете использовать этот подход, чтобы заставить модальное изображение включать файлы , отличные от изображений.

Пример PHP-кода

обновление 13 июняю (другим читателям): просто чтобы прояснить, почему мы должны проверять media-models сценария, потому что мы переопределить что-то в этом сценарии, так что, если сценарий не выполняется загружается на текущую страницу, затем нет необходимости повторять/ставить в очередь наш пользовательский скрипт.:)

Ниже приведен PHP-код, который я использовал для повторения сценария в нижнем колонтитуле на экране редактирования записей для типов записей по умолчанию post и page:

add_action( 'admin_print_footer_scripts', function () {
    $screen_ids = [ 'post', 'page' ];
    if ( in_array( get_current_screen()->id, $screen_ids ) &&
        wp_script_is( 'media-models' ) // check if media-models.js was enqueued
    ) :
        ?>
            <script>
                // See/copy the FULL code above and place it here..
            </script>
        <?php
    endif;
} );

И если вы помещаете сценарий во внешний JS-файл , вы также должны убедиться, что сценарий media-models был поставлен в очередь:

add_action( 'admin_enqueue_scripts', function () {
    $screen_ids = [ 'post', 'page' ];
    if ( in_array( get_current_screen()->id, $screen_ids ) &&
        wp_script_is( 'media-models' ) // check if media-models.js was enqueued
    ) {
        wp_enqueue_script( 'my-script', '/path/to/my-script.js', [], '', true );
    }
} );
 1
Author: Sally CJ, 2020-06-13 13:55:33

Вы пробовали этот плагин Эскизы PDF ?

Этот плагин создает миниатюру с первой страницы загруженного документа и называет ее именем PDFNAME-миниатюра, затем вы можете использовать это изображение в качестве отличительного изображения. этот плагин устарел, около 4 лет назад, поэтому убедитесь в его тестировании и совместимости.

 0
Author: Ahmad Wael, 2020-06-11 11:36:48