web-dev-qa-db-fra.com

Règles de réécriture pour plusieurs taxonomies (plus de 2)

J'utilise woocommerce et j'ai quelques "attributs de produit" qui ne sont que des taxonomies.

J'ai les taxonomies suivantes:

  • pa_color
  • pa_material
  • pa_style

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.

4
helgatheviking

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é

4
Tom J Nowell

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.

3
helgatheviking