如何显示相关自定义分类中的自定义帖子

时间:2012-09-04 05:04:30

标签: wordpress taxonomy custom-post-type custom-taxonomy

我创建了两种不同的自定义帖子类型:“视频”和“地点” 然后我创建了一个名为“Video_Categories”的自定义分类 我已将此自定义分类标准分配给两种自定义帖子类型。

我想要做的是在地点上显示彼此具有相同字词的视频。

例如:

视频帖子

  • 姓名:视频1; Video_Category:昆士兰布里斯班;
  • 姓名:视频2; Video_Category:昆士兰州黄金海岸;
  • 姓名:视频3; Video_Category:昆士兰州阳光海岸;

位置信息:

  • 姓名:布里斯班; Video_Category:布里斯班;

我想从“位置”页面创建一个查询,该查询会查看此帖子的分类,并返回具有相同分类的视频帖子。

在上面的例子中,“视频1”视频文章将被返回并显示在位置页面上。

1 个答案:

答案 0 :(得分:2)

好问题,这与获取相关类别或标签略有不同,但仍使用类似的前提。有几种方法可以做到这一点,但最简单的方法之一可能是使用利用WP_Query的自定义函数。将以下代码添加到functions.php文件中。

// Create a query for the custom taxonomy
function related_posts_by_taxonomy( $post_id, $taxonomy, $args=array() ) {
    $query = new WP_Query();
    $terms = wp_get_object_terms( $post_id, $taxonomy );

    // Make sure we have terms from the current post
    if ( count( $terms ) ) {
        $post_ids = get_objects_in_term( $terms[0]->term_id, $taxonomy );
        $post = get_post( $post_id );
        $post_type = get_post_type( $post );

        // Only search for the custom taxonomy on whichever post_type
        // we AREN'T currently on
        // This refers to the custom post_types you created so
        // make sure they are spelled/capitalized correctly
        if ( strcasecmp($post_type, 'locations') == 0 ) {
            $type = 'videos';
        } else {
            $type = 'locations';
        }

        $args = wp_parse_args( $args, array(
                'post_type' => $type,
                'post__in' => $post_ids,
                'taxonomy' => $taxonomy,
                'term' => $terms[0]->slug,
            ) );
        $query = new WP_Query( $args );
    }

    // Return our results in query form
    return $query;
}

显然,您可以更改此功能中的任何内容,以获得您正在寻找的确切结果。请查看http://codex.wordpress.org/Class_Reference/WP_Query以获取进一步参考。

有了这个功能,您现在可以访问related_posts_by_taxonomy()功能,您可以在其中传递您想要查找相关帖子的分类。因此,在您的single.php或用于自定义帖子类型的模板中,您可以执行以下操作:

<h4>Related Posts</h3>
<ul>
<?php $related =  related_posts_by_taxonomy( $post->ID, 'Video_Categories' );
    while ( $related->have_posts() ): $related->the_post(); ?>
        <li><?php the_title(); ?></li>
    <?php endwhile; ?>
</ul>