Disabilitare l'auto completamento degli URL in WordPress
Ho notato recentemente che WordPress cerca di auto-completare un URL quando non viene inserito nella sua interezza. Ad esempio, ho un URL di un articolo che appare così:
http://www.mysite.com/some-post-title
Se navigo al seguente URL:
http://www.mysite.com/some-post-ti
Posso vedere che l'URL viene inviato a WordPress ma WordPress effettua un reindirizzamento 301 verso http://www.mysite.com/some-post-title
.
Come posso disabilitare questo comportamento?

Credo che sia la funzione redirect_canonical
collegata a template_redirect
. Potresti disabilitarla con:
remove_filter('template_redirect', 'redirect_canonical');
Ma dovresti davvero valutare se vuoi farlo poiché è piuttosto complessa e svolge alcune importanti funzioni SEO:
Reindirizza i link in entrata all'URL corretto in base all'URL del sito.
I motori di ricerca considerano www.somedomain.com e somedomain.com come due URL diversi quando entrambi puntano alla stessa posizione. Questo miglioramento SEO evita penalizzazioni per contenuti duplicati reindirizzando tutti i link in entrata verso uno o l'altro.
Previene il reindirizzamento per feed, trackback, ricerche, popup di commenti, e URL di amministrazione. Non reindirizza su IIS 7 che non supporta permalink ottimizzati, anteprime di pagine/post, amministrazione di WP, Trackback, robots.txt, ricerche, o su richieste POST.
Cercherà anche di trovare il link corretto quando un utente inserisce un URL che non esiste basandosi sulla query esatta di WordPress. Proverà invece a analizzare l'URL o la query nel tentativo di individuare la pagina corretta a cui andare.
http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/canonical.php#L13
Il seguente codice potrebbe disabilitare l'autocompletamento senza interferire con il componente SEO, ma non posso garantirlo. Il codice è stato testato pochissimo poiché non ho mai avuto la necessità di disabilitare questa funzione. Dovrei studiare approfonditamente redirect_canonical
per essere sicuro di qualsiasi cosa.
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);

Ho aggiunto questo snippet di codice alla fine del mio file /wp-includes/canonical.php e i reindirizzamenti continuano a verificarsi. Sto facendo qualcosa di sbagliato? Qualcun altro non riesce a disabilitare questo comportamento?

@user1380540 non si modificano i file core. Questo codice dovrebbe essere inserito nel functions.php del tema o in un plugin.

Sembra estremamente irresponsabile che questo "indovinare" avvenga automaticamente. Sarei molto più aperto all'idea se ci fosse un modo per definire quale sia la pagina corretta a cui indirizzare.
Ho numerose pagine costruite come una sequenza, e questo auto-indovinare sta scegliendo erroneamente di rispondere con pagine che si trovano (casualmente?) da qualche parte nella sequenza, invece della pagina iniziale.
AGGIORNAMENTO: Questo è un comportamento noto, e viene preso in considerazione qui: https://core.trac.wordpress.org/ticket/16557

Come seguito alla risposta di FitPM - è stato creato un plugin che disabilita il comportamento di auto-indovinamento degli URL.
Funziona correttamente per me su WordPress 4.8 al 2 agosto 2017. Il plugin è disponibile qui: https://wordpress.org/plugins/disable-url-autocorrect-guessing/

Una nota: Se si disabilita redirect_canonical (ad esempio con remove_action('template_redirect', 'redirect_canonical');
), anche link casuali come https://tld.com/stringa-casuale/articolo funzioneranno (verrà mostrato il contenuto di https://tld.com/slug-categoria-reale/articolo).
Se vuoi evitare questo comportamento e restituire un errore 404 per questi URL casuali, usa qualcosa come:
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;
});
