web-dev-qa-db-fra.com

La règle de réécriture personnalisée n'est pas sélectionnée par Wordpress

J'essaie de créer une URL de réécriture personnalisée telle que

function add_my_rule() {    
    global $wp; 
    $wp->add_query_var('state');   
    $wp->add_query_var('state_destination');
    add_rewrite_rule('destination/([0-9]+)/([^/]*)/page/([0-9]+)','index.php?pagename=destination&state=$matches[1]&state_destination=$matches[2]&paged=$matches[3]','top');
    add_rewrite_rule('destination/([0-9]+)/([^/]*)','index.php?pagename=destination&state=$matches[1]&state_destination=$matches[2]','top');
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action('init', 'add_my_rule');

L'idée est de réécrire toutes les URL dont le modèle est le suivant

www.abc.com/destination/state/state-destination

J'ai un modèle personnalisé destination.php et je veux que toutes ces URL soient gérées là-bas. J'ai déjà fait la même chose dans le passé et cela fonctionne bien, mais maintenant cela ne semble pas fonctionner du tout, comme pour l'URL donnée.

http://localhost/xxx/destination/himachal-pradesh/dalhousie

il va toujours à single.php et non à destination.php. J'ai essayé de vider le cache et même le navigateur, mais il semble que ma règle de réécriture soit incorrecte ou qu'il existe un autre problème. Toute aide à cet égard m'aidera à progresser.

Comme information supplémentaire, ma structure d'URL actuelle dans WordPress est /%year%/%monthnum%/%postname%.html. J'utilise WAMP Server avec l'activation du mode de réécriture.

2
Umesh Awasthi

ceci est une jolie petite classe de ré-écriture créée par: Auteur Kyle E Gentile Je trouvais cela il y a quelque temps déjà, ce qui fonctionne bien dans la plupart des plugins que j'ai créés ...

Enregistrez la première section de code dans un fichier appelé: add_rewrite_rules.php

<?php
/*
//Author Kyle E Gentile
//To use this class you must first include the file.  
//After including the file, you need to create an options array.  For example:
$options = array(
    'query_vars' => array('var1', 'var2'),
    'rules' => array('(.+?)/(.+?)/(.+?)/?$' => 'index.php?pagename=$matches[1]&var1=$matches[2]&var2=$matches[3]')
);
//After creating our $option array, 
//we will need to create a new instance of the class as below:
$rewrite = new Add_rewrite_rules($options);
//You must pass the options array, this way. (If you don't there could be problems) 
//Then you can call the filters and action functions as below:
add_action('wp_head', array(&$rewrite, 'flush_rules'));
add_action( 'generate_rewrite_rules', array(&$rewrite, 'add_rewrite_rules') );
add_filter( 'query_vars', array(&$rewrite, 'add_query_vars') );
//That is it.
*/

//prevent duplicate loading of the class if you are using this in multiply plugins
if(!class_exists('add_rewrite_rules')){

    class Add_rewrite_rules{

        var $query_vars;
        var $rules;

        function __construct($options){
            $this->init($options);
        }

        function init($options){
            foreach($options as $key => $value){
                $this->$key = $value;
            }
        }

        function rules_exist(){
            global $wp_rewrite;

            $has_rules = TRUE;

            foreach($this->rules as $key => $value){
                if(!in_array($value, $wp_rewrite->rules)){
                    $has_rules = FALSE;
                }   
            }

            return $has_rules;
        }

        //to be used add_action with the hook 'wp_head'
        //flushing rewrite rules is labor intense so we better test to see if our rules exist first
        //if the rules don't exist flush its like after a night of drinking  
        function flush_rules(){
            global $wp_rewrite;

            if(!$this->rules_exist()){
                //echo "flushed"; // If want to see this in action uncomment this line and remove this text and you will see it flushed before your eyes
                $wp_rewrite->flush_rules();
            }
        }

        //filter function to be used with add_filter() with the hook "query_vars"
        function add_query_vars($query_vars){

            foreach($this->query_vars as $var){
                $query_vars[] = $var;
            }

            return $query_vars;
        }

        //to be used with a the add_action() with the hook "generate_rewrite_rules"
        function add_rewrite_rules(){
            global $wp_rewrite;

            $wp_rewrite->rules = $this->rules + $wp_rewrite->rules;
        }

    }

}
?>

Ensuite, incluez le fichier dans votre code pour générer vos nouvelles règles de réécriture.

<?php
//-------------------------------------------------
//ADDING REWRITE RULES AND QUERY VARS
//-------------------------------------------------
include('add_rewrite_rules.php');
$options = array(
    'query_vars' => array('state', 'state_destination'),
    'rules' => 
        array(
            '(.+?)/([^/]+)/([^/]+)/?$' => 'index.php?  pagename=$matches[1]&state=$matches[2]&state_destination=$matches[3]'
        )
);
    $rewrite = new Add_rewrite_rules($options);
    add_action('wp_head', array(&$rewrite, 'flush_rules'));
    add_action('generate_rewrite_rules', array(&$rewrite, 'add_rewrite_rules') );
    add_filter('query_vars', array(&$rewrite, 'add_query_vars') );
   //-------------------------------------------------
   //ADDING REWRITE RULES AND QUERY VARS
   //-------------------------------------------------
   ?>

ça devrait être ça, comme je l'ai dit, je l'ai utilisé plusieurs fois lors de la construction de différents plugins, j'espère que ça fonctionne pour vous ..

Marty

3
Marty