web-dev-qa-db-fra.com

Comment puis-je filtrer par taxonomie sur la page d'un type d'article personnalisé?

À l’heure actuelle, les catégories en rapport sont affichées dans le type de publication actuellement affiché, comme indiqué ci-dessous. J'utilise wp_list_categories pour lister les catégories et cela fonctionne très bien. Le seul problème est que cela est affiché sur archive.php et non pas un seul post. Les taxonomies répertoriées sont donc liées à leurs archives de taxonomie principales.

J'aimerais créer un lien vers l'archive de taxonomie pour le type de message actuel ($type) et inclure la requête pour afficher cette taxonomie spécifique. Semblable à un lien vers http://example.com?post_type=foo&custom_tax=bar

<? $type = get_post_type(); ?>
                <?php 

                $customPostTaxonomies = get_object_taxonomies($type);

                if(count($customPostTaxonomies) > 0)
                {
                echo '<h3>Browse By:</h3>';
                     foreach($customPostTaxonomies as $tax)
                     {
                         $args = array(
                              'orderby' => 'name',
                              'show_count' => 0,
                              'pad_counts' => 0,
                              'hierarchical' => 1,
                              'taxonomy' => $tax,
                              'title_li' => ''
                            );
                         $woah = get_taxonomy($tax);
                        echo '<ul>';
                        //var_dump($tax);
                        //var_dump($woah);
                        //print_r($woah);
                        echo '<h4>'.$woah->labels->name.'</h4>';
                        echo wp_list_categories( $args );
                        echo '</ul>';
                     }
                }

                ?>`
1
neoian

wp_list_categories utilise get_term_link pour récupérer le lien de termes.

Cette fonction a un filtre que vous pouvez utiliser pour changer ce qui est retourné. Un problème est que vous devez passer le type de publication actuel à la fonction qui est reliée au filtre, mais une variable globale doit fonctionner pour la portée.

Bien sûr, vous devez supprimer le filtre après tous les appels wp_list_categories, pour ne pas interférer avec la classe nex de get_term_link.

Donc, dans votre functions.php, mettez:

function convert_term_link_to_post_type( $termlink, $term, $taxonomy ) {
  global $the_current_type;
  if ( empty($the_current_type) ) return $termlink;
  $link = get_post_type_archive_link( $the_current_type );
  if ( $taxonomy == 'category') $taxonomy = "category_name";
  if ( $link ) return add_query_arg( array($taxonomy => $term->slug), $link );
  return $termlink;
}

Puis changez le code que vous avez posté comme ceci:

$type = get_post_type();
$customPostTaxonomies = get_object_taxonomies($type);
if( count($customPostTaxonomies) > 0) {
  echo '<h3>Browse By:</h3>';
  // set the global variable
  global $the_current_type;
  $the_current_type = $type;
  // add the filter that convert the term link
  add_filter('term_link', 'convert_term_link_to_post_type', 20, 3);
  foreach($customPostTaxonomies as $tax) {
    $woah = get_taxonomy($tax);
    $args = array(
      'orderby' => 'name',
      'show_count' => 0,
      'pad_counts' => 0,
      'hierarchical' => 1,
      'taxonomy' => $tax,
      'title_li' => ''
    );
    echo '<ul>';
    echo '<h4>' . $woah->labels->name . '</h4>';
    echo wp_list_categories( $args );
    echo '</ul>';
  }
  // unset the global variable
  unset($the_current_type);
  // remove the filter to not alter any other 'get_term_link' calls
  remove_filter('term_link', 'convert_term_link_to_post_type', 20, 3);
}
2
gmazzap