web-dev-qa-db-ja.com

カスタムタイプの投稿のみを表示するカテゴリページ

状況

私は2 cptを持っています:

  1. プロジェクト
  2. 作品

これら2つのCPTでは、同じ分類法「カテゴリ」と同じ用語を使用しています。

  1. 建築
  2. Landscape
  3. インテリア・デザイン

私はのような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; ?>
2
Jonathan de M.

わかりました私はpre_gets_postsを使うために s_ha_dum の推薦に従うことによって解決策を見つけました。

以下のコードはすべてfunctions.phpに行きます

1新しい書き換えルールを作成する

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 =アーキテクチャ

次のフォーマットに

プロジェクト/アーキテクチャ

2ポストクエリを上書きする

// 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アーカイブテンプレートを保ち、そして単にそれにフィルタを加えたい間、それはカテゴリテンプレートを表示し続けました。

解決策は単にプラグインを無効にしてから再び有効にすることです、それは私にとってトリックをしました。

1
Jonathan de M.