J'utilise woocommerce et j'ai quelques "attributs de produit" qui ne sont que des taxonomies.
J'ai les taxonomies suivantes:
le pa_ représente l'attribut du produit et il est intégré à WooCommerce qui gère ces taxonomies, donc je ne peux rien y changer.
WooCommerce est également livré avec des taxonomies de catégories de produits (product_cat) et de balises de produits (product_tag).
la requête suivante me permet d'obtenir tous les produits rouge, vinyle de la catégorie de produit Tissus
? product_cat = tissus & pa_material = vinyle & pa_color = rouge
Je voudrais en faire un joli lien permanent, quelque chose comme:
catégorie de produit/tissus/matériau/vinyle/couleur/rouge
Cette réponse me rapproche de ce que j'essaie de réaliser:
Règles de réécriture d'URL pour plusieurs taxonomies, requête
en ce sens que je peux obtenir mon URL pour gérer 2 taxonomies (taxonomie de product_cat + 1 attribut), mais je ne sais pas comment obtenir 3 paramètres (ou plus).
Donc je peux avoir:
/ catégories de produits/tissus/coloris/rouge
ou
/ catégorie de produit/tissu/matériau/vinyle
mais pas tous les 3 ensemble
/ catégorie de produit/tissu/matériau/vinyle/couleur/rouge
modifier/bien que je pense que ce serait l'idéal d'avoir l'URL soit
/ tissus/vinyle/rouge
je ne suis pas sûr que c'est possible?
fin éditer /
WooCommerce a également quelques paramètres pour modifier les liens permanents (par exemple, ajouter l'URL avec 'shop' ou changer le slug de catégorie de produit). Je devrai donc en rendre compte à la fin, mais pour le moment, je dois obtenir cette première étape.
pour simplifier, ceci est une version allégée de mon code. En fait, les taxonomies sont générées par les fonctions woocommerce intégrées, mais la question ne se limite pas au woocommerce ... car il s’agit de tout site comportant beaucoup de taxonomies.
add_action( 'init', 'wpa_init' );
function wpa_init() {
$taxonomies = array ('pa_color'=>'Color','pa_material'=>'Material','pa_style'=>'Style');
$base = 'product-category';
foreach ($taxonomies as $taxonomy=>$mask):
$attribute = strtolower(sanitize_title($mask));
add_rewrite_rule( $base.'/(.+?)/'.$attribute.'/([^/]+)(/page/(\d+))?/?$', 'index.php?product_cat=$matches[1]&'.$taxonomy.'=$matches[2]&paged=$matches[4]', 'top' );
endforeach;
}
c'était la meilleure ressource que j'ai trouvée sur les permaliens de requête de taxonomie: http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/
mais elle aussi semble coincée à 2 taxonomies.
Vous pouvez essayer quelque chose comme ça:
function custom_rewrite( $wp_rewrite ) {
$feed_rules = array(
'product-category/(.+)/material/(.+)/color/(.+)' => 'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2).'&pa_color='. $wp_rewrite->preg_index(3)
'product-category/(.+)/color/(.+)' => 'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_color='. $wp_rewrite->preg_index(2)
'product-category/(.+)/material/(.+)' => 'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2)
);
$wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );
Il se peut que cela ne fonctionne pas exactement comme annoncé et que vous deviez peut-être modifier certaines expressions rationnelles, mais c'est en gros ce qu'il faut faire (90% du travail).
Vous devrez vider les liens permanents si vous ajoutez/modifiez/supprimez ce code, placez-le dans functions.php ou dans un plugin personnalisé. Vous pouvez vider les permaliens en allant simplement dans la zone admin et en ré-enregistrant les permaliens.
Sidenote, vous pouvez rencontrer des problèmes conflictuels si vous commencez à utiliser les hiérarchies,
par exemple. Si vous avez un t-shirt/petit et une robe/petite catégorie et que vous utilisez une URL telle que/produits-catégorie/petit/couleur/rouge, vous n'obtiendrez peut-être pas les résultats escomptés, par exemple. petits t-shirts? ou avez-vous dire petites robes?
Alors méfiez-vous de l'ambiguïté
Pour référence future (comme l'année prochaine, lorsque je recherche une nouvelle question sur Google), vous pouvez convertir cette syntaxe en syntaxe add_rewrite_rule()
en convertissant les clés du tableau $new_rules
en paramètre $ regex de add_rewrite_rule()
avec la valeur $ rewrite et 'top'. comme la position $.
add_rewrite_rule($regex,$rewrite, $position);
Ou comme exemple d'une de mes demandes d'en haut:
function custom_rewrite() {
add_rewrite_rule(
'product-category/(.+?)/material/(.+?)/?$',
'index.php?product_cat=matches[1]&pa_material=$matches[2]',
'top'
);
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_action( 'init', 'custom_rewrite' );
Pour une raison quelconque, je n’ai pas réussi à utiliser regenerate_rewrite_rules
en tant que filtre/crochet, et est donc passé à init.