Cum să setezi structura permalink prin functions.php
Configurez o rețea WordPress și doresc ca toate site-urile noi să aibă aceeași structură permalink (de exemplu "/%year%/%monthnum%/%postname%/"). Mă întreb dacă este posibil să fac acest lucru prin hooks sau modificări în functions.php, fără a depinde de utilizatori să aleagă acea structură.

Puteți seta structura permanentelor de linkuri apelând metoda set_permalink_structure()
a obiectului global $wp_rewrite
.
add_action( 'init', function() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
} );
Iată o versiune a codului pentru PHP < 5.3, în caz că primiți erori.
function reset_permalinks() {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );

Copierea și lipirea codului tău generează o eroare, dar raționamentul funcționează! Mă întreb doar dacă întrebarea mea / intențiile mele sunt considerate bune practici...

Presupun că folosești PHP < 5.3, unde închiderile (funcții anonime) nu erau disponibile, așa că am editat răspunsul meu pentru a include metoda veche. Am testat ambele coduri în fișierul functions.php al temei mele, așa că spune-mi dacă funcționează. Un alt lucru pe care l-am observat este că am scris %year&
în loc de %year%
, așa că am corectat și asta.

Tomas, mulțumesc pentru acceptarea răspunsului. Mă bucur că am putut ajuta. În ceea ce privește bunele practici - cred că dacă obiectivul tău este să impui și să blochezi o astfel de structură de permalink-uri pe mai multe site-uri - atunci asta este justificabil; iar prin 'blochezi' înseamnă că codul nu va permite nicio modificare a structurii prin Admin, dacă asta este în regulă, atunci cred că este total acceptabil să faci acest lucru.

Rulez versiunea 5.2.17, deci asta explică situația! A doua versiune funcționează fără modificări :) Mulțumesc!

Funcționează, dar creează un conflict când administratorul salvează din pagina de permalink-uri (eroare 404 la articole). Apoi, când site-ul se încarcă (procesul hook init), structura de permalink-uri se schimbă din nou (eroare 404 la articole din nou). Folosirea $wp_rewrite->flush_rules();
rezolvă problema. Nu este o practică bună să o folosești pe init și să o rulezi de fiecare dată. Doar vizitarea paginii de permalink-uri va face treaba.

Intenția inițială a fost să dezactivez pagina de opțiuni pentru permalink-uri, așa că poate pot scăpa cu asta?

Ar trebui să fie apelat pe 'after_switch_theme' sau la activarea pluginului și urmat de 'flush_rewrite_rules()'

Răspunsul anterior nu funcționează. Am găsit o soluție pură. Poți folosi Folosește acest cod. Va funcționa 100%. Mulțumesc
/**
* Configurarea rescrierii, când tema este activată
*/
if (isset($_GET['activated']) && is_admin()) {
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
$wp_rewrite->flush_rules();
}
/**
* Redirecționează către pagina de setări Permalink.
* Altfel, regula de redirecționare nu va funcționa corect.
*/
function redirect_to_permalink() {
wp_redirect('options-permalink.php');
}
add_action( 'after_switch_theme', 'redirect_to_permalink' );

function setPermaLink(){
// Setează structura permalink-urilor
$ps = '/%category%/%postname%/';
$permalink_structure = sanitize_option( 'permalink_structure', $ps);
$blog_prefix = '/blog';
$prefix = '/index.php';
if ( ! empty( $permalink_structure ) ) {
// Curăță structura permalink-urilor de caractere nedorite
$permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );
if ( $prefix && $blog_prefix ) {
// Adaugă prefixul corespunzător
$permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
} else {
$permalink_structure = $blog_prefix . $permalink_structure;
}
}
// Aplică structura permalink-urilor și resetează regulile de rescriere
$wp_rewrite->set_permalink_structure( $permalink_structure );
flush_rewrite_rules();
}
setPermaLink();
