问题描述
有很多情况下,主题或插件注册一个帖子类型,并且您想要修改它。当然有 add_post_type_support()
和 remove_post_type_support()
,但是这些不能访问 register_post_type()
所有参数的完整列表。特别是,也许我想要禁用帖子类型存档,隐藏管理 UI,隐藏搜索等,而只剩下其余的帖子类型设置。
register_post_type()
的 Codex 页面在我面前摇摆:
Description
Create or modify a post type.
但是在过去,当我尝试这样做时,似乎没有起作用。这个功能是否真的用于修改帖子类型,如果是这样,你可以简单地重新声明几个参数,并将其余单独留下吗?
看到甚至没有 deregister_post_type()
功能,我不明白如何做到这一点。
最佳解决方案
Is this function really for modifying post types
是。
and if so, can you simply redeclare a couple arguments and leave the rest alone?
否。如果要将参数修改为帖子类型,则需要使用 get_post_type_object
获取帖子类型对象,修改所需内容,然后使用修改后的类型重新注册为新的 $ args 参数。
次佳解决方案
经过一番研究,我发现这些答案都不是最新的。
截至 2015 年 12 月 8 日,WordPress 包含一个新的过滤器 register_post_type_args
,可以让您挂接注册的帖子类型的参数。
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 );
第三种解决方案
以下是使用'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 );
第四种方案
挂钩到'registered_post_type'
后,其他代码已注册。它在 register_post_type()
的末尾被调用。你有两个参数:$post_type
和 $args
。现在,您可以更改此帖子类型的任何内容。检查 $GLOBALS['wp_post_types']
有些选项。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。