Excluding custom post types

时间:2013-02-18 作者:Grant Palin

我正在尝试开发is_blog() 函数,如果当前视图是单个帖子、博客主页或帖子存档,则返回true。我已成功排除页面和附件。我的当前代码在我的主题中functions.php, 具体如下:

function is_blog() {
    global $post;
    $post_type = get_post_type( $post );

    // is_archive() covers is_author(), is_category(), is_date(), is_tag(), and is_tax()
    return ( (\'page\' == $post_type ) && !is_attachment() && ( is_home() || is_archive() || is_single() ) );
}
到目前为止,根据上述标准,这是可以预期的-对于此开发,我从footer.php 并显示结果。

我目前的困难是自定义类型。我当前有一个自定义类型,函数返回true, 即使自定义类型视图肯定与blog无关。我知道检查post类型,代码就证明了这一点(奇怪的是,单个post有一种“page”类型),但是我如何排除未知的自定义类型呢?当然,我现在只有一个,但我希望能够防止任何自定义类型导致true 后果

有没有办法捕获WordPress中没有内置的类型?

2 个回复
SO网友:Simon

此功能可帮助您筛选出非标准帖子类型:

function is_non_standard_type($id = null) {
    if (!$id) {
        // rewind_posts();
        global $post;
        $id = $post->ID;
    }
    $post_type = get_post_type( $id );

    return in_array($post_type, array(\'post\', \'page\', \'attachment\', \'nav_menu, \'nav_menu_item\', \'revision\')); // You might want to handle revision differently
}
请记住,这基本上只适用于单页(即。is_single() === true), 即使这样,你也不能完全确定。这是由于全球$post 在加载页面的过程中可能会发生变化,具体取决于任何循环过程中发生的情况。例如,侧栏中的循环可能会覆盖$post. 要解释这一点,您可以使用rewind_posts() 还原到页面开始加载时全局查询/发布所处的状态。

但也有存档页,对于$post 变量可能不包含任何内容,也可能不反映单个帖子类型。以分类法页面为例,因为分类法对于单个帖子类型不是唯一的,所以您不能仅仅因为您正在查询taxonomy_x 你只会得到类型的帖子post_type_y. 您可以通过使用下面这样的函数来解决这个问题,但只有在运行的查询具有post_type 定义,但可能并不总是这样。

function queried_post_type_object() {
    $var = get_query_var(\'post_type\');

    if ($var) {
        return get_post_type_object($var);
    }

    return null;
}
即使您能够正确地确定显示的是哪种帖子类型、分类法等,所涉及的逻辑也不会是微不足道的。找到以下各项的正确组合is_single(), is_archive() 结合不同职位类型的例外情况可能会带来挑战,但通过一些工作,您应该能够解决它。

SO网友:Milo

对于不是post类型存档的存档:

// if is an archive but NOT a post type archive:
if( is_archive() && ! is_post_type_archive() )
    echo \'blog archive\';
对于仅属于岗位类型的单个岗位post, 使用而不是is_single():

if( is_singular( \'post\' ) )
    echo \'blog post\';

结束

相关推荐