在很多情况下,主题或插件会注册帖子类型,而您想对其进行修改。当然有add_post_type_support()remove_post_type_support(),但是它们不能访问register_post_type()接受的参数的完整列表。特别是,也许我想禁用帖子类型存档,隐藏管理用户界面,从搜索中隐藏等,同时不考虑其余帖子类型设置。在我面前:


说明

创建或修改帖子类型。


但是过去,当我尝试执行此操作时,它似乎没有起作用。这个函数真的是用于修改帖子类型的吗?如果是这样,您能简单地重新声明几个参数并让其余的参数留着吗?如何做到的。

#1 楼


此功能是否真的可以修改帖子类型?


是的。



不。如果要修改帖子类型的参数,则需要使用get_post_type_object来获取帖子类型对象,修改所需内容,然后使用修改后的类型将其重新注册为新的$ args参数。

评论


用相同的register_post_type修改后的参数进行两次连续调用是否正确?我以您的“是”为前提,并且它不会转储任何错误并具有预期的效果。实际案例是我在此答案中提出的第二个选项:wordpress.stackexchange.com/a/74331/12615

–brasofilo
2012年11月29日14:54

是的,这行得通,但是好像您必须这样做,那么您需要添加一些过滤器或其他工具,以防止不得不一次又一次地重复注册相同的帖子类型。基本上,首先整理参数,然后注册。

–奥托
2012年11月29日19:13

我只是考虑了一下,因为插件的register_post_type之前提供了钩子。实际上,没有必要。这是一个“用于记录”的问题,感谢您的反馈。

–brasofilo
2012年11月29日19:22

#2 楼

经过一番研究后,我发现这些答案都不是最新的。

截至2015年12月8日,WordPress包括一个新的过滤器register_post_type_args,您可以使用它来注册已注册帖子类型的参数。 br />
function wp1482371_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "animal-species" ) {
        $args['rewrite'] = array(
            'slug' => 'animal'
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );


评论


这是现在正确的方法。

–戴夫·罗姆西
16 Sep 15 '23:47

这应该是公认的答案

– klewis
16年11月18日在14:20

如果在运行时中注册后需要更新该怎么办?例如:初始化后

–卢卡斯·布斯塔曼特(Lucas Bustamante)
19年6月27日在19:40

@LucasBustamante没关系。只需在您的插件/主题过程中调用“ add_filter”行即可,而无需执行任何操作。将在每个register_post_type函数期间调用该过滤器。我的代码不起作用的唯一情况是,如果帖子类型未正确注册。所有帖子类型都应在初始化挂钩期间进行注册。从法典中:“如果在'init'之前调用,register_post_type将不起作用,而在以后调用时,新创建或修改的帖子类型的各个方面将无法正常工作。如果您仍然需要帮助,建议您在新问题中发布更多详细信息。

–拉德利·斯蒂斯塔(Radley Sustaire)
19-6-28在2:57



因此,此代码将更改“ slug-of-post”,如“ sitename / projects / slug-of-post”?

– Krys
20-10-16在6:24

#3 楼

这是一个如何使用'registered_post_type'过滤器修改另一个插件中帖子类型的示例。

我使用的一个插件的定义中没有包含menu_icon,因此我想添加一个自己的。

<?php
/**
 * Add a menu icon to the WP-VeriteCo Timeline CPT
 *
 * The timeline plugin doesn't have a menu icon, so we hook into 'registered_post_type'
 * and add our own.
 *
 * @param  string $post_type the name of the post type
 * @param  object $args the post type args
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Make sure we're only editing the post type we want
    if ( 'timeline' != $post_type )
        return;

    // Set menu icon
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modify post type object
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );


评论


在大多数情况下,这是一种更清洁的方法。但是,应注意,此过滤器为时已晚,无法被重写使用,因此在这种情况下,必须使用可接受的答案。

–mrwweb
2015年3月17日在22:44



#4 楼

其他代码注册之后,钩住'registered_post_type'。在register_post_type()的末尾被调用。您有两个参数:$post_type$args
现在您可以更改此帖子类型的任何内容。检查$GLOBALS['wp_post_types']是否有某些选项。

评论


感谢您将我指向该挂钩。这回答了有关如何修改帖子类型的(更重要的)问题,但是对包含“修改”的register_post_type()的描述又如何呢?那是错的吗?我现在该不该跳上互联网马并从食品法典委员会手中夺走它?

–mrwweb
2012年9月13日下午16:32

$ wp_post_types [$ post_type] = $ args; …建议您应该能够更改属性。向您的问题添加失败代码的示例。

– fuxia♦
2012年9月13日下午16:36

#5 楼

我使用“事件日历”插件遇到了同样的事情。

我将以下代码添加到function.php中,以修改tribe_organizer帖子类型


评论


很好的样品,谢谢!

– Philipp
20年8月25日在11:25

#6 楼

我不知道这是否难看,但是只要需要操纵单个参数,就可以“即时”更改GLOBAL占位符。这就是我们使用非公共帖子类型contents在管理菜单中被接受的方式。在菜单渲染之前,我们先钩上钩子,然后在钩子上钩住:开发人员优先考虑的问题...

开发人员-如果这可能引起任何问题,请发表评论。