将自定义发布类型添加到当前查询

时间:2014-12-24 作者:Billy

我正在尝试创建一个插件,添加一个新的自定义帖子类型,它应该显示在与普通帖子相同的位置(首页、档案等)。

Is there any functions for me to retrieve the post types which are currently being called in the query so that I can modify and add my CPT to the current query? (example stated in 2nd comment if my question sounds confusing)

我无法使用下面的代码(即列出帖子类型),因为我无法预测用户的帖子类型:

add_filter( \'pre_get_posts\', \'my_get_posts\' );

function my_get_posts( $query ) {

if ( is_home() && $query->is_main_query() )
    $query->set( \'post_type\', array( \'post\', \'page\', \'album\', \'movie\', \'quote\' ) );

return $query;
}
同样,我不能使用下面的代码,因为这样会返回all 帖子类型,包括那些可能不会出现在首页的帖子:

if ( !is_admin() && empty( $query->query_vars[\'suppress_filters\'] ) && $query->is_main_query() ) {
    $post_type = get_query_var(\'post_type\');
    $post_types = get_post_types( array( \'public\' => true ) );

    if ($post_type) {
        $post_type = $post_type;
    } else {
        $post_type = $post_types;
    }

    $query->set(\'post_type\',$post_type);
    return $query;
    }
}
那么,有没有办法在不影响其他帖子类型的情况下,将我的CPT添加到查询中?谢谢你的帮助!

1 个回复
最合适的回答,由SO网友:David Gard 整理而成

实际上你离pre_get_posts, 在添加自己的帖子之前,您只需首先获取查询中的当前帖子类型。

此外,我建议使用$priority 属于99 这样动作就跟在其他动作之后pre_get_posts 挂钩,这意味着如果用户添加了自己的CPT(或内置的帖子类型),它们将被下面的函数检测和包含(但您可以根据需要进行更改)。

add_action(\'pre_get_posts\', \'djg_includ_my_cpt_in_query\', 99);
function djg_includ_my_cpt_in_query($query){

    if(is_home() && $query->is_main_query()) :              // Ensure you only alter your desired query

        $post_types = $query->get(\'post_type\');             // Get the currnet post types in the query

        if(!is_array($post_types) && !empty($post_types))   // Check that the current posts types are stored as an array
            $post_types = explode(\',\', $post_types);

        if(empty($post_types))                              // If there are no post types defined, be sure to include posts so that they are not ignored
            $post_types[] = \'post\';         
        $post_types[] = \'document\';                         // Add your custom post type

        $post_types = array_map(\'trim\', $post_types);       // Trim every element, just in case
        $post_types = array_filter($post_types);            // Remove any empty elements, just in case

        $query->set(\'post_type\', $post_types);              // Add the updated list of post types to your query

    endif; 

    return $query;

}
编辑构建最终查询时,WordPress检查“post\\u type”是否为空,如果为空,则执行以下代码-

$where .= " AND $wpdb->posts.post_type = \'post\'";
$post_type_object = get_post_type_object ( \'post\' );
所以,当我们添加一个CPT时,WordPress认为我们想要忽略帖子,因为它没有显式声明。这就是我的场景的不同之处——我之前明确声明了其他post类型,因此它们被包括在调用中$post_types = $query->get(\'post_type\');.

所以,在你的情况下,我们可以合理地总结一下,如果$post_types 为空,则用户不希望修改查询的该部分,以便可以手动将“post”添加到$post_types 大堆这应该(希望如此!)达到理想的结果

结束

相关推荐

Wp_Query可以在单个请求中返回POST META吗?

我想创建一个wp\\u查询,该查询将返回posts 大堆$args = array ( \'post_type\' => \'page\', \'meta_key\' => \'someMetaKeyName\', ); // The Query $query = new WP_Query( $args ); 这将返回如下结果:正如您所看到的,帖子没有任何元数据,是否可以将元数据也包含在返回的数组中?PS,出于性能原因