Question

Je dois implémenter une liste d'un post_type personnalisé qui doit pouvoir les filtrer selon deux taxonomies,

j'ai trouvé cette réponse cela aide avec le wp_query syntaxe

Ma question est la suivante : à quoi devrait ressembler l'URL ?

Le post_type : ad et les taxonomies sont area et category

L'URL des messages actuels est :

/category/bikes qui fonctionne

ou

/ads/area/area-5 qui fonctionne

Mais comment générer le slug pour la page sur laquelle est filtré category==bikes et area==area-5 ?

-MODIFIER-

En dehors de wp, je réécrirais quelque chose comme ceci (pour cet exemple) :

/ads/(bikes|cars)/(area-5|area-3)

à:

/posts.php?type=ads&category=bikes&area=area-5

Mais je ne vois pas comment contourner ce problème dans wp

Des idées?

merci!

Était-ce utile?

La solution

Je viens de sortir aujourd'hui un plugin nommé Cortex, disponible gratuitement sur GitHub.Vous avez besoin PHP5.4+ et Compositeur pour l'installer (documents).

Ce plugin permet d'écrire des 'routes' personnalisées vers les requêtes, il est basé sur Composant de routage Symfony donc le mécanisme d'ajout de routes est similaire à celui-là.

Ici vous trouverez une documentation complète pour Cortex.

Pour utiliser Cortex, tout ce dont vous avez besoin est un itinéraire simple :

add_action( 'brain_loaded', function() {

  Brain\Routes::add( '/ads/{cat}/{area}', 'cat_area_ad' )
  ->requirements( [ 'cat' => '[a-z]+', 'area' => 'area-[0-9]+' ] )
  ->query( function( $matches ) {
    return [
       'post_type' => 'ad',
       'tax_query' => [
          'relation' => 'AND',
          [
            'taxonomy' => 'category',
            'terms'    => [ $matches['cat'] ],
            'field'    => 'slug'
          ],
          [
            'taxonomy' => 'area',
            'terms'    => [ $matches['area'] ],
            'field'    => 'slug'
          ]
       ]
    ];
  } );

} );

"cat_area_ad" est un identifiant que j'ai attribué à la route, qui permet de créer facilement l'URL de la route (voir Documents Cortex):

function get_cat_area_url( $cat = '', $area = '' ) {
  if ( did_action( 'parse_request' ) && ! empty( $cat ) && ! empty( $area ) ) {
    if ( strpos( $area, 'area-' ) !== 0 ) {
      $area = 'area-' . $area;
    }
    return Brain\Routes::url( 'cat_area_ad',  [ 'cat' => $cat, 'area' => $area ] );
  } else {
    return home_url();
  }
}

La fonction précédente permet d'obtenir une URL pour l'itinéraire, mais la zone et la catégorie doivent être passées comme arguments de fonction.

Une fois lu OP, il semble que les termes "zone" soient nommés sous la forme "area-XX" (où 'XX' est un nombre) J'ai fait en sorte que l'itinéraire nécessite ce format et j'ai également fait get_cat_area_url La fonction ajoute automatiquement "area-" à la chaîne de zone passée en argument (si elle n'est pas déjà présente), vous pouvez donc l'utiliser comme ceci :

$url = get_cat_area_url( 'bikes', '5' );
echo $url; // will be: example.com/ads/bikes/area-5

get_cat_area_url la fonction ne fonctionne correctement que si 'parse_request' crochet ont été déclenchés (en raison d'une limitation de Méthode API Cortex url()), mais dans n'importe quel fichier modèle, vous pouvez l'utiliser sans problème car lorsqu'un modèle est affiché, ce hook a toujours été déclenché.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top