Intereting Posts
Использовать дочернюю тему на определенных страницах, а не на других? Имя шаблона всегда совпадает с именем каталога? Помощник менеджера заданий менеджера? Как загрузить изображение на странице параметров плагина Редактирование выходных данных Yoast SEO Как я могу программно показать конкретную (шаблонную) страницу, например author.php? замените wp_get_attachment_image своей собственной функцией Как удалить комментаторов возможность добавлять гиперссылки к комментариям? render html без форматирования создать ссылку на случайную запись в текущей категории .htaccess перенаправление файлов в родительский каталог Как удалить вложения, связанные с настраиваемым типом поля при изменении свойств публикации? Пусть WordPress откроет внешний URL Как получить идентификатор страницы, если я знаю только название? Ошибка регистрации типа записи сообщения 404

Передача файла вместо страницы wordpress

Я пытаюсь создать страницу, где пользователь предоставляет идентификатор вложения, и сайт будет устанавливать заголовки и доставлять этот файл вместо страницы 404. so / download / 1754 будет искать вложение с этим Id и выводить его для просмотра / загрузки в зависимости от типа файла.

Я просто не могу придумать удобный для WordPress способ сделать это изнутри плагина. Я рассмотрел возможность использования add_rewrite_rule, но не смог найти хороший способ обойти его, также считая проверку $ _SERVER ['REQUEST_URI'], чтобы доставить контент до любого HTML, но тогда мне пришлось бы остановить страницу от рендеринга 404, и я не был уверен в удобном для WordPress способе сделать это.

Моя нынешняя идея состояла в том, чтобы мой плагин создал страницу загрузки, назначил шаблон и использовал этот шаблон для логики вместо моего класса плагина. в то время как я использовал это раньше, в другой ситуации это было очень грязно, поскольку мне пришлось написать много кода, чтобы заставить пользователей не обновлять или редактировать файл, а также воссоздавать / удалять его при активации. так что в идеале я бы хотел этого избежать.

Solutions Collecting From Web of "Передача файла вместо страницы wordpress"

Вы на правильном пути с правилом перезаписи. Если вы просто доставляете файл, вы можете подключить раннее действие, проверить, была ли запрошена загрузка, а затем вывести файл и выйти до того, как WordPress когда-либо дойдет до стадии запроса базы данных, а решение о запросе – 404.

 // add the download ID query var which we'll set in the rewrite rule function wpd_query_var( $query_vars ){ $query_vars[] = 'download_id'; return $query_vars; } add_filter( 'query_vars', 'wpd_query_var' ); // add rewrite rule function wpd_rewrite(){ add_rewrite_rule( 'download/([0-9]+)/?$', 'index.php?download_id=$matches[1]', 'top' ); } add_action( 'init', 'wpd_rewrite' ); // check for download_id and output the file function wpd_request( $wp ){ if( array_key_exists( 'download_id', $wp->query_vars ) ) { // output your headers and file here // ID is in $wp->query_vars['download_id'] // then exit to halt any further execution exit; } } add_action( 'parse_query', 'wpd_request' ); 

Вы можете попробовать следующий пример: для вложений изображений:

 add_action( 'init', function() { add_rewrite_endpoint( 'download', EP_ROOT ); add_action( 'template_redirect', function() { if ( $pid = get_query_var( 'download' ) ) { $found = false; if( $file = wp_get_attachment_image_src( absint( $pid ), 'full' ) ) { $found = true; header( "Content-Disposition: attachment; filename=" . basename( $file[0] ) ); readfile( $file[0] ); exit(); } if( ! $found ) wp_die( __( 'Image file not found!' ) ); } } ); } ); 

где вам, возможно, придется настраивать заголовки в соответствии с вашими потребностями.

Повторно создайте свои правила перезаписи, а затем вы сможете загружать вложения изображений из:

 http://example.tld/download/123/ 

Там есть намного лучшие сценарии, по сравнению с этой простой демонстрацией, но, похоже, она работает над моей установкой. Проверьте, например, из этого блога , похоже, есть интересные идеи о том, как обрабатывать большие файлы.

Надеюсь, вы можете изменить его в соответствии с вашими потребностями.