Вопрос или проблема
Я пытаюсь имитировать наличие нескольких подпапок с файлами в корневом каталоге установки, но эти названия папок будут конфликтовать со страницами, которым нужно иметь одно и то же имя.
Другими словами, я хочу, чтобы медиафайлы отображались так, как будто они находятся в одной папке со страницей, как если бы URL страницы был реальной папкой.
Пример:
http://example.com/courtcase/
будет страницей для судебного дела, а
http://example.com/courtcase/testimony.pdf будет документом, упомянутым в нем.
Я МОГУ изменить каталог загрузки на корень установки, а затем создать подпапки с помощью плагина, который позволяет организовывать медиафайлы таким образом. ТЕМ Не МЕНЕЕ, обращение к слагу страницы вызовет открытие сервером каталога файлов для фактической папки, а не страницы в базе данных WP.
Поэтому все, что мне нужно, это разместить медиафайлы в другом каталоге, чем установка, чтобы устранить конфликты, а затем сделать так, чтобы слаги для файлов просто начинались с пути каталога установки.
Пример:
http://example.com/wp-content/uploads/courtcase/testimony.pdf
станет
http://example.com/courtcase/testimony.pdf
И, конечно, мне нужно сделать это для всех медиафайлов, а не вручную добавлять переадресации.
{ПРИМЕЧАНИЕ: Это требование клиента. Да, это безумие так заботиться о URL, но такие требования проекта, и они не изменят свою позицию, чтобы принять какой-либо другой результат.}
если вы измените постоянную ссылку на имя поста в настройках и прикрепите testimony.pdf в вашем посте, вы получите http://example.com/your_post/testimony.pdf, чтобы получить URL текстового документа, вы можете использовать этот код
<?php
$args = array(
'post_type' => 'attachment',
'numberposts' => -1,
'post_status' => 'any',
'post_parent' => $post->ID,
'exclude' => get_post_thumbnail_id(),
);
$attachments = get_posts( $args );
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
echo apply_filters( 'the_title', $attachment->post_title );
the_attachment_link( $attachment->ID, false );
}
}
?>
или поместите этот код в single.php
<ul>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();
//добавьте в конец цикла
$args = array(
'post_type' => 'attachment',
'numberposts' => -1,
'post_status' => null,
'post_parent' => $post->ID
);
$attachments = get_posts( $args );
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
echo '<li>';
the_attachment_link( $attachment->ID, true );
echo '<p>';
echo apply_filters( 'the_title', $attachment->post_title );
echo '</p></li>';
}
}
endwhile; endif; ?>
</ul>
код вернет http://wp.example.net/post_name/attachment_name.
это ссылка https://codex.wordpress.org/Function_Reference/get_attachment_link
Ответ или решение
Решение проблемы с медиа-URL слугами без каталога загрузок
Ваша задача состоит в том, чтобы создавать URL медиафайлов, которые выглядят так, как будто они находятся в одной каталоге с текущими страницами, без конфликта с другими URL-путями. Это довольно распространенная проблема, особенно при разработке информационных сайтов, где важна структура URL.
Понимание проблемы
Когда вы загружаете медиафайлы в WordPress, по умолчанию они сохраняются в папке /wp-content/uploads/
, что часто приводит к конфликтам с именами страниц, особенно если страницы имеют такие же названия, как и загружаемые документы. Например, файл testimony.pdf
, загруженный в защищенный раздел courtcase
, может конфликтовать с URL страницы http://example.com/courtcase/
.
Чтобы избежать этой проблемы, вам нужно будет принимать во внимание следующие моменты:
-
Изменения в путях загрузки: Просто изменив каталог загрузки на корневой для WordPress, вы столкнётесь с проблемой, когда сервер может попытаться открыть реальную папку, а не базу данных, в результате чего произойдут ошибки 404.
-
Необходимость модификации URL-структуры: Вам нужно создать маршрутизацию, которая будет направлять запросы на файлы, не находящиеся в каталогах установки, на основе их URL.
Proposed Solution
Для решения вашей задачи следует рассмотреть возможность использования редиректов и правил перезаписи URL (rewrite rules) в WordPress. Вот как вы можете это реализовать:
-
Добавление кастомных правил перезаписи:
В файлеfunctions.php
вашей темы добавьте следующее:function custom_rewrite_rules() { add_rewrite_rule('^courtcase/(.+)$', 'wp-content/uploads/courtcase/$matches[1]', 'top'); } add_action('init', 'custom_rewrite_rules');
Этот код создаёт правило, которое перенаправит все запросы к
http://example.com/courtcase/*
на соответствующие файлы вwp-content/uploads/courtcase/
. -
Обновление постоянных ссылок:
После добавления правил перезаписи вам нужно обновить настройки постоянных ссылок в WordPress. Для этого пройдите в админку, выберитеНастройки
→Постоянные ссылки
и просто нажмитеСохранить изменения
. Это позволит WordPress обновить свои правила перезаписи. -
Использование фильтров для генерации ссылок:
Чтобы автоматически генерировать ссылки на вложения, используйте следующие фильтры и функции для того, чтобы извлекать медиафайлы, прикреплённые к постам. Например, вsingle.php
можно было бы добавить код:<ul> <?php if (have_posts()) : while (have_posts()) : the_post(); $args = array( 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' => 'any', 'post_parent' => $post->ID, ); $attachments = get_posts($args); if ($attachments) { foreach ($attachments as $attachment) { echo '<li>'; echo wp_get_attachment_link($attachment->ID, false); echo '<p>' . apply_filters('the_title', $attachment->post_title) . '</p>'; echo '</li>'; } } endwhile; endif; ?> </ul>
Этот код генерирует список вложений с теми URL, которые вы хотите.
Заключение
Данное решение позволит вам создать желаемую структуру URL, сохранив при этом медиафайлы в отдельной папке. Используя правила перезаписи, вы сможете избежать конфликтов с существующими страницами и обеспечить доступ к документации через краткие и понятные адреса. При этом не забывайте, что после внесения изменений в functions.php
всегда важен процесс обновления постоянных ссылок.
Такое решение полностью соответствует поставленным требованиям и может быть масштабируемым в зависимости от структуры вашего проекта.