Categorise Custom Post Types

时间:2014-11-03 作者:luke

我不想为某个自定义帖子类型的帖子添加类别支持,而是想对帖子类型本身进行分类。这怎么可能?

背后的故事:

在我的主题中,我处理不同类型的帖子的方式不同。但某些帖子类型的处理方式是相同的,因此对帖子类型进行分类是有意义的。

由于以下为无模块化编码:

if ( get_post_type() === \'movies\' || get_post_type() === \'apples\' || get_post_type() === \'sausages\' ) ) : //…
我想要更像这样的东西:

if ( in_category( \'food\', get_post_type() ) : //…
一种尝试可能是将自定义变量添加到register_post_type().当然,我想在不修改WordPress核心的情况下实现这一点。

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

谢谢各位,我找到了一个解决方案:

只需添加post_type_category register\\u post\\u type()中的arguments对象的元素:

$args = array(
    \'label\'               => \'sausages\',
    \'description\'         => \'Sausages\',
    \'labels\'              => $labels,
    \'post_type_category\'  => \'food\',
    \'supports\'            => array( \'title\', \'category\' ),
    \'hierarchical\'        => false,
    /* and so on */
);
register_post_type( \'sausage\', $args );
然后将其添加到函数中。php:

function is_post_type_in_cat ( $category = null , $post_type = null ) {

    if(!$post_type) $post_type = get_post_type();

    $post_type_object = get_post_type_object( $post_type  );

    $arr = isset($post_type_object->post_type_category) ? $post_type_object->post_type_category : null;

    if( !$arr ) return false;

    if ( !is_array($arr) )

        $arr = array($arr);

    return in_array($category, $arr);

}
然后,您可以使用以下代码签入主题:

if( is_post_type_in_cat( \'food\' ) ) :
  //do something
else:
  //do something
endif;
您不仅可以针对当前职位,还可以针对特定职位类型:

if( is_post_type_in_cat( \'food\', \'sausage\' ) ) :
  //do something
else:
  //do something
endif;
还可以将类别数组作为参数给定:

if( is_post_type_in_cat( array(\'food\', \'animal\', \'dairy\', \'cheese\'), \'gouda\' ) ) : // and so on
比我想象的要容易。感谢所有贡献者!如果在主要的CPT插件甚至WP核心中都没有实现这一点,也许在将来我会为此构建一个带有GUI的轻量级插件。

SO网友:Howdy_McGee

我假设你没有使用插件来注册你的帖子类型并自己完成。WordPress并没有一种简单的方法可以像你所要求的那样将帖子类型分组或分类在一起。我建议以自定义方式使用内置属性。例如,当registering your post type 有一个字段名为description. 我看不到帖子类型描述被使用得太多,所以如果你不使用它,你可以在那里添加你的类别,并在描述上运行条件,类似于你创建类别的方式-你只需要在创建/注册时分配它。

对于“苹果”和“香肠”,我的帖子类型描述可以是“食物”。我可以这样检查:

$post_type = get_post_type();

if( ! empty( $post_type ) ) {
    $typeObj = get_post_type_object( $post_type );

    if( ! empty( $typeObj ) && \'food\' == $typeObj->description ) {
        // Do something with the food post type category
    }
}
如果您真的想跟踪它,另一件事是保持一个全局关联数组

array( \'post_type_name\' => \'post_type_category\' )

问题是,每次创建新的帖子类型时,都需要更新全局数组。

SO网友:Welcher

我在这里做了一些假设,你在哪里需要这个,但你可以使用is_post_type_archive() 检查存档页和is_singular() 对于单个贴子,两者都采用字符串或贴子类型数组。

$post_types_group_one = array(\'movies\', \'apples\', \'sausages\' );
$post_types_group_two = array(\'movies\', \'apples\', \'sausages\', \'pancakes\' );

if( is_post_type_archive( $post_types_group_one ) {
    //do something
}

if( is_singular( $post_types_group_two  ) ) {
    //do something
}
希望有帮助!

结束

相关推荐

Get a list of categories ids

我正在使用基于自定义帖子类型的过滤器制作一个公文包。该过滤器必须只显示公文包中显示的帖子的类别,因为用户可以在短代码中通过id指定它们-[公文包id=“1,2,3”],而我无法获得该类别id的列表。下面是一个简单的例子,说明我正在尝试做什么:来自快捷码的自定义帖子ID列表:$ids 相同ID的数组:$id_array = explode(\',\', $ids) 必须返回类别ID列表的感兴趣的变量:$cat_ids = ??? 接下来,我们只获取具有所需id的类别:$ca