web-dev-qa-db-fra.com

Page d'archive avec plusieurs taxonomies réécrites

Ok, j'ai lu à peu près toutes les réponses à cette question, mais ma situation doit être unique.

Ce que je tente de faire est simple en théorie.

  • CPT: ressource
  • Tax1: type_ressource
  • Tax2: industrie

Lorsque j'enregistre le CPT, j'ai défini ce qui suit:

'rewrite' => array(
        'slug' => 'resources/%resource_type%',
        'with_front' => false
    ),

'with_front' => false car la publication standard utilise une base.

J'ai aussi une page de example.com/resources avec un modèle de page-resources.php.

Lors de l'enregistrement de Tax1, j'ai défini les éléments suivants:

'rewrite'  => array( 
        'slug' => 'resources',
        'with_front' => false
    )

J'ai un terme resource_type nommé white-papers.

Cela produit mon premier résultat souhaité d'un lien permanent qui ressemble à example.com/resources/white-papers/ pour une page d'archive de taxonomie utilisant taxonomy-resource_type.php.

C'est là que les choses se compliquent. Ce que je tente de faire est d’ajouter une deuxième taxonomie (Tax2) et de créer une autre page d’archive avec un permalien de:

example.com/resources/white-papers/enterprise

Cette archive est une archive filtrée de toutes sortes dans la mesure où elle ne doit afficher que les publications de resource_type = white-papers AND industry = enterprise.

Au lieu de cela, je reçois 404.

Mais si j'essaye une URL avec une requête de example.com/index.php?post_type=resource&resource_type=white-papers&industry=enterprise, j'obtiens ma page d'archive filtrée souhaitée.

Aussi, et je ne suis pas sûr que cela soit pertinent ou non, mais cette fonction est en cours d'exécution:

function resources_cpt_generating_rule($wp_rewrite) {
  $rules = array();
  $terms = get_terms( array(
    'taxonomy' => 'resource_type',
    'hide_empty' => false,
  ) );

$post_type = 'resource';
foreach ($terms as $term) {    

    $rules['resources/' . $term->slug . '/([^/]*)$'] = 'index.php?post_type=' . $post_type. '&resource_type=$matches[1]&name=$matches[1]';

}
// merge with global rules
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'resources_cpt_generating_rule');

Ce dont j'ai besoin d'aide, ce sont les règles de réécriture pour y parvenir.

Toute aide est grandement appréciée à l'avance!

3
jedifunk

ok, alors j'ai pensé revenir et répondre à ma propre question au cas où cela serait utile à quelqu'un d'autre.

Pour commencer, le CPT:

'query_var' => true,
    'has_archive' => false,
    'rewrite' => array(
        'slug' => 'resources',
        'with_front' => false
    ),

Tax1:

'query_vars' => true,
    'rewrite' => array( 
        'slug' => 'resources/type',
        'with_front' => false
    )

Tax2:

'query_vars' => true,
'rewrite' => array(
        'with_front' => false
    )

Les réécritures:

add_rewrite_rule( '^resources/type/([^/]*)/industry/([^/]*)/?$', 'index.php?post_type=resources&resource_type=$matches[1]&industry=$matches[2]', 'top' );

Cela produit une structure d'URL légèrement différente de celle que j'avais initialement prévue, et bien que ce soit un peu plus détaillé, je pense que cela fonctionne aussi bien.

example.com/resources = page-resources.php

example.com/resources/type/white-papers = taxonomy-resource_type.php pour le terme Tax1 white-papers.

example.com/resources/type/white-papers/industry/enterprise = le même modèle d'archive taxonomy-resource_type.php, mais ne fournit que les résultats CPT de Tax1 AND Tax2.

C’est exactement la fonctionnalité que j’espérais obtenir.

3
jedifunk