Comment définir la structure du permalien via functions.php

10

J'installe un réseau Wordpress et je voulais que tous les nouveaux sites aient la même structure de permalien (c'est-à-dire "/% year% /% monthnum% /% postname% /"). Je me demande si cela est possible via des hooks ou des hacks dans functions.php, sans avoir à compter sur les utilisateurs pour choisir cette structure.

Tomas Buteler
la source

Réponses:

15

Vous pouvez définir la structure de permalien en appelant la set_permalink_structure()méthode de l' $wp_rewriteobjet global .

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

Voici une version PHP <5.3 du code au cas où vous auriez des erreurs.

function reset_permalinks() {
    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%postname%/' );
}
add_action( 'init', 'reset_permalinks' );
soulseekah
la source
Copier et coller votre code génère une erreur, mais la logique fait l'affaire! Je me demande seulement si ma question / mes intentions sont de bonnes pratiques, cependant ...
Tomas Buteler
1
Tomas, merci d'avoir accepté la réponse. Heureux d'avoir été utile. En ce qui concerne les bonnes pratiques - je pense que si votre objectif est d'imposer et de verrouiller une telle structure de permalien sur les sites Web - alors c'est justifiable; et par «verrouiller», je veux dire que le code ne permettra aucune modification de la structure via l'administrateur, si c'est bien, je pense que c'est tout à fait correct de le faire.
soulseekah
1
Cela fonctionne mais cela provoque un conflit lorsque l'administrateur enregistre à partir de la page de permalien (404 sur les publications). Ensuite, lorsque le site se charge (processus init hook), la structure du permalien change à nouveau (404 sur les messages à nouveau). l'utilisation $wp_rewrite->flush_rules();résout le problème. Mauvaise pratique pour l'utiliser sur init et l'exécuter à chaque fois. La simple visite de la page des permaliens fera l'affaire.
Sisir
1
L'intention était de désactiver la page des options de permaliens, alors peut-être que je peux m'en tirer?
Tomas Buteler
3
Il devrait être appelé sur 'after_switch_theme' ou sur l'activation du plugin et être suivi de 'flush_rewrite_rules ()'
csstd
2

La réponse précédente ne fonctionne pas. J'ai obtenu une solution pure. Peut utiliser Utilisez ce code. Cela fonctionnera à 100%. Merci

/**
 * 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
la source
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
la source