Come impostare la struttura dei permalink tramite functions.php

16 ott 2011, 00:19:43
Visualizzazioni: 21.5K
Voti: 9

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.

0
Tutte le risposte alla domanda 3
8
16

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' );
16 ott 2011 18:43:04
Commenti

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...

Tomas Buteler Tomas Buteler
17 ott 2011 00:26:21

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.

soulseekah soulseekah
17 ott 2011 05:01:18

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.

soulseekah soulseekah
17 ott 2011 07:41:43

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

Tomas Buteler Tomas Buteler
18 ott 2011 02:21:30

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.

Sisir Sisir
28 apr 2012 14:16:04

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

Tomas Buteler Tomas Buteler
28 apr 2012 18:08:52

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

csstd csstd
27 ott 2013 06:27:34

Ci sono moltissimi punti in cui puoi agganciare questo per ottenere i risultati desiderati

Xhynk Xhynk
4 giu 2014 00:56:40
Mostra i restanti 3 commenti
0

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' );
31 ago 2017 09:01:49
0
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();
12 set 2019 16:47:01