Полное отключение страниц вложений

31 авг. 2016 г., 18:54:10
Просмотры: 16.5K
Голосов: 13

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

3
Комментарии

Что вы имеете в виду под "полностью отключить"? При добавлении медиафайлов URL-адреса вложений создаются автоматически. Не знаю, можно ли отключить это действие без вреда для ядра WordPress.

Почему перенаправление не является элегантным решением? В чем проблема с URL-адресами вложений? Я не осуждаю, просто пытаюсь понять, чтобы предложить решение.

Fencer04 Fencer04
31 авг. 2016 г. 20:35:08

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

Maciej Kravchyk Maciej Kravchyk
1 сент. 2016 г. 08:19:49

@Fencer04 это можно сделать без вреда для ядра WP, см. мой ответ. Во многих случаях это имеет смысл. Перенаправления — это плохо, и технически это не правильный вариант использования — вместо перенаправления существующего URL лучше вообще не иметь этого URL, если вы его не используете. Кроме того, при каждом запросе WP сканирует весь массив правил перезаписи, пока не найдет первое совпадение, он оценивает их с помощью регулярных выражений, что медленно. Меньший массив правил означает лучшую производительность. По этой причине я часто удаляю даты, архивы авторов, встраивания (embeds), ленты (feeds) и т.д. — в основном все функции, которые не используются в проекте.

Ihor Vorotnov Ihor Vorotnov
23 июн. 2017 г. 13:14:53
Все ответы на вопрос 4
6
13

Вы можете отфильтровать стандартные правила перезаписи и удалить те, которые относятся к вложениям:

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' );

В этом случае, даже когда вы вставляете вложение в запись и выбираете "Ссылаться на страницу вложения", изображение будет вставлено без ссылки.

23 июн. 2017 г. 13:05:38
Комментарии

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

italiansoda italiansoda
13 июл. 2017 г. 20:25:49

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

Ola Ola
2 окт. 2018 г. 12:21:25

Плагин Yoast SEO отлично справляется с этой задачей.

wp-mario.ru wp-mario.ru
8 мая 2020 г. 16:01:12

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

wp-mario.ru wp-mario.ru
8 мая 2020 г. 16:06:07

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

Ihor Vorotnov Ihor Vorotnov
11 мая 2020 г. 17:49:53

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

Tom J Nowell Tom J Nowell
13 янв. 2024 г. 21:18:01
Показать остальные 1 комментариев
1
10

Если вы хотите полностью отключить страницы медиафайлов, следует использовать код ответа 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, который также включает инструмент для изменения существующих вложений, чтобы они не вызывали проблем в будущем.

20 мая 2021 г. 15:45:05
Комментарии

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

Nicolas Guérinet Nicolas Guérinet
1 нояб. 2023 г. 11:28:38
0

Для тех, кто не использует плагины или предпочитает облегчённые методы. Это может быть полезно.

Данный метод перенаправляет вложения непосредственно к файлу, а не на страницу вложения, и именно этот метод используют некоторые плагины.

Для тестирования добавьте следующий код в файл 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

6 нояб. 2020 г. 07:10:09
0

Теперь это поведение по умолчанию в WP 6.4, и его можно настроить с помощью опции wp_attachment_pages_enabled. Изменения можно внести:

  1. через CLI: wp option set wp_attachment_pages_enabled 0|1
  2. посетив страницу /wp-admin/options.php
  3. с помощью небольшого плагина

Когда эта опция установлена в 0:

  • страницы вложений больше не отображаются в графическом интерфейсе как опция при использовании изображений/галерей
  • URL-адреса страниц вложений перенаправляют на исходные файлы для авторизованных пользователей
  • карты сайта/REST API и т.д. используют оригинальные URL-адреса загруженных файлов

Подробнее читайте по ссылке: https://make.wordpress.org/core/2023/10/16/changes-to-attachment-pages/

13 янв. 2024 г. 21:28:27