Dezactivare completare automată URL în WordPress
Recent am observat că WordPress încearcă să completeze automat un URL când acesta nu este transmis în întregime. De exemplu, am un URL de articol care arată astfel:
http://www.mysite.com/some-post-title
Dacă navighez către următorul URL:
http://www.mysite.com/some-post-ti
Pot observa că URL-ul este transmis către WordPress, dar WordPress face o redirecționare 301 către http://www.mysite.com/some-post-title
.
Cum pot dezactiva acest comportament?
Cred că este funcția redirect_canonical
atașată la template_redirect
. O poți dezactiva cu:
remove_filter('template_redirect', 'redirect_canonical');
Dar ar trebui să te gândești bine dacă vrei să faci asta, deoarece este destul de complexă și îndeplinește niște funcții importante pentru SEO:
Redirecționează linkurile primite către URL-ul corect bazat pe adresa site-ului.
Motoarele de căutare consideră www.somedomain.com și somedomain.com ca fiind două URL-uri diferite, chiar dacă duc ambele la aceeași locație. Această îmbunătățire SEO previne penalizările pentru conținut duplicat prin redirecționarea tuturor linkurilor primite către una sau alta variantă.
Previne redirecționarea pentru fluxuri, trackbacks, căutări, popup-uri de comentarii și URL-uri de administrare. Nu redirecționează pe IIS 7 care nu suportă permalink-uri frumoase, previzualizări de pagini/postări, administrarea WP, Trackbacks, robots.txt, căutări sau la cereri POST.
De asemenea, va încerca să găsească linkul corect când un utilizator introduce un URL care nu există, bazându-se pe interogarea exactă WordPress. În schimb, va încerca să analizeze URL-ul sau interogarea pentru a determina pagina corectă către care să navigheze.
http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/canonical.php#L13
Următorul cod ar putea opri completarea automată fără a afecta componenta SEO, dar nu pot promite asta. Codul este testat minimal deoarece nu am avut niciodată nevoie să dezactivez această funcționalitate. Ar trebui să studiez redirect_canonical
pentru a fi sigur de orice.
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);

Am adăugat acest fragment de cod la sfârșitul fișierului meu /wp-includes/canonical.php și redirecționările încă se întâmplă. Fac ceva greșit? Mai este cineva care nu poate dezactiva acest comportament?

@user1380540 nu editezi fișierele de nucleu. acest cod ar trebui să fie adăugat în functions.php al temei sau într-un plugin.

Pare extrem de iresponsabil să se facă această "ghicire" automat. Aș fi mult mai deschis la idee dacă ar exista vreun mijloc de a defini care este pagina corectă spre care să se direcționeze.
Am numeroase pagini construite ca o secvență, iar această ghicire automată alege în mod incorect să răspundă cu pagini care sunt (la întâmplare?) undeva în secvență, în loc de pagina de început.
ACTUALIZARE: Acest comportament este cunoscut și este luat în considerare aici: https://core.trac.wordpress.org/ticket/16557

Ca un răspuns complementar la soluția lui FitPM - a fost creat un plugin care dezactivează funcționalitatea de ghicire automată.
Funcționează corect pentru mine pe WordPress 4.8 la data de 2 august 2017. Plugin-ul se găsește aici: https://wordpress.org/plugins/disable-url-autocorrect-guessing/

O notă importantă: Dacă dezactivezi redirect_canonical (de exemplu cu remove_action('template_redirect', 'redirect_canonical');
), atunci linkuri aleatorii precum https://tld.com/some-random-string/blogpost vor funcționa (afișând conținutul de la https://tld.com/real-category-slug/blogpost).
Dacă dorești să împiedici acest comportament și să returnezi eroarea 404 pentru astfel de URL-uri aleatoare, poți folosi următorul cod:
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;
});
