Отключить автодополнение URL в WordPress
Недавно я заметил, что WordPress пытается автоматически дополнять URL, когда он введен не полностью. Например, у меня есть URL поста, который выглядит так:
http://www.mysite.com/some-post-title
Если я перехожу по следующему URL:
http://www.mysite.com/some-post-ti
Я вижу, что URL отправляется в WordPress, но WordPress выполняет 301 перенаправление на http://www.mysite.com/some-post-title
.
Как можно отключить это поведение?
Я полагаю, что это функция redirect_canonical
, подключенная к хуку template_redirect
. Её можно отключить следующим образом:
remove_filter('template_redirect', 'redirect_canonical');
Однако перед этим стоит хорошо подумать, поскольку эта функция довольно сложна и выполняет важные SEO-функции:
Перенаправляет входящие ссылки на корректный URL, основываясь на URL сайта.
Поисковые системы считают www.somedomain.com и somedomain.com разными URL, даже если они ведут на один и тот же сайт. Это улучшение для SEO помогает избежать штрафов за дублирующийся контент, перенаправляя все входящие ссылки на один или другой вариант.
Не выполняет перенаправление для RSS-лент, трекбэков, поисковых запросов, всплывающих окон комментариев и админских URL. Также не перенаправляет на серверах IIS 7 без поддержки «красивых» постоянных ссылок, при предпросмотре страниц/записей, в админке WordPress, трекбэках, robots.txt, поисковых запросах или POST-запросах.
Также пытается найти правильную ссылку, если пользователь ввёл несуществующий URL, на основе точного запроса WordPress. Вместо этого функция попытается разобрать URL или запрос, чтобы определить правильную страницу для перехода.
http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/canonical.php#L13
Следующий код возможно отключит автодополнение, не затрагивая SEO-компонент, но я не могу этого гарантировать. Код почти не тестировался, так как у меня никогда не было необходимости отключать эту функцию. Для уверенности пришлось бы детально изучить redirect_canonical
.
function kill_404_redirect_wpse_92103() {
if (is_404()) {
add_action('redirect_canonical','__return_false');
}
}
add_action('template_redirect','kill_404_redirect_wpse_92103',1);

Я добавил этот фрагмент кода в конец моего файла /wp-includes/canonical.php, но редиректы всё равно происходят. Я что-то делаю не так? Кто-нибудь ещё не может отключить это поведение?

@user1380540 не редактируйте основные файлы ядра. Этот код должен быть добавлен в functions.php темы или в плагин.

Это кажется крайне безответственным подходом - автоматически "угадывать" нужную страницу. Я был бы гораздо более открыт к этой функции, если бы существовал способ явно указать, на какую страницу следует переходить.
У меня множество страниц построены в виде последовательности, и это автоматическое угадывание ошибочно выбирает для отображения страницы, которые (случайным образом?) находятся где-то в середине последовательности, вместо начальной страницы.
ОБНОВЛЕНИЕ: Это известное поведение, которое рассматривается здесь: https://core.trac.wordpress.org/ticket/16557

В продолжение ответа FitPM - был создан плагин, отключающий автоматическое угадывание URL.
По состоянию на 2 августа 2017 года он корректно работает в WordPress 4.8. Плагин доступен здесь: https://wordpress.org/plugins/disable-url-autocorrect-guessing/

Одно замечание: если отключить redirect_canonical (например, с помощью remove_action('template_redirect', 'redirect_canonical');
), случайные ссылки вроде https://tld.com/some-random-string/blogpost также будут работать (будет отображаться содержимое страницы https://tld.com/real-category-slug/blogpost).
Если вы хотите предотвратить это и возвращать ошибку 404 для таких случайных URL, используйте следующий код:
add_filter( 'redirect_canonical', function( $redirect_url ) {
$url = 'http'.((isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=='off')?'s':'').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( $redirect_url !== $url ) {
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
}
return false;
});
