Usare un anno come titolo di pagina in WordPress
Non mi ero mai accorto di questa curiosità di WP: stavo sviluppando un sito e la pagina doveva chiamarsi semplicemente “1936”, è il nome di un vino, non potevo aggiungere niente a quel nome, doveva chiamarsi così e basta. Però WordPress restituiva un errore 404 perchè secondo lui www.sitoweb.com/1936/ doveva mostrare l’archivio di articoli pubblicati nel 1936.
In effetti WordPress funziona con una serie di Rewrite Rules che riservano alcune posizioni dell’URL sia al formato della data /AAAA/MM/GG/ sia ad alcuni termini come gli archivi /category/ e /tag/ o le pagine /author/ e /comment/, e poi /feed/ e /attachment/ e varie altri termini che non possono essere utilizzati come normali titoli di pagine.
Sicuramente il mio caso è una coincidenza rara, ma come possiamo aggirare il problema? Ci sarebbe un metodo facile e sporco, e un altro più corretto ed elegante.
Il metodo facile lo si fa attraverso le impostazioni Permalink, però è un compromesso. Va aggiunto un termine prima dell’anno, basta anche una lettera, come nella immagine seguente.
In questo modo tutti gli articoli del blog figurano all’interno di /a/ quindi ad esempio www.sitoweb.com/a/2024/07/25/nome-del-post, l’anno non è più adiacente al dominio del sito, e possiamo usarlo come titolo di una pagina, al percorso www.sitoweb.com/1936
Il metodo più elegante si fa via codice, da inserire tipicamente nel file functions.php del tema. WordPress mette a disposizione vari filtri, li troviamo nella documentazione a questa pagina: https://developer.wordpress.org/reference/classes/wp_rewrite/rewrite_rules/
Basta una riga di codice per rimuovere tutte le regole di rewrite che riguardano la data (quindi non avremo più gli archivi per anno), il filtro da usare è add_filter(‘date_rewrite_rules’, ‘__return_empty_array’);
Oltre a questo, possiamo rimuovere altre regole che potrebbero darci fastidio.
add_filter('post_rewrite_rules', '__return_empty_array'); add_filter('date_rewrite_rules', '__return_empty_array'); add_filter('comments_rewrite_rules', '__return_empty_array'); add_filter('search_rewrite_rules', '__return_empty_array'); add_filter('author_rewrite_rules', '__return_empty_array'); add_filter('page_rewrite_rules', '__return_empty_array');
Se vogliamo rimuovere le regole solo di determinati post type o tassonomie, possiamo fare con il codice seguente, dove invece dei segnaposto tra parentesi graffe vanno scritti i nomi:
add_filter('{post_type}_rewrite_rules', '__return_empty_array'); add_filter('{taxonomy}_rewrite_rules', '__return_empty_array');
Infine, esiste il filtro rewrite_rules_array che contiene la somma di tutte le regole, e le possiamo manipolare tutte. Nel mio plugin Admin Tweaks ho aggiunto una funzionalità configurabile, ma per semplicità riporto di seguito un codice da personalizzare a mano:
add_filter( 'rewrite_rules_array', function ( $rules ) { foreach ( $rules as $rule => $rewrite ) { // remove rewrite rules if ( preg_match( '/(wp-json|feed|attachment|archives|trackback|comment|author|year|search|category|embed|tag|register|page\/)/', $rule ) ) { unset( $rules[$rule] ); } // remove year and month rules if ( preg_match('/(year=\$matches|monthnum=\$matches\/)/', $rewrite) ) { unset( $rules[$rule] ); } } // uncomment these 2 lines to check the result, open the permalink page // echo nl2br( var_export( $rules, true ) ); // die; return $rules; });
Con il primo controllo del foreach cerco nelle chiavi dell’array, contengono la regular expression usata da WordPress, troviamo vari termini destinati a regole speciali: “wp-json” è il routing REST, se il sito non deve comunicare con l’esterno (per importare/esportare dati) allora la regola può essere rimossa. Per lo stesso motivo anche “trackback” e “feed” possono essere rimosse. Poi, “register” è una funzione vecchia, mostrava un form di registrazione che ora non esiste più, può essere rimossa tranquillamente. Il termine “embed” viene usato quando le pagine sono incluse in frame di altri siti, e in quel caso la pagina potrebbe avere un layout differente (di solito semplificato), si tratta di una situazione particolare e può essere rimossa. Altri termini sono meno sicuri da rimuovere, per esempio “page” serve per la paginazione, se il sito ha degli archivi con molti articoli allora non va rimossa. Anche “category” potrebbe essere necessaria.
Con il secondo controllo cerco nel valore dell’array, che contiene il percorso finale con i parametri passati. I parametri di anno e il mese vanno cercati qui e sono chiamati “year” e “monthnum“.
Prima del return ho inserito un pezzetto di codice commentato da abilitare al bisogno, serve per mostrare il risultato di tutte le regole applicate. Lo vediamo andando nella pagina Permalink. Grazie a questo possiamo fare ulteriori controlli e modifiche, un sito potrebbe avere custom post type e altri plugin che agiscono sui permalink.
Comments (0)