Принудительное отображение документов в диалоге с изображениями
У меня возникла сложная проблема... ...для пользовательского типа постов под названием "Ресурсы" я использовал функцию "Избранное изображение" или "миниатюра" в WordPress, чтобы пользователи могли прикреплять документы к "Ресурсам". Сам процесс работает точно так, как ожидалось и ожидалось.
Однако, настраивая сайт, кто-то допустил ошибку, загрузил два документа и назначил их неправильным "Ресурсам". Так что Resource A -> Document B
и Resource B -> Document A
.
При попытке переключить их и щелчке "Редактировать показанное изображение" вы не можете просмотреть ни один из документов. Они нажали "Удалить показанное изображение", а затем "Установить показанное изображение", и когда откроется диалог, документов по-прежнему не будет.
В медиатеке Wordpress есть все загруженные и прикрепленные документы. Видимый, с предварительным просмотром и т.д. Как и ожидалось. Вот первые две строки медиатеки. Вы можете увидеть тонны PDF-файлов, которые были успешно загружены.
Единственное место, где эта проблема похоже, что в фактическом диалоговом окне МУЛЬТИМЕДИА "Избранное изображение" WordPress не будет отображать никаких PDF-файлов.
Вот сегмент поддержки CPT:
$rsc_supports = array(
'title',
'editor',
'thumbnail',
'page-attributes'
);
Как я уже сказал, все работает отлично - даже загрузка и прикрепление PDF-файлов в виде "эскизов", которые будут связаны в качестве вложений с CPT. Когда PDF-файл прикреплен и вы "Нажимаете, чтобы отредактировать", открывается диалог, и вы можете увидеть прикрепленный PDF-файл в списке. Единственным недостатком является то, что модальное/всплывающее/диалоговое окно "Избранное изображение", которое загружается, предназначен для фильтрации всего, кроме изображений. Вот как выглядит это диалоговое окно на "Ресурсе", к которому ничего не прикреплено.
Однако, если вы просмотрите другой ресурс, к которому уже прикреплен PDF-файл, вы получите следующее:
Я пробовал раскрывающийся список фильтрации и даты, и они не решают эту проблему.
Я считаю, что это сделано специально. Поэтому мой вопрос таков: "Как мне изменить это диалоговое окно, чтобы отображать все файлы, а не просто образы?"
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 );
}
} );
Вы пробовали этот плагин Эскизы PDF ?
Этот плагин создает миниатюру с первой страницы загруженного документа и называет ее именем PDFNAME-миниатюра, затем вы можете использовать это изображение в качестве отличительного изображения. этот плагин устарел, около 4 лет назад, поэтому убедитесь в его тестировании и совместимости.