Come posso forzare programmaticamente i permalink personalizzati con il mio tema?
Sto realizzando un tema personalizzato. È un tema altamente specializzato per trasformare WordPress in un'applicazione piuttosto che in un sistema CMS o blog. Ad esempio, un sistema di pianificazione per studi dentistici (con funzionalità CMS e widget), giusto per fare un esempio.
Poiché il mio tema necessita di URL ottimizzati per funzionare correttamente, una cosa di cui ho veramente bisogno è che il file .htaccess sia quello predefinito che viene creato solo quando qualcuno imposta i Permalink su Personalizzato (e poi digita qualcosa come %postname%). Come posso attivare questo in WordPress, programmaticamente, in modo che lo crei? Voglio dire, potrei probabilmente sovrascrivere il file manualmente durante l'attivazione del tema, ma la soluzione migliore sarebbe utilizzare l'API di WordPress.

Per abilitare completamente i permalink, è necessario anche assicurarsi che il file .htaccess venga creato. Per farlo, è necessario impostare un'opzione e aggiornare le regole con un valore booleano.
global $wp_rewrite;
// Scrive la regola
$wp_rewrite->set_permalink_structure('/%postname%/');
// Imposta l'opzione
update_option( "rewrite_rules", FALSE );
// Aggiorna le regole e indica di scrivere l'htaccess
$wp_rewrite->flush_rules( true );
Se utilizzi questo codice in un plugin, deve essere nell'hook init
, non nell'hook load
. Se si trova nell'hook load
, genererà un errore dicendo che $wp_rewrite
è nullo.
Importante: Dovresti anche aggiungere una condizione per eseguire questa operazione una sola volta. (Puoi creare un'opzione e verificare se è già impostata; se non lo è, esegui il codice per i permalink e poi imposta quell'opzione).
Inoltre, di solito verifico se ci troviamo nel pannello di amministrazione e eseguo il codice solo in quel caso.

Non dovresti mai eseguire il flush delle regole di riscrittura su init
. È un'operazione costosa e rallenta notevolmente i tempi di caricamento della pagina. Le regole di riscrittura sono salvate nel database, quindi eseguire il flush su init
significa che ci saranno molte chiamate al database per risalvare le regole di riscrittura su ogni caricamento di pagina

@PieterGoosen Leggi il resto della mia risposta. Quello che faccio è verificare se è stato impostato e lo imposto solo una volta (quando installo per la prima volta il plugin) e non viene più eseguito. Verifico anche se è is_admin()
ma non è necessario se viene eseguito solo una volta.

Aggiungi queste informazioni nella tua risposta. Sono dettagli importanti che la tua risposta deve avere per renderla più accettabile ;-)

function change_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
$wp_rewrite->flush_rules();
}
add_action('init', 'change_permalinks');
Potresti non aver bisogno dell'hook action se inserisci questo codice nella funzione di attivazione del tuo tema.
Ho anche scoperto che questo funziona solo parzialmente. Devi comunque cliccare sulla pagina delle impostazioni dei Permalink perché il file .htaccess venga creato. Quindi, cosa fare? Ho trovato che posso utilizzare un IFRAME che carica automaticamente quella pagina dal pannello delle opzioni del mio tema, e così creerà il file .htaccess per me.
<iframe style="position:absolute;top:-5000px" src="<?= site_url() ?>/wp-admin/options-permalink.php"></iframe>

Chiamare flush_rules sull'azione init è una pessima, pessima idea. Potrebbe essere accettabile in una chiamata di funzione di attivazione o installazione, ma non su init.

So che è vecchio, ma puoi fargli riscrivere il file ".htaccess" cambiando le tue regole di flush in questo modo: update_option( "rewrite_rules", FALSE ); $wp_rewrite->flush_rules( true );
Questo scriverà il file ".htaccess".

@DonRhummy per favore pubblicalo come risposta e la contrassegnerò come la nuova risposta.

Ecco come lo uso, in modo che avvenga solo quando il mio tema è attivato e solo se non esiste già un'impostazione precedente salvata (per non rompere qualcosa fatto prima che il mio tema venga utilizzato).
/*
* Imposta i permalink durante l'attivazione del tema
*/
function set_custom_permalinks() {
$current_setting = get_option('permalink_structure');
// Interrompi se è già salvato qualcosa di diverso
if($current_setting) {
return
}
// Salva i permalink su un'impostazione personalizzata, forza la creazione del file delle regole
global $wp_rewrite;
update_option("rewrite_rules", FALSE);
$wp_rewrite->set_permalink_structure('/notizie/%postname%/');
$wp_rewrite->flush_rules(true);
}
add_action('after_switch_theme', 'set_custom_permalinks');
Il vantaggio di questo approccio è che verrà eseguito solo una volta quando il tema viene attivato, non ogni volta che WordPress viene caricato durante una visita al sito.
