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

Вы можете отфильтровать стандартные правила перезаписи и удалить те, которые относятся к вложениям:
function cleanup_default_rewrite_rules( $rules ) {
foreach ( $rules as $regex => $query ) {
if ( strpos( $regex, 'attachment' ) || strpos( $query, 'attachment' ) ) {
unset( $rules[ $regex ] );
}
}
return $rules;
}
add_filter( 'rewrite_rules_array', 'cleanup_default_rewrite_rules' );
Не забудьте один раз пересохранить постоянные ссылки. WordPress сгенерирует новые правила без всего, что связано с вложениями.
Теперь URL страницы вложения будет выдавать 404 ошибку. Вы также можете добавить этот редирект, чтобы предотвратить появление страницы 404, так как в данном случае она бесполезна. Но я не уверен, как перехватить этот редирект - функция is_attachment() не будет работать, если правила перезаписи удалены.
Обновление:
WordPress по-прежнему будет предлагать красивые URL страниц вложений в медиатеке и диалоговом окне вставки медиа. Вы можете отфильтровать и это:
function cleanup_attachment_link( $link ) {
return;
}
add_filter( 'attachment_link', 'cleanup_attachment_link' );
В этом случае, даже когда вы вставляете вложение в запись и выбираете "Ссылаться на страницу вложения", изображение будет вставлено без ссылки.

Можно ли настроить перезапись так, чтобы вместо автоматически созданной страницы использовался URL файла медиа (ссылка на wp-content/uploads
)?

Да, я бы тоже хотел иметь возможность перенаправлять все страницы вложений на URL файла :)

Кстати, этот код работает не полностью. Если вложение загружается для записи или страницы, то всё работает нормально. Но если просто загрузить вложение в медиатеку, его страница всё равно открывается.

@Mario62RUS 1. Не все используют Yoast SEO. Некоторые ненавидят раздутый интерфейс, который он приносит. Это как рак для админки. 2. Да, с версии 5.0 и Gutenberg многое изменилось. Этот код нужно пересмотреть.

обратите внимание, что в WP 6.4 появился переключатель для отключения вложений, но этот ответ не предотвращает их появление в карте сайта ядра WP, не отключает URL в REST API, не убирает некрасивые постоянные ссылки на страницы вложений и не скрывает опцию в галереях/медиатеке и т.д.

Если вы хотите полностью отключить страницы медиафайлов, следует использовать код ответа 404 вместо перенаправления. Это можно сделать с помощью следующего кода:
function wpse237762_set_404() {
if (is_attachment()) {
global $wp_query;
$wp_query->set_404();
status_header(404);
}
}
// Это покажет 404 на странице вложения
add_filter('template_redirect', 'wpse237762_set_404');
// Это покажет 404 вместо перенаправления на страницу вложения при работе с завершающим слэшем
add_filter('redirect_canonical', 'wpse237762_set_404', 0);
Чтобы ссылки на страницы вложений продолжали работать и перенаправляли прямо к файлу, можно использовать следующий код:
function wpse237762_change_attachment_link($url, $id) {
$attachment_url = wp_get_attachment_url($id);
if ($attachment_url) {
return $attachment_url;
}
return $url;
}
add_filter('attachment_link', 'wpse237762_change_attachment_link', 10, 2);
Чтобы предотвратить резервирование обычных страниц страницами вложений, можно использовать этот код для установки случайных значений для новых вложений (в данном случае UUIDv4)
function wpse237762_unique_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
if ($post_type === 'attachment') {
return str_replace('-', '', wp_generate_uuid4());
}
return $slug;
}
add_filter('wp_unique_post_slug', 'wpse237762_unique_slug', 10, 6);
Это предотвратит ситуацию, когда изображение с именем products.jpeg
резервирует URL https://example.com/products
. В результате страница с названием Продукты получит URL https://example.com/products-2
, что, очевидно, не очень хорошо.
Я собрал этот код в плагине Disable Attachment Pages, который также включает инструмент для изменения существующих вложений, чтобы они не вызывали проблем в будущем.

Предупреждение. Эта строка add_filter('redirect_canonical', 'wpse237762_set_404', 0); также отключает перенаправления коротких ссылок WordPress, таких как yourdomain.com/?p=2570

Для тех, кто не использует плагины или предпочитает облегчённые методы. Это может быть полезно.
Данный метод перенаправляет вложения непосредственно к файлу, а не на страницу вложения, и именно этот метод используют некоторые плагины.
Для тестирования добавьте следующий код в файл functions.php
вашей темы.
add_action( 'template_redirect', 'test_attachment_redirect', 10 );
function test_attachment_redirect() {
if( is_attachment() ) {
$url = wp_get_attachment_url( get_queried_object_id() );
wp_redirect( $url, 301 );
}
return;
}
Ссылки для справки: is_attachment wp_redirect

Теперь это поведение по умолчанию в WP 6.4, и его можно настроить с помощью опции wp_attachment_pages_enabled
. Изменения можно внести:
- через CLI:
wp option set wp_attachment_pages_enabled 0|1
- посетив страницу
/wp-admin/options.php
- с помощью небольшого плагина
Когда эта опция установлена в 0
:
- страницы вложений больше не отображаются в графическом интерфейсе как опция при использовании изображений/галерей
- URL-адреса страниц вложений перенаправляют на исходные файлы для авторизованных пользователей
- карты сайта/REST API и т.д. используют оригинальные URL-адреса загруженных файлов
Подробнее читайте по ссылке: https://make.wordpress.org/core/2023/10/16/changes-to-attachment-pages/
