J'ai écrit des règles de réécriture personnalisées pour une fonctionnalité spéciale sur http://www.pewhispanic.org/states/ . States est une page avec un modèle de page personnalisé, page-states.php. La logique pour renvoyer les bonnes données en fonction de la demande est faite ici.
J'ai créé des règles de réécriture personnalisées afin de pouvoir disposer de jolies URL avec des paramètres personnalisés qui sont envoyés à page-states.php. Le code suivant se trouve dans le fichier functions.php de mon themes:
//Rewrites for the States and Counties Database
function filter_statedb_rewrite_rules( $wp_rewrite ) { //Lets us have URLs like /states/state/md/ etc.
$statedb_rewrite_rules = array(
"states/counties/([a-zA-z]{2})/?$" => "index.php?pagename=states&counties=" . $wp_rewrite->preg_index(1),
"states/county/(\d+)/?$" => "index.php?pagename=states&countyid=" . $wp_rewrite->preg_index(1),
"states/state/([a-zA-z]{2})/?$" => "index.php?pagename=states&stateid=" . $wp_rewrite->preg_index(1)
);
$wp_rewrite->rules = $statedb_rewrite_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'filter_statedb_rewrite_rules');
function kill_statesdb_canonical_redirect($redirect_url, $requested_url) {
global $wp;
$statedb_rewrite_rules = array(
"states/counties/([a-zA-z]{2})/?$",
"states/county/(\d+)/?$",
"states/state/([a-zA-z]{2})/?$"
);
if( in_array($wp->matched_rule, $statedb_rewrite_rules) ) {
return false;
} else {
return $redirect_url;
}
}
add_filter('redirect_canonical', 'kill_statesdb_canonical_redirect', 10, 2);
function add_statedb_query_vars($query_vars) {
$query_vars[] = 'counties';
$query_vars[] = 'countyid';
$query_vars[] = 'stateid';
return $query_vars;
}
add_filter( 'query_vars', 'add_statedb_query_vars' );
Pour une raison quelconque, les règles de réécriture ne parviennent pas à coller parfois (je déteste quand les choses ne fonctionnent que parfois). Je visite les paramètres -> liens permanents pour vider les règles de réécriture et tout fonctionne très bien. Quelques jours plus tard, je reçois un courrier électronique disant que des pages telles que http://www.pewhispanic.org/states/state/md/ sont de retour. un 404. Merde. Je vais vider les règles de réécriture et tout va bien à nouveau.
Qu'est-ce que j'oublie ici? Pourquoi mes règles de réécriture personnalisées ne sont-elles parfois pas appliquées? Existe-t-il une meilleure action que generate_rewrite_rules
à laquelle s’accrocher? Ai-je même besoin de jouer avec le filtre redirect_canonical
? Je pense que ça ne fait rien.
Toute idée serait très appréciée.
Je ne suis pas tout à fait sûr pourquoi cela se produit mais je l’ai aussi vu. Dans mon plugin Aperçu rapide des numéros abrégés Opera , je devais également ajouter les règles de réécriture sur init
- ce qui le corrigeait.
Parfois, d’autres plugins ou des visites ultérieures de la page de permalien peuvent réinitialiser vos rôles personnalisés… me rappelle d’écrire un plugin de journalisation pour cela, car WordPress ne le fait pas nativement.