私は2 cptを持っています:
これら2つのCPTでは、同じ分類法「カテゴリ」と同じ用語を使用しています。
私はのようなURLがあります
projects/architecture
works/architecture
so on...
問題は、上の2つのURLが同じコンテンツを返していることです。cptにかかわらず、アーキテクチャという用語のすべてのアーカイブです。
projects/architecture
がtermアーキテクチャーでプロジェクトの下のすべての投稿を返すだけの方法はありますか?
私は/cpt/term/post_title
のようなフォーマットのパーマリンクを使うために カスタム投稿タイプパーマリンク を使っています
これが私のカテゴリテンプレートです(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(); ?>
これが私のカテゴリループです(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; ?>
わかりました私はpre_gets_postsを使うために s_ha_dum の推薦に従うことによって解決策を見つけました。
以下のコードはすべて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');
次の形式に変換する
?post_type =プロジェクトとterm =アーキテクチャ
次のフォーマットに
プロジェクト/アーキテクチャ
// 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' );
上記のコードはURLで使用されている用語で現在のアーカイブページをフィルタリングします。
それから私はCustom Post Type Permalinks
プラグインによる問題を抱えていました、それは私が私のCPTアーカイブテンプレートを保ち、そして単にそれにフィルタを加えたい間、それはカテゴリテンプレートを表示し続けました。
解決策は単にプラグインを無効にしてから再び有効にすることです、それは私にとってトリックをしました。