J'ai ce code qui réécrit l'URL pour les posttypes personnalisés. Cela fonctionne, mais seulement pour une profondeur où le post-titre est sur le 5ème segment. Comment puis-je l'ajuster afin qu'il accepte plusieurs profondeurs?
par exemple.:
http://www.mydomain.com/post_type/category1/postname/
http://www.mydomain.com/post_type/category1/child1/postname/
http://www.mydomain.com/post_type/category1/child1/child2/postname/
http://www.mydomain.com/post_type/category1/child1/child2/child3/postname/
j'ai essayé d'ajouter:
$newRules['product/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[3]';
Mais cela n'a pas fonctionné, car une erreur 404 s'est produite lors de la navigation dans la profondeur de l'enfant3 dans la structure d'exemple ci-dessus.
Code actuel:
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]';
// The above structure only works if the postname is the 5th uri segment
// e.g. http://www.mydomain.com/post_type/category1/child1/child2/child3/postname/
$newRules['product/(.+)/?$'] = 'index.php?pcategory=$matches[1]';
return array_merge($newRules, $rules);
}
[UPDATE1]
Cela ne fonctionnera pas non plus si je change le code en ifs et elseif's. Avec elseif
, seule la règle supérieure est ajoutée et, par conséquent, je ne peux parcourir que les produits dont le post-titre est le cinquième segment de l'URL. Avec if
toutes les règles sont ajoutées mais je ne peux pas parcourir les catégories avec une profondeur de 2,3 et 4 mais vous pouvez parcourir les produits dans les profondeurs où l'URL est dans le segment 3,4 et le 5ème
function mmp_rewrite_rules($rules) {
$newRules = array();
if ('index.php?products=$matches[4]'){
$newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]';
}
elseif ('index.php?products=$matches[3]'){
$newRules['product/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[3]';
}
elseif ('index.php?products=$matches[2]'){
$newRules['product/(.+)/(.+)/?$'] = 'index.php?products=$matches[2]';
}
// The above structure only works of the postname is the 5th uri segment
$newRules['product/(.+)/?$'] = 'index.php?pcategory=$matches[1]';
return array_merge($newRules, $rules);
}
Après avoir testé d'innombrables structures différentes, je suis arrivé à cela. C'est un travail manuel en spécifiant chaque catégorie mais me donne plus de contrôle.
Si quelqu'un propose une meilleure solution, s'il vous plaît faites le moi savoir.
function mmp_rewrite_rules($rules) {
//Product structure
$newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]';
//The above structure only works of the postname is the 5th uri segment
//It's more flexible to confugure the depths for each category below
$newRules['product/televisies/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[3]';
$newRules['product/sports/(.+)/?$'] = 'index.php?products=$matches[1]';
//Category rule
$newRules['product/(.+)/?$'] = 'index.php?pcategory=$matches[1]';
return array_merge($newRules, $rules);
}
Il y a un problème avec votre regex:
product/(.+)/(.+)/(.+)/(.+)/?$
La partie .+
dit de faire correspondre autant de choses que possible. Le tout peut inclure /
'.
Si vous avez utilisé quelque chose comme
product/([^/]+/)+([^/]+)/?$
en décomposant cela, nous avons:
product/
qui correspond à product/
([^/]+/)+?
- qui correspond le moins possible, mais au moins 1, slug/
éléments (la partie [^/]
indique une correspondance avec tout ce qui n'est pas un /
)([^/]+)/?$
qui correspond à une slug
, éventuellement suivie d'un /
, à la fin de la ligne (ce que signifie $
.Le type de message sera alors dans $ correspondances [2]