Отключить распознавание пути WordPress как вложения
1 ответ
- голосов
Узнав немного больше о структуреperma по умолчанию и о том,как ее изменить,я наткнулся на ловушку rewrite_rules_array
. Этот хук позволяет фильтровать массив правил перезаписи,массив правил перезаписи URL в WordPress,что поможет определить,какой тип контента загружать.
Это отличное место,чтобы отключить поведение по умолчанию для распознавания пути как вложения. Таким образом вы избавитесь от всех правил перезаписи вложений,а значит,и от всех действий по распознаванию пути как вложения.
add_filter('rewrite_rules_array', function($rules) {
foreach ($rules as $rule => $url) {
if (strpos($url, 'attachment') !== false) {
unset($rules[$rule]);
}
}
return $rules;
});
Я не уверен во всех остальных правилах и определенно хочу их все проверить. Например:
"(.?.+?)(?:/([0-9]+))?/?$" => "index.php?pagename=$matches[1]&page=$matches[2]"
"([^/]+)(?:/([0-9]+))?/?$" => "index.php?name=$matches[1]&page=$matches[2]"
Поможет вам распознавать страницы,очень полезно знать,если вы хотите использовать только страницы. Но помните,что если вы переписываете массив только с этими ключами/значениями,тогда новые правила,например правила для вашего пользовательского типа сообщения,также будут переписаны (удалены).
ПРИМЕЧАНИЕ. Отладка этого фильтра возможна только на странице Настройки> Постоянные ссылки в серверной части WordPress.
After getting to know a bit more about the default perma structure and how to modify it I stumbled upon the hook rewrite_rules_array
. This hook allows you to filter the array of rewrite rules, an array of URL rewrite rules in WordPress what will help determine what type of content to load.
This is a great place to disable the default behavior for recognizing the path as attachment. This is how you get rid of all rewrite rules for attachments, thus all the behavior for recognizing a path as attachment.
add_filter('rewrite_rules_array', function($rules) {
foreach ($rules as $rule => $url) {
if (strpos($url, 'attachment') !== false) {
unset($rules[$rule]);
}
}
return $rules;
});
I'm not sure about all other rules and I definitely want to check them all out. These for example:
"(.?.+?)(?:/([0-9]+))?/?$" => "index.php?pagename=$matches[1]&page=$matches[2]"
"([^/]+)(?:/([0-9]+))?/?$" => "index.php?name=$matches[1]&page=$matches[2]"
Will help you recognize pages, very useful to know if you only want to use pages. But remember if you rewrite the array with only these keys/values then new rules for example rules for your custom post type will also be rewritten (removed).
NOTE: Debugging this filter is only possible on the Settings > Permalinks page in the WordPress back-end.
Каждый раз,когда вы вводите URL-адрес с двумя несуществующими сегментами пути,WordPress автоматически анализирует запрос как вложение.
Как воспроизвести
/%postname%/
./foo/bar
убедитесь,что "foo" не является существующей таксономией или типом публикации.pre_get_posts
и создайте дампglobal $wp_query
.post_type = 'attachment'
и некоторую другую информацию,связанную с вложениями.ПРИМЕЧАНИЕ. Я не уверен в утверждениях,сделанных на шагах 2 и 5.
Почему это нужно?
Мне было очень неприятно иметь дело с этим поведением по умолчанию,и я действительно хотел бы как-нибудь его отключить,если вы знаете,как,пожалуйста,дайте мне знать. Это делает невозможным создание определенных структур постоянных ссылок. Где вы,вероятно,тоже захотите узнать. Я пытаюсь создать структуру постоянных ссылок,в которой текущая слага сообщения является префиксом слага термина. Например,тип сообщения "example" имеет сообщение "bar",которое связано с термином со слагом "foo". Вместо определения постоянной ссылки «example/bar» ее следует определить как «foo/bar».