web-dev-qa-db-fra.com

add_rewrite_rule ne fonctionne pas, n'est pas ajouté au tableau de règles, pourquoi?

J'essaie d'ajouter une nouvelle règle de réécriture, mais elle ne semble pas avoir été ajoutée au tableau et cela ne fonctionne certainement pas.

J'essaie d'obtenir que l'URL, dult.dev/lists/games/destiny, passe d'une vue de liste de /lists/games/ (qui fonctionne parfaitement) à une vue unique de cette publication. Ma règle de réécriture n'est même pas ajoutée:

add_action( 'init', 'add_rewrite_tags', 10, 0 );
function add_rewrite_tags() {
    global $wp_rewrite; // Global WP_Rewrite class object
    $wp_rewrite->flush_rules();
    add_rewrite_rule( 
        '^lists/([^/]*)/([^/]*)/?', 
        'index.php/lists=$matches[1]&post=$matches[2]', 
        'top' 
    );
    print_r( $wp_rewrite->rewrite_rules() );
}

Lorsque j'appelle la $wp_rewrite->rewrite_rules(), la règle que je viens de créer n'existe pas. J'ai essayé de les purger de différentes façons et j'ai même essayé une règle extrêmement simple pour voir si elle avait été ajoutée et toujours rien.

1
seth.fansided

Essaye ça. Vous ne voulez pas non plus inclure $ wp_rewrite-> flush_rules () dans votre fonction, car cela affleurerait à chaque chargement de page.

add_action('rewrite_rules_array', 'new_rewrite_rules');

function new_rewrite_rules($rules){
        $newrules = array();
        $newrules[ '^lists/([^/]*)/([^/]*)/?' = 'index.php?lists=$matches[1]&post=$matches[2]';
        return $newrules + $rules;
    }

Si vous voulez effacer les règles une seule fois, essayez ceci:

add_action('init', 'flush_new_rule');

function flush_new_rule(){
   global $wp_rewrite;
   if(is_array(get_option('rewrite_rules')) && !array_key_exists('^lists/([^/]*)/([^/]*)/?$', get_option('rewrite_rules')){
   $wp_rewrite->flush_rules( true );
   };
}
2
David Labbe

Vous avez eu quelques erreurs dans la regex qui peuvent rendre les règles de réécriture. Je ne sais pas quelles "listes" ou quel type de message vous souhaitez récupérer, je ne peux donc pas le déboguer, mais cette règle de réécriture doit être correcte:

add_action( 'init', 'add_rewrite_tags' );
function add_rewrite_tags() {

    add_rewrite_rule( 
        '^lists/([^/]+)/([^/]+)/?$', 
        'index.php?lists=$matches[1]&post=$matches[2]', 
        'top' 
    );

}

Ensuite, vous devez vider les règles de réécriture; vous pouvez le faire en visitant la page des paramètres de permaliens sur wp-admin. Si vous souhaitez supprimer les règles de réécriture dans votre code, vous devez effectuer l'activation du plug-in (ou l'activation du thème si vous ajoutez les règles de réécriture dans un thème). Par exemple, dans le fichier principal d'un plugin:

register_activation_hook( __FILE__, function() {

    flush_rewrite_rules();

} );
register_deactivation_hook( __FILE__, function() {

    flush_rewrite_rules();

} );
1
cybmeta