Wordpress:如何在类别归档页面中包含使用自定义帖子类型UI(CPT UI)制作的自定义帖子类型?

时间:2016-11-20 18:22:35

标签: php wordpress custom-post-type archive categories

我创建了四种自定义帖子类型 - 视频,音频,程序,博客 - 以及各种自定义字段,我设法创建了一个自定义存档页面,根据帖子类型显示某些自定义字段。仅查看特定自定义帖子类型的存档时,存档页面才能正常运行。我遇到的问题是类别的存档页面。

每种自定义帖子类型都可以访问全局“帖子”类别,因此我的所有类别都会显示在每种帖子类型中。我希望能够查询类别并显示相关帖子,无论帖子类型如何。即“商业”类别可以提取两个视频,一个音频帖子和一个博客。问题是我的类别页面现在是空的。

这是我在'archive.php'中的当前循环:

<?php
if ( have_posts() ) : ?>


<div class="container">

    <div class="row">

        <?php
        /* Start the Loop */
        while ( have_posts() ) : the_post();

            get_template_part( 'template-parts/content-archive', get_post_format() );

        endwhile;

        the_posts_navigation(); ?>

    </div><!-- .row -->

</div><!-- .container -->

<?php endif; ?>

这会抓取存档内容'content-archive.php'的模板:

<?php
/**
 * Get featured posts from Archives 
 */

if( is_post_type_archive( 'videos' ) ) {

    $video_image = get_field( 'video_still_image' ); 
    print_archive_post($video_image);

} elseif( is_post_type_archive( 'programs') ) {

    $program_featured_image = get_field('program_featured_image');
    print_archive_post($program_featured_image);

} elseif( is_post_type_archive( 'audio') ) {

    $audio_featured_image = get_field('audio_featured_image');
    print_archive_post($audio_featured_image);

} elseif( is_post_type_archive( 'blogs') ) {

    $blog_featured_image = get_field('blog_featured_image');
    print_archive_post($blog_featured_image);

}

?>

而且,这是来自'functions.php'的函数来构建帖子的内容:

// Function to print archive type posts
function print_archive_post($image) {

  echo '<div class="col-md-4 featured-thumb-container">';
    echo '<a href="' . get_the_permalink() . '"><span class="featured-thumb" style="background: url(' . $image . ')"></span></a>';
    echo '<h3><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></h3>';

    // The category list
    $post_cats= array();
    $categories = get_the_category();

    echo '<p class="category-list">';

      foreach($categories as $cat) :
        echo '<a class="category-link" href="' . get_home_url() . '/category/' . $cat->slug . '">' . $cat->cat_name . '</a><span>,</span> ';
      endforeach;

    echo '</p>';

  echo '</div>';

}

我知道我错过了检查类别的条件,但我无法在我的研究中找到解决方案。任何帮助将不胜感激。 :)

2 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了您的问题。如果要查询与一个类别相关的所有自定义帖子,可以在存档页面中使用WP_Query

  //if you're on a category archive, it will return the category object
  $category_object = get_queried_object();
  $args = array(
      'post_type' => 'your-cpt',
      'cat' => $category_object->term_id
  );

  $wp_query = new WP_Query( $args );

  if ( $wp_query->have_posts() ) {

    while ( $wp_query->have_posts() ) {   
        $wp_query->the_post();
        //echo your posts
    }

  } else {
      // aww, no posts... do other stuff
  }
  wp_reset_postdata();

答案 1 :(得分:0)

因此,经过一些研究,我找到了解决方案。我需要将自定义帖子类型添加到Wordpress的内置类别和标签中。这是我添加到functions.php文件中的代码:

// Add custom post types to default WP categories and tags
function add_custom_types_to_tax( $query ) {
    if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {

        // Get all your post types
        $post_types = get_post_types();

        $query->set( 'post_type', $post_types );
        return $query;
    }
}
add_filter( 'pre_get_posts', 'add_custom_types_to_tax' );

我在这里找到了代码:https://premium.wpmudev.org/blog/add-custom-post-types-to-tags-and-categories-in-wordpress/

此外,我仅为类别档案创建了category.php文件。我使用了与archive.php文件相同的代码,但我换了一个类别内容的新模板文件:&#39; content-category-archive.php&#39;。这是该模板的代码:

<?php
/**
 * Get featured posts from Category Archives 
 */

if( get_post_type() == 'videos' ) {

    $video_image = get_field( 'video_still_image' ); 
    print_archive_post($video_image);

} elseif( get_post_type() == 'programs' ) {

    $program_featured_image = get_field('program_featured_image');
    print_archive_post($program_featured_image);

} elseif( get_post_type() == 'audio' ) {

    $audio_featured_image = get_field('audio_featured_image');
    print_archive_post($audio_featured_image);

} elseif( get_post_type()== 'blogs' ) {

    $blog_featured_image = get_field('blog_featured_image');
    print_archive_post($blog_featured_image);

}

?>

这与我的其他&#39; content-archive.php&#39;之间存在差异。模板是每种帖子类型的条件。我现在使用is_post_type_archive('my custom post type')检查当前类别中每个帖子的帖子类型,而非检查get_post_type() == 'my custom post type'

我希望这有助于其他可能遇到同样问题的人。 :)