So stellen Sie die Permalink-Struktur über functions.php ein

10

Ich richte ein Wordpress-Netzwerk ein und wollte, dass alle neuen Websites dieselbe Permalink-Struktur haben (dh "/% year% /% monthnum% /% postname% /"). Ich frage mich, ob dies über Hooks oder Hacks in functions.php möglich ist, ohne sich bei der Auswahl dieser Struktur auf Benutzer verlassen zu müssen.

Tomas Buteler
quelle

Antworten:

15

Sie können die Permalink-Struktur festlegen, indem Sie die set_permalink_structure()Methode des globalen $wp_rewriteObjekts aufrufen .

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

Hier ist eine PHP <5.3-Version des Codes, falls Sie Fehler erhalten.

function reset_permalinks() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );
Soulseekah
quelle
Das Kopieren und Einfügen Ihres Codes führt zu einem Fehler, aber die Begründung reicht aus! Ich frage mich nur, ob meine Frage / Absichten gute Praxis sind ...
Tomas Buteler
1
Tomas, danke, dass du die Antwort angenommen hast. Ich bin froh, geholfen zu haben. Was gute Praktiken betrifft - ich denke, wenn Ihr Ziel darin besteht, eine solche Permalink-Struktur über Websites hinweg durchzusetzen und zu sperren -, ist dies gerechtfertigt. und mit 'sperren' meine ich, dass der Code keine Änderungen an der Struktur über den Administrator zulässt. Wenn das in Ordnung ist, ist es meiner Meinung nach völlig in Ordnung, dies zu tun.
Soulseekah
1
Es funktioniert, verursacht jedoch einen Konflikt, wenn der Administrator von der Permalink-Seite speichert (404 bei Posts). Wenn dann die Site geladen wird (Proccess Init Hook), ändert sich die Permalink-Struktur erneut (404 erneut auf Posts). mit $wp_rewrite->flush_rules();löst das Problem. Es ist eine schlechte Praxis, es auf init zu verwenden und es jedes Mal auszuführen. Nur der Besuch der Permalinks-Seite reicht aus.
Sisir
1
Die ganze Absicht war es, die Permalink-Optionsseite zu deaktivieren, damit ich vielleicht damit durchkommen kann?
Tomas Buteler
3
Es sollte bei 'after_switch_theme' oder bei der Plugin-Aktivierung aufgerufen werden, gefolgt von 'flush_rewrite_rules ()'
csstd
2

Vorherige Antwort funktioniert nicht. Ich habe eine reine Lösung bekommen. Kann diesen Code verwenden. Es wird 100% funktionieren. Vielen Dank

/**
 * 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' );
Saiful Islam
quelle
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
quelle