unregister_post_type

The timeline below displays how wordpress function unregister_post_type has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.1

/**
 * Unregisters a post type.
 *
 * Cannot be used to unregister built-in post types.
 *
 * @since 4.5.0
 *
 * @global array $wp_post_types List of post types.
 *
 * @param string $post_type Post type to unregister.
 * @return true|WP_Error True on success, WP_Error on failure or if the post type doesn't exist.
 */
function unregister_post_type($post_type)
{
    global $wp_post_types;
    if (!post_type_exists($post_type)) {
        return new WP_Error('invalid_post_type', __('Invalid post type.'));
    }
    $post_type_object = get_post_type_object($post_type);
    // Do not allow unregistering internal post types.
    if ($post_type_object->_builtin) {
        return new WP_Error('invalid_post_type', __('Unregistering a built-in post type is not allowed'));
    }
    $post_type_object->remove_supports();
    $post_type_object->remove_rewrite_rules();
    $post_type_object->unregister_meta_boxes();
    $post_type_object->remove_hooks();
    $post_type_object->unregister_taxonomies();
    unset($wp_post_types[$post_type]);
    /**
     * Fires after a post type was unregistered.
     *
     * @since 4.5.0
     *
     * @param string $post_type Post type key.
     */
    do_action('unregistered_post_type', $post_type);
    return true;
}

WordPress Version: 5.7

/**
 * Unregisters a post type.
 *
 * Can not be used to unregister built-in post types.
 *
 * @since 4.5.0
 *
 * @global array $wp_post_types List of post types.
 *
 * @param string $post_type Post type to unregister.
 * @return true|WP_Error True on success, WP_Error on failure or if the post type doesn't exist.
 */
function unregister_post_type($post_type)
{
    global $wp_post_types;
    if (!post_type_exists($post_type)) {
        return new WP_Error('invalid_post_type', __('Invalid post type.'));
    }
    $post_type_object = get_post_type_object($post_type);
    // Do not allow unregistering internal post types.
    if ($post_type_object->_builtin) {
        return new WP_Error('invalid_post_type', __('Unregistering a built-in post type is not allowed'));
    }
    $post_type_object->remove_supports();
    $post_type_object->remove_rewrite_rules();
    $post_type_object->unregister_meta_boxes();
    $post_type_object->remove_hooks();
    $post_type_object->unregister_taxonomies();
    unset($wp_post_types[$post_type]);
    /**
     * Fires after a post type was unregistered.
     *
     * @since 4.5.0
     *
     * @param string $post_type Post type key.
     */
    do_action('unregistered_post_type', $post_type);
    return true;
}

WordPress Version: 4.6

/**
 * Unregisters a post type.
 *
 * Can not be used to unregister built-in post types.
 *
 * @since 4.5.0
 *
 * @global array $wp_post_types List of post types.
 *
 * @param string $post_type Post type to unregister.
 * @return bool|WP_Error True on success, WP_Error on failure or if the post type doesn't exist.
 */
function unregister_post_type($post_type)
{
    global $wp_post_types;
    if (!post_type_exists($post_type)) {
        return new WP_Error('invalid_post_type', __('Invalid post type.'));
    }
    $post_type_object = get_post_type_object($post_type);
    // Do not allow unregistering internal post types.
    if ($post_type_object->_builtin) {
        return new WP_Error('invalid_post_type', __('Unregistering a built-in post type is not allowed'));
    }
    $post_type_object->remove_supports();
    $post_type_object->remove_rewrite_rules();
    $post_type_object->unregister_meta_boxes();
    $post_type_object->remove_hooks();
    $post_type_object->unregister_taxonomies();
    unset($wp_post_types[$post_type]);
    /**
     * Fires after a post type was unregistered.
     *
     * @since 4.5.0
     *
     * @param string $post_type Post type key.
     */
    do_action('unregistered_post_type', $post_type);
    return true;
}

WordPress Version: 4.5

/**
 * Unregisters a post type.
 *
 * Can not be used to unregister built-in post types.
 *
 * @since 4.5.0
 *
 * @global WP_Rewrite $wp_rewrite             WordPress rewrite component.
 * @global WP         $wp                     Current WordPress environment instance.
 * @global array      $_wp_post_type_features Used to remove post type features.
 * @global array      $post_type_meta_caps    Used to remove meta capabilities.
 * @global array      $wp_post_types          List of post types.
 *
 * @param string $post_type Post type to unregister.
 * @return bool|WP_Error True on success, WP_Error on failure or if the post type doesn't exist.
 */
function unregister_post_type($post_type)
{
    if (!post_type_exists($post_type)) {
        return new WP_Error('invalid_post_type', __('Invalid post type'));
    }
    $post_type_args = get_post_type_object($post_type);
    // Do not allow unregistering internal post types.
    if ($post_type_args->_builtin) {
        return new WP_Error('invalid_post_type', __('Unregistering a built-in post type is not allowed'));
    }
    global $wp, $wp_rewrite, $_wp_post_type_features, $post_type_meta_caps, $wp_post_types;
    // Remove query var.
    if (false !== $post_type_args->query_var) {
        $wp->remove_query_var($post_type_args->query_var);
    }
    // Remove any rewrite rules, permastructs, and rules.
    if (false !== $post_type_args->rewrite) {
        remove_rewrite_tag("%{$post_type}%");
        remove_permastruct($post_type);
        foreach ($wp_rewrite->extra_rules_top as $regex => $query) {
            if (false !== strpos($query, "index.php?post_type={$post_type}")) {
                unset($wp_rewrite->extra_rules_top[$regex]);
            }
        }
    }
    // Remove registered custom meta capabilities.
    foreach ($post_type_args->cap as $cap) {
        unset($post_type_meta_caps[$cap]);
    }
    // Remove all post type support.
    unset($_wp_post_type_features[$post_type]);
    // Unregister the post type meta box if a custom callback was specified.
    if ($post_type_args->register_meta_box_cb) {
        remove_action('add_meta_boxes_' . $post_type, $post_type_args->register_meta_box_cb);
    }
    // Remove the post type from all taxonomies.
    foreach (get_object_taxonomies($post_type) as $taxonomy) {
        unregister_taxonomy_for_object_type($taxonomy, $post_type);
    }
    // Remove the future post hook action.
    remove_action('future_' . $post_type, '_future_post_hook', 5);
    // Remove the post type.
    unset($wp_post_types[$post_type]);
    /**
     * Fires after a post type was unregistered.
     *
     * @since 4.5.0
     *
     * @param string $post_type Post type key.
     */
    do_action('unregistered_post_type', $post_type);
    return true;
}