在分类中显示多个帖子类型

时间:2013-02-17 作者:Richard Ascough

我有以下自定义帖子类型,它们都链接到destination 分类学

我将如何更改taxonomy-destination.php 文件以显示所有4种帖子类型中的匹配帖子。

例如,当前查看目的地时"los angeles", 它按日期将所有这些内容显示在一起,而不是分为单独的部分。

我更愿意把它们分开,放在最上面,然后是其他内容,而不是全部混合在一起。

如何最好地实现这一点?

1 个回复
SO网友:chrisguitarguy

钩入pre_get_posts, 检查分类,并将所有四种帖子类型设置为post_type 查询对象的参数。查看Type Parameters 关于WP_Query 文档以获取更多信息。

<?php
add_action(\'pre_get_posts\', \'wpse87225_set_post_types\');
function wpse87225_set_post_types($query)
{
    if (is_admin() || !$query->is_main_query() || !is_tax(\'destination\')) {
        return; // bail, not where we want to be
    }

    $query->set(\'post_type\', array(
        \'Deals\', \'Accommodation\', \'Attractions\', \'Articles\'));
}
以上内容可以在您的functions.php 文件,或者更恰当地说,一个插件。

编辑以按要求寻址组:

然而,这不会把他们分开。有几个选项可以做到这一点。首先,您可以只保留主查询(不要执行上述操作),并创建多个WP_Query 并执行多个循环。不错。

你也可以posts_orderby 并更改SQL以按帖子类型以及其他内容对帖子进行排序:

<?php
add_filter(\'posts_orderby\', \'wpse87225_posts_orderby\', 10, 2);
function wpse87225_posts_orderby($orderby, $query)
{
    global $wpdb;

    if (is_admin() || !$query->is_main_query() || !is_tax(\'destination\')) {
        return $orderby;
    }

    $new = "{$wpdb->posts}.post_type ASC";

    if ($orderby) {
        $orderby = $new . \', \' . $orderby;
    } else {
        $orderby = $new;
    }

    return $orderby;
}
您甚至可以在FIELD 作用

<?php
add_filter(\'posts_orderby\', \'wpse87225_posts_orderby\', 10, 2);
function wpse87225_posts_orderby($orderby, $query)
{
    global $wpdb;

    if (is_admin() || !$query->is_main_query() || !is_tax(\'destination\')) {
        return $orderby;
    }

    $new = "FIELD({$wpdb->posts}.post_type, \'Deals\', \'Accommodation\', \'Attractions\', \'Articles\') ASC";

    if ($orderby) {
        $orderby = $new . \', \' . $orderby;
    } else {
        $orderby = $new;
    }

    return $orderby;
}
然后只需检查帖子类型何时更改,并显示您喜欢的标题:

<?php
$post_type = \'\';
while (has_posts()): the_post;

if (get_post_type() !== $post_type) {
    // print the header for the post type
    // maybe something like this...
    echo \'<h2>\', esc_html(get_post_type_object(get_post_type())->label)), \'</h2>\';
}

// do stuff with the current post

$post_type = get_post_type();

endwhile;

结束

相关推荐