web-dev-qa-db-fra.com

Combinaison de plusieurs taxonomies dans une URL

Je crée un site complexe avec un catalogue de produits avec deux taxonomies personnalisées. Ce sont des marques et des types.

Marques - Canon - Toshiba - HP

Types - Imprimantes - Scanners - Multifonctions

J'ai besoin d'une page qui répertorie tous les produits combinant une marque et un type. La marque est la plus importante des deux; elle devrait donc être filtrée par Marque -> Type (bien que ce serait idéal si cela était interchangeable).

Je peux le faire en modifiant la requête en fonction d'un paramètre que j'ajoute à la fin de l'URL. Par exemple, cette URL pourrait être l’une des suivantes:

Mais on m'a dit que ce n'était pas bon pour le référencement. Idéalement, j'aimerais que l'URL soit structurée comme suit: http://www.example.com/brand/type/ . Cela se traduirait par des URL du type:

Oui, je sais que je pourrais mettre en place des sous-catégories pour chaque type de produit sous chaque marque, mais je dois aussi pouvoir afficher tous les produits sous chaque type de produit sans rapport avec la marque.

À propos, si l'URL doit être un peu plus complexe (c'est-à-dire/marque/hp/type/multifonction /), c'est mieux que rien.

Y a-t-il des trucs avec des permaliens que je pourrais faire pour que les liens soient structurés de la manière dont j'ai besoin?

UPDATE 10/23/15: Je viens de passer une heure à essayer de diagnostiquer pourquoi cela n’a plus fonctionné sur le site que j’avais construit. Il est apparu que je remplaçais la requête par défaut par une requête personnalisée sur l'un des modèles d'archive de taxonomie. Pour lutter contre cela, vous pouvez faire ce qui suit:

<?php $tax_query = $wp_query->query_vars; ?>
<?php
if ($tax_query["types"] && $tax_query["brands"]) {
    // default query stuff here
} else {
    // custom query stuff here
}
?>
6
JacobTheDev

Cette règle de réécriture devrait fonctionner (en supposant que "marque" et "type" sont les noms enregistrés de taxonomie):

function custom_rewrite_rules() {
    add_rewrite_rule('^brand/(.*)/type/(.*)?', 'index.php?brand=$matches[1]&type=$matches[2]', 'top');
}
add_action('init', 'custom_rewrite_rules');

N'oubliez pas de vider les règles de rewirte après avoir enregistré ce code sur votre site.

Ensuite, vous devrez vous connecter à plusieurs endroits pour réparer choses. Par exemple, vous devrez peut-être accrocher wp_title pour générer le titre correct du document, par exemple "Imprimantes HP" ou simplement "HP", car cela ne sera pas géré automatiquement par WordPress. Je ne peux pas vous donner une liste exhaustive des choses dont vous aurez besoin pour réparer .

8
cybmeta

En creusant pour répondre celui-ci , j'ai trouvé ici la fonction de réécriture suivante:

function eg_add_rewrite_rules() {
  global $wp_rewrite;
  $new_rules = array(
      'user/(profession|city)/(.+?)/(profession|city)/(.+?)/?$' => 'index.php?post_type=eg_event&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2) . '&' . $wp_rewrite->preg_index(3) . '=' . $wp_rewrite->preg_index(4),
      'user/(profession|city)/(.+)/?$' => 'index.php?post_type=eg_event&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2)
  );
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'eg_add_rewrite_rules' );

cette fonction prend une URL du type exemple.com/user/profession/designer,knight/city/athens,gotham/ et la convertit en variables:

$proffession = "designer,knight";
$city = "athens,gotham";

qui peut être utilisé dans le taxonomy.php

Plus d'infos: https://stackoverflow.com/a/34624138/5594521

Démo de travail: http://playground.georgemanousarides.com/

J'espère que ça aide!

2
gmanou