自定义帖子类型存档页面上的pre_get_post问题

时间:2013-10-16 作者:sleeper

Overview

<我正在创建一个主题,它有两种自定义帖子类型(作为自定义插件):

我还创建了single-articles.phparchive-articles.php 插件内的模板。审查CPT相同。

这两种自定义帖子类型都使用default WordPress分类法(类别和标记)

我的阅读设置设置为“静态页面”

首页:主页(自定义front-page.php 我创建的文件)

贴子页面:“站点新闻”页面(我想同时显示贴子和CPT)

The Problem

在创建了一篇常规帖子和一篇基于CPT文章的帖子之后,我转到了主帖子页面(网站新闻),在那里我做了not 请参见自定义贴子类型(仅限使用标准的贴子post 类型)。

经过一些搜索(我是一个noob),我明白如果我想在主页上显示CPT,我必须使用pre_get_posts.

所以,概括一下:我想展示

主帖子页面上的常规帖子和自定义帖子类型(CPT)

  • 类别档案页面的常规帖子和自定义帖子类型(CPT)
  • Here\'s What I Did

    // Add custom post types to the default loop (ref: http://bit.ly/1bqeBJC)
    function odigbs_add_custom_types( $query ) {
        if ( !is_admin()  && !is_preview() ) {
            if ( (is_home() || is_category() || is_tag() || is_archive()  || is_feed() ) && $query->is_main_query()  ) {
                $query->set( \'post_type\', array( \'post\', \'articles\', \'reviews\') );
                return $query;
            }
        }
    }
    add_filter( \'pre_get_posts\', \'odigbs_add_custom_types\' );
    
    我相信这是not the right way 来制作这个过滤器,但我找不到任何文章能彻底解释这个概念。。。所以我要加入进来。

    The Results

    <如果我去:http://site.dev/the-site-news/ (阅读设置的主要帖子页面),我现在DO 查看所有自定义帖子类型and 它确实使用single-{post_type}.php 插件中的文件http://site.dev/category/{some term}/ and 它确实使用archive-{post_type}.php 插件中的文件
  • But...

    如果我将浏览器指向http://site.dev/{custom_post_type}, (即不使用类别)要查看该CPT的档案,网站会抛出各种错误can 现在转到http://starter.dev/{custom_post_type}/, 但我现在又回到了我开始的地方,在主帖子页面上只显示默认帖子。没有自定义帖子类型

    Questions

    <如我所怀疑的那样,过滤器是否有问题should 它是写的吗

    提前感谢

    2 个回复
    最合适的回答,由SO网友:Milo 整理而成

    如果我们看看in source, 我们看看在什么条件下is_archive 是真的:

    if ( $this->is_post_type_archive
    || $this->is_date
    || $this->is_author
    || $this->is_category
    || $this->is_tag
    || $this->is_tax )
        $this->is_archive = true;
    
    问题是is_archive 正在触发帖子类型存档上的筛选器。如果要排除这些,请确保它不是is_post_type_archive, 或者通过检查其他存档是否是作者或日期存档以及标记和类别来确定其目标,并删除对is_archive.

    SO网友:Igor

    如果我理解正确,您希望您的CPT显示在常规存档页面(目录、主查询等)上,但当仅搜索您的CPT时,您会再次获得包含所有常规帖子等的CPT。。

    这是我所做的,目前我已经看到它工作得很好,但你永远不知道哪里会出现任何错误,所以在这里,试试看它是否适合你。

    将您的cpt更改为您的cpt:)

    add_action( \'pre_get_posts\', \'wpstck_get_YOURCPT_into_posts\' );
    function wpstck_get_YOURCPT_into_posts($query){
    
    
        if ( !is_post_type_archive() && $query->is_main_query() ) {
            $query->set( \'post_type\', array( \'post\', \'YOURCPT\' ) );
                return $query;
            }
    }
    

    结束

    相关推荐