web-dev-qa-db-fra.com

Page de catégorie affichant uniquement les publications d'un type personnalisé

Situation

J'ai deux cpt:

  1. Projets
  2. Travaux

Dans ces deux CPT, je partage la même taxonomie 'Catégorie' et les mêmes termes:

  1. Architecture
  2. Landscape
  3. Design d'intérieur

J'ai des URL comme

projects/architecture
works/architecture
so on...

Problème

Maintenant, le problème est que les deux URL ci-dessus renvoient le même contenu, toutes les archives du terme architecture, quel que soit le cpt.

Existe-t-il un moyen pour que projects/architecture renvoie uniquement tous les articles sous projets avec pour terme architecture ?

Remarque

J'utilise un type de message personnalisé Permaliens pour utiliser un lien permanent mis en forme comme /cpt/term/post_title

Modifier

Voici mon template de catégorie (category.php)

<?php get_header(); ?>
<!-- info about the category -->
<?php
  /* Queue the first post, that way we know
   * what date we're dealing with (if that is the case).
   *
   * We reset this later so we can run the loop
   * properly with a call to rewind_posts().
   */
  if ( have_posts() )
    the_post();
?>

          <h1 class="page-title"><?php
              _e( ucwords($post->post_type), 'boilerplate' );
          ?></h1>
<?php
  /* Since we called the_post() above, we need to
   * rewind the loop back to the beginning that way
   * we can run the loop properly, in full.
   */
  rewind_posts();
  /* Run the loop for the archives page to output the posts.
   * If you want to overload this in a child theme then include a file
   * called loop-archives.php and that will be used instead.
   */
  ?>
  <ul class='large-block-grid-4 small-block-grid-3 listWrap'>
    <?php
   get_template_part( 'loop', 'category' );
   ?>
 </ul>
   <?php
?>

<?php get_footer(); ?>

Voici ma boucle de catégorie (loop-category.php)

<?php while ( have_posts() ) : the_post(); ?>
  <?php
  $attachments = get_posts( array(
    'post_type' => 'attachment',
    'post_parent' => $post->ID,
    'orderby' => 'menu_order',
    'order' => 'ASC',
    'numberposts'     => 1
    ) );
    ?>
    <?php $img = wp_get_attachment_image_src($attachments[0]->ID, 'full');?>
    <li class='listwp equalize'>
      <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" class='th'>
        <img src='<?php echo $img[0]; ?>'>
        <?php $categories = get_the_terms($post->ID, 'category'); ?>
        <div>
          <span>
            <?php foreach($categories as $category): ?>
            <?php echo $category->name; ?>
          <?php endforeach; ?>
        </span>
      </div>
    </a>
    <h2><?php the_title(); ?></h2>

  </li>
<?php endwhile; ?>
2
Jonathan de M.

Ok, j'ai trouvé une solution en suivant les recommandations de s_ha_dum d'utiliser pre_gets_posts.

Tout le code suivant va à functions.php

1 Créer une nouvelle règle de réécriture

function rewrite_clean()
{
  // my CPTs
  $types = array('projects', 'works');
  foreach($types as $type)
  {
    add_rewrite_rule('^'.$type.'/([^/]*)/?$', 'index.php?post_type='.$type.'&term=$matches[1]','top');
  }
}

add_action('init', 'rewrite_clean');

transformer le format suivant

? post_type = projets & term = architecture

au format suivant

projets/architecture

2 Ecraser la requête post

// check the vars in url and if there is term then only display from this term
function add_cat_cpt_filter($query)
{
  if($query->is_archive() && get_query_var( 'term' )  && get_query_var( 'post_type' ))
  {
    // get the id of the category by using the slug
    $id = get_category_by_slug(get_query_var( 'term' ))->term_id;
    if($id){
      // add a filter to the query
      $query->set('cat', $id);
    }
    else{
      // redirect if the term doesn't exist
      wp_redirect( '/'.get_query_var( 'post_type' ));
      exit;
    }
    return;
  }
}
add_action( 'pre_get_posts', 'add_cat_cpt_filter' );

Le code ci-dessus va filtrer la page d'archive actuelle avec le terme utilisé dans l'URL.

Je t'ai eu

Ensuite, j'ai eu un problème en raison du plugin Custom Post Type Permalinks, il continuait à afficher un modèle de catégorie alors que je voulais conserver mon modèle d'archive CPT et simplement y ajouter un filtre.

La solution est simplement de désactiver et de réactiver le plugin, cela a fonctionné pour moi.

1
Jonathan de M.