J'ai deux cpt:
Dans ces deux CPT, je partage la même taxonomie 'Catégorie' et les mêmes termes:
J'ai des URL comme
projects/architecture
works/architecture
so on...
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 ?
J'utilise un type de message personnalisé Permaliens pour utiliser un lien permanent mis en forme comme /cpt/term/post_title
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; ?>
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
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
// 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.
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.