web-dev-qa-db-fra.com

Comment réécrire une URL de type publication personnalisée pour profondément

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);
}
1
jochem

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);
}
1
jochem

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]

0
David Kemp