取消注册自定义帖子类型


44

有人知道注销自定义帖子类型的方法吗?

有相当于register_post_type()吗?


1
任何人都在寻找这个。注册自定义帖子类型时,没有任何内容保存到数据库中。wp db中的posts表是非结构化的。它仅在wp脚本的内部进行注册,您可以使用您使用register posts创建的类型创建一个进入posts表的条目。希望对别人有所帮助。
MageProspero'2

2
从WordPress 4.5开始,有功能可以做到这一点unregister_post_type。请参阅使用unregister_post_type取消注册帖子类型
Dhinju Divakaran

Answers:


38

当前没有注销帖子类型的功能,但是过程非常简单。

安德鲁·纳辛(Andrew Nacin)提供了有关跟踪的一些代码,可在此处找到并在下面发布。

if ( ! function_exists( 'unregister_post_type' ) ) :
function unregister_post_type( $post_type ) {
    global $wp_post_types;
    if ( isset( $wp_post_types[ $post_type ] ) ) {
        unset( $wp_post_types[ $post_type ] );
        return true;
    }
    return false;
}
endif;

取消注册内置帖子类型将对WordPress产生未知影响,因此请您自担风险。取消注册自定义帖子类型应该是绝对安全的,但是自然不会对您的安装进行任何清理(即,取消注册帖子类型并不等同于从数据库中删除数据)。

我可以想象在某些情况下可能需要这样做,但是更明智的方法(在可能的情况下)是,如果不需要的话,根本就不用首先注册帖子类型。


2
不客气.. :)如果您要以代码形式添加自己的帖子类型,则更简单的解决方案是删除您运行的添加它们的函数/代码。另请注意,删除帖子类型不会将其从帖子表中清除,因此您可能在该表中有多余的条目。
t31os 2010年

2
@anu:如果不对register_post_type()每个页面加载(init)执行,唯一保持“永久”状态的可能是永久链接结构(刷新它并将其消失)以及数据库中的帖子,您可以将其删除通过做DELETE FROM wp_posts WHERE post_type = '[your custom post type]'
Jan Fabry 2010年

有趣的是,我确实删除了该custom_post_type的register_post_type代码,并且没有向该cpt添加任何帖子,但并未删除管理UI。
阿努

或者,当然,既然我再试一次,它就如你们所描述的那样工作-即新cpt的管理UI已经消失了。可能我是木偶:)无论如何还是有用的信息,所以谢谢。
anu

3
2016年2月更新-此功能已合并到WP 4.5.0的核心(将于4月发布)。
里卡多BRGWeb '16

37

从WordPress 4.5开始,可以执行此功能unregister_post_type。例:-

function delete_post_type(){
    unregister_post_type( 'blocks' );
}
add_action('init','delete_post_type');

这需要具有更高的优先级,然后再使用一种优先级来注册帖子类型,否则它将不起作用
Mark Kaplun

@Dhinju Divakaran,它不是从数据库中删除我现在不使用的旧帖子类型。
Faiyaz Alam

它的工作方式,请确保与注册帖子类型所使用的操作相比,您将该操作赋予较高的优先级。
Ajith R Nair

1
值得一提的是unregister_post_type()不会从数据库中删除任何内容。它仅防止帖子类型被注册。
戴夫·罗姆西

这对我来说非常有效,但是请记住,您需要通过在Settings-> Permalinks admin页面中重新保存您的Permalink结构来通知WordPress有关更改。否则,具有永久链接冲突的页面将无法正常工作。
MarkPraschan

7

这对我有用,就像Rarst尽可能使用remove_action()所说的那样。

add_action( 'after_setup_theme','remove_foundation_options', 100 );

function remove_foundation_options() {   
    remove_action( 'init', 'Orbit');    
}

5

正如t31os指出的那样,很容易从全局变量中删除帖子类型。

但是,如果您的意思是非核心文章类型,那么最好查找注册它的代码并与之挂钩remove_action()(如果它是不错的代码,则应将其挂钩而不是直接运行)。


2
register_post_type()不是一个很适合钩子的函数。注册帖子类型的通常方法是直接在挂接到init的函数中运行该函数。删除该动作可能会产生不良影响,因为该功能通常会删除其他功能。
约翰·布洛赫

@John P Bloch是的,我知道这一点。有时您最终会重建所有init以使其正确,最终它取决于特定的代码及其质量/
合理性

1

在WordPress 4.5及更高版本中,它们提供了删除帖子类型(unregister_post_type)的功能。

function delete_post_type(){
unregister_post_type( 'jobs' );
}
add_action('init','delete_post_type');

它一定会工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.