Come impostare la struttura dei permalink tramite functions.php
Sto configurando una WordPress Network e vorrei che tutti i nuovi siti abbiano la stessa struttura dei permalink (es. "/%year%/%monthnum%/%postname%/"). Mi chiedo se sia possibile farlo tramite hooks o modifiche nel file functions.php, senza dover dipendere dalla scelta manuale degli utenti per quella struttura.

Puoi impostare la struttura dei permalink chiamando il metodo set_permalink_structure()
dell'oggetto globale $wp_rewrite
.
add_action( 'init', function() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
} );
Ecco una versione del codice compatibile con PHP < 5.3 nel caso tu stia ricevendo errori.
function reset_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );

Copiare e incollare il tuo codice genera un errore, ma la soluzione funziona! Mi chiedo però se la mia domanda/intenzione sia una buona pratica...

Presumo tu stia utilizzando PHP < 5.3, dove le closure (funzioni anonime) non erano disponibili, quindi ho modificato la mia risposta per includere il metodo tradizionale. Ho testato entrambi i codici nel file functions.php del mio tema, fammi sapere se funziona. Un'altra cosa che ho notato è che ho scritto %year&
invece di %year%
, quindi ho corretto anche quello.

Tomas, grazie per aver accettato la risposta. Sono contento di essere stato d'aiuto. Per quanto riguarda le buone pratiche - penso che se il tuo obiettivo è imporre e bloccare tale struttura di permalink tra i siti web - allora è giustificabile; e con 'bloccare' intendo che il codice non permetterà alcuna modifica alla struttura tramite l'Admin, se questo va bene allora credo sia assolutamente corretto farlo.

Sto eseguendo la versione 5.2.17, quindi questo spiega tutto! La seconda versione funziona subito senza modifiche :) Grazie!

Funziona ma causa un conflitto quando l'amministratore salva dalla pagina dei permalink (404 sugli articoli). Poi quando il sito si carica (hook init proccess) la struttura dei permalink cambia nuovamente (nuovamente 404 sugli articoli). Usare $wp_rewrite->flush_rules();
risolve il problema. Non è una buona pratica usarlo su init ed eseguirlo ogni volta. Semplicemente visitando la pagina dei permalink fa il trucco.

L'intera intenzione era di disabilitare la pagina delle opzioni dei permalink, quindi forse posso cavarmela così?

Dovrebbe essere chiamato su 'after_switch_theme' o all'attivazione del plugin e seguito da 'flush_rewrite_rules()'

La risposta precedente non funziona. Ho trovato una soluzione pura. Puoi usare questo codice. Funzionerà al 100%. Grazie
/**
* Rewrite set up, when theme activate i mean
*/
if (isset($_GET['activated']) && is_admin()) {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
$wp_rewrite->flush_rules();
}
/**
* Redirect to Permalink setting Page.
* Otherwise Redirect rule will not work Properly.
*/
function redirect_to_permalink() {
wp_redirect('options-permalink.php');
}
add_action( 'after_switch_theme', 'redirect_to_permalink' );

function setPermaLink(){
// Imposta la struttura base dei permalink
$ps = '/%category%/%postname%/';
// Sanitizza l'opzione della struttura dei permalink
$permalink_structure = sanitize_option( 'permalink_structure', $ps);
$blog_prefix = '/blog';
$prefix = '/index.php';
if ( ! empty( $permalink_structure ) ) {
// Rimuove slash multipli e caratteri speciali
$permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );
if ( $prefix && $blog_prefix ) {
// Aggiunge il prefisso index.php se necessario
$permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
} else {
// Usa il prefisso del blog
$permalink_structure = $blog_prefix . $permalink_structure;
}
}
// Applica la nuova struttura dei permalink
$wp_rewrite->set_permalink_structure( $permalink_structure );
// Svuota e ricarica le regole di riscrittura
flush_rewrite_rules();
}
// Esegue la funzione
setPermaLink();
