Wordpress:类别页面上的自定义 post 类型隔离

Wordpress: Custom post type segregation on Category page

我有两个自定义 post 类型,例如 'Cars' 和 'Bikes'。我使用 Wordpress 的默认类别将 post 归类为两种 post 类型。例如,类别是 'Red'、'Blue' 和 'Black'。

我想在这里实现的是,当我转到 'Red' 的类别页面时,我想看到分类在下面的 'Cars' 和 'Bikes' 'Red'。我正在使用 category.php,这是我正在尝试 运行:

的查询
$car_args = array(
                    'posts_per_page'   => -1,
                    'orderby'          => 'date',
                    'order'            => 'DESC',
                    'post_type'        => 'cars',
                    'post_status'      => 'publish',
                    'cat'              => $cat
                );

                // The Query
                $car_query = new WP_Query( $car_args );

                // The Loop
                if ( $car_query ->have_posts() ) {
                echo "<h3>Cars</h3>";
                    while ( $car_query->have_posts() ) {
                        $car_query->the_post();
                        echo get_post_type() . '<a href="'. get_permalink() .'">' . get_the_title() . '</a><br />';
                    }
                } else {
                    // no posts found
                }

$bikes_args = array(
                    'posts_per_page'   => -1,
                    'orderby'          => 'date',
                    'order'            => 'DESC',
                    'post_type'        => 'bikes',
                    'post_status'      => 'publish',
                    'cat'              => $cat
                );

                // The Query
                $bikes_query = new WP_Query( $bikes_args );

                // The Loop
                if ( $bikes_query ->have_posts() ) {
                echo "<h3>Bikes</h3>";
                    while ( $bikes_query->have_posts() ) {
                        $bikes_query->the_post();
                        echo get_post_type() . '<a href="'. get_permalink() .'">' . get_the_title() . '</a><br />';
                    }
                } else {
                    // no posts found
                }

                /* Restore original Post Data */
                wp_reset_postdata();

查询中的$cat获取'Red'个类别的类别id。这两个查询都正确地通过 'Red' 类别限制了 posts,但是 'Cars' post 类型和 'Bikes' [=] 中的 posts 32=] 类型出现,即使我试图通过 post 类型进行限制。我在几篇文章中读到 Wordpress 忽略了类别页面上的 post 类型参数。这是真的吗?如果是,是否有解决方法?

您尝试执行的操作仅适用于一个查询,并且仅适用于没有任何自定义查询的主查询。

首先,让我们先将您的自定义 post 类型添加到您的类别页面。默认情况下,自定义 pist 类型从类别页面中排除。所以我们需要通过 pre_get_posts 将其手动添加到主查询参数中。将以下内容添加到您的 functions.php:(注意事项:未经测试并且还需要 PHP 5.3+

add_action( 'pre_get_posts', function ( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_category() ) {
        $q->set( 'post_type', array( 'post', 'cars', 'bikes' ) ); // Change this according to your post types
        $q->set( 'nopaging', true ); // This will get all posts, same as posts_per_page=-1
    }
});

您现在应该在您的类别页面上拥有来自点击类别的所有 post 是您设置的 post 类型。

接下来,我们需要整理您的循环。删除 category.php 中的所有自定义查询并将其替换为默认循环。正如您希望按 post 类型排序的两个块,我们将使用 rewind_posts() 这样我们就可以 运行 循环两次

if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        if ( $post->post_type == 'cars' ) { //Change accordingly to only show cars in this loop

            // Your loop

        }
    }

    rewind_posts();

    while ( have_posts() ) {
    the_post();

        if ( $post->post_type == 'bikes' ) { // Change accordingly to only show bikes

            // Your loop

        }
    }
}

这现在应该在按 post 类型

排序的两个块中显示您的 post