Jak ustawić strukturę permalink za pomocą functions.php

10

Konfiguruję sieć Wordpress i chcę, aby wszystkie nowe witryny miały taką samą strukturę bezpośredniego połączenia (tj. „/% Year% /% monthnum% /% postname% /”). Zastanawiam się, czy można to zrobić za pomocą haków lub hacków w functions.php, bez konieczności wybierania tej struktury przez użytkowników.

Tomas Buteler
źródło

Odpowiedzi:

15

Możesz ustawić strukturę permalink, wywołując set_permalink_structure()metodę $wp_rewriteobiektu globalnego .

add_action( 'init', function() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
} );

Oto wersja kodu PHP <5.3 na wypadek błędów.

function reset_permalinks() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );
soulseekah
źródło
Kopiowanie i wklejanie kodu generuje błąd, ale uzasadnienie to załatwia sprawę! Zastanawiam się tylko, czy moje pytanie / intencje są dobrą praktyką ...
Tomas Buteler
1
Tomas, dziękuję za zaakceptowanie odpowiedzi. Cieszę się, że mogłem pomóc. Jeśli chodzi o dobre praktyki - myślę, że jeśli Twoim celem jest egzekwowanie i blokowanie takiej struktury permalink na stronach internetowych - jest to uzasadnione; a przez „blokadę” rozumiem, że kod nie pozwoli na żadne zmiany w strukturze za pośrednictwem administratora, jeśli to w porządku, uważam, że jest to całkowicie w porządku.
soulseekah
1
Działa, ale powoduje konflikt, gdy administrator zapisuje ze strony permalink (404 na postach). Następnie, gdy strona ładuje się (proces init hook) struktura permalink zmienia się ponownie (404 na postach ponownie). używanie $wp_rewrite->flush_rules();rozwiązuje problem. Zła praktyka używania go przy init i uruchamiania go za każdym razem. Wystarczy odwiedzić stronę permalinks.
Sisir
1
Całą intencją było wyłączenie strony opcji permalinks, więc może uda mi się to zrobić?
Tomas Buteler
3
Powinien być wywoływany „after_switch_theme” lub przy aktywacji wtyczki, a następnie „flush_rewrite_rules ()”
csstd
2

Poprzednia odpowiedź nie działa. Mam czyste rozwiązanie. Można użyć Użyj tego kodu. Będzie działać w 100%. Dzięki

/**
 * 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' );
Soczysty Islam
źródło
0
function setPermaLink(){
    $ps = '/%category%/%postname%/';
    $permalink_structure = sanitize_option( 'permalink_structure', $ps);
    $blog_prefix = '/blog';
    $prefix = '/index.php';

    if ( ! empty( $permalink_structure ) ) {
        $permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );
        if ( $prefix && $blog_prefix ) {
            $permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
        } else {
            $permalink_structure = $blog_prefix . $permalink_structure;
        }
    }

    $wp_rewrite->set_permalink_structure( $permalink_structure );
    flush_rewrite_rules();
}

setPermaLink();
Ricardo Boavida
źródło