Title: wp_delete_term
Published: April 25, 2014
Last modified: February 24, 2026

---

# wp_delete_term( int $term, string $taxonomy, array|string $args = array() ): bool|int|󠀁[WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)󠁿

## In this article

 * [Description](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#description)
 * [Parameters](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#changelog)
 * [User Contributed Notes](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#user-contributed-notes)

[ Back to top](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#wp--skip-link--target)

Removes a term from the database.

## 󠀁[Description](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#description)󠁿

If the term is a parent of other terms, then the children will be updated to that
term’s parent.

Metadata associated with the term will be deleted.

## 󠀁[Parameters](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#parameters)󠁿

 `$term`intrequired

Term ID.

`$taxonomy`stringrequired

Taxonomy name.

`$args`array|stringoptional

Array of arguments to override the default term ID.

 * `default` int
 * The term ID to make the default term. This will only override the terms found
   if there is only one term found. Any other and the found terms are used.
 * `force_default` bool
 * Optional. Whether to force the supplied term as default to be assigned even if
   the object was not going to be term-less.
    Default false.

Default:`array()`

## 󠀁[Return](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#return)󠁿

 bool|int|[WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)
True on success, false if term does not exist. Zero on attempted deletion of default
Category. [WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)
if the taxonomy does not exist.

## 󠀁[Source](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#source)󠁿

    ```php
    function wp_delete_term( $term, $taxonomy, $args = array() ) {
    	global $wpdb;

    	$term = (int) $term;

    	$ids = term_exists( $term, $taxonomy );
    	if ( ! $ids ) {
    		return false;
    	}
    	if ( is_wp_error( $ids ) ) {
    		return $ids;
    	}

    	$tt_id = $ids['term_taxonomy_id'];

    	$defaults = array();

    	if ( 'category' === $taxonomy ) {
    		$defaults['default'] = (int) get_option( 'default_category' );
    		if ( $defaults['default'] === $term ) {
    			return 0; // Don't delete the default category.
    		}
    	}

    	// Don't delete the default custom taxonomy term.
    	$taxonomy_object = get_taxonomy( $taxonomy );
    	if ( ! empty( $taxonomy_object->default_term ) ) {
    		$defaults['default'] = (int) get_option( 'default_term_' . $taxonomy );
    		if ( $defaults['default'] === $term ) {
    			return 0;
    		}
    	}

    	$args = wp_parse_args( $args, $defaults );

    	if ( isset( $args['default'] ) ) {
    		$default = (int) $args['default'];
    		if ( ! term_exists( $default, $taxonomy ) ) {
    			unset( $default );
    		}
    	}

    	if ( isset( $args['force_default'] ) ) {
    		$force_default = $args['force_default'];
    	}

    	/**
    	 * Fires when deleting a term, before any modifications are made to posts or terms.
    	 *
    	 * @since 4.1.0
    	 *
    	 * @param int    $term     Term ID.
    	 * @param string $taxonomy Taxonomy name.
    	 */
    	do_action( 'pre_delete_term', $term, $taxonomy );

    	// Update children to point to new parent.
    	if ( is_taxonomy_hierarchical( $taxonomy ) ) {
    		$term_obj = get_term( $term, $taxonomy );
    		if ( is_wp_error( $term_obj ) ) {
    			return $term_obj;
    		}
    		$parent = $term_obj->parent;

    		$edit_ids    = $wpdb->get_results( "SELECT term_id, term_taxonomy_id FROM $wpdb->term_taxonomy WHERE `parent` = " . (int) $term_obj->term_id );
    		$edit_tt_ids = wp_list_pluck( $edit_ids, 'term_taxonomy_id' );

    		/**
    		 * Fires immediately before a term to delete's children are reassigned a parent.
    		 *
    		 * @since 2.9.0
    		 *
    		 * @param array $edit_tt_ids An array of term taxonomy IDs for the given term.
    		 */
    		do_action( 'edit_term_taxonomies', $edit_tt_ids );

    		$wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id ) + compact( 'taxonomy' ) );

    		// Clean the cache for all child terms.
    		$edit_term_ids = wp_list_pluck( $edit_ids, 'term_id' );
    		clean_term_cache( $edit_term_ids, $taxonomy );

    		/**
    		 * Fires immediately after a term to delete's children are reassigned a parent.
    		 *
    		 * @since 2.9.0
    		 *
    		 * @param array $edit_tt_ids An array of term taxonomy IDs for the given term.
    		 */
    		do_action( 'edited_term_taxonomies', $edit_tt_ids );
    	}

    	// Get the term before deleting it or its term relationships so we can pass to actions below.
    	$deleted_term = get_term( $term, $taxonomy );

    	$object_ids = (array) $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tt_id ) );

    	foreach ( $object_ids as $object_id ) {
    		if ( ! isset( $default ) ) {
    			wp_remove_object_terms( $object_id, $term, $taxonomy );
    			continue;
    		}

    		$terms = wp_get_object_terms(
    			$object_id,
    			$taxonomy,
    			array(
    				'fields'  => 'ids',
    				'orderby' => 'none',
    			)
    		);

    		if ( 1 === count( $terms ) ) {
    			$terms = array( $default );
    		} else {
    			$terms = array_diff( $terms, array( $term ) );
    			if ( isset( $force_default ) && $force_default ) {
    				$terms = array_merge( $terms, array( $default ) );
    			}
    		}

    		$terms = array_map( 'intval', $terms );
    		wp_set_object_terms( $object_id, $terms, $taxonomy );
    	}

    	// Clean the relationship caches for all object types using this term.
    	$tax_object = get_taxonomy( $taxonomy );
    	foreach ( $tax_object->object_type as $object_type ) {
    		clean_object_term_cache( $object_ids, $object_type );
    	}

    	$term_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->termmeta WHERE term_id = %d ", $term ) );
    	foreach ( $term_meta_ids as $mid ) {
    		delete_metadata_by_mid( 'term', $mid );
    	}

    	/**
    	 * Fires immediately before a term taxonomy ID is deleted.
    	 *
    	 * @since 2.9.0
    	 *
    	 * @param int $tt_id Term taxonomy ID.
    	 */
    	do_action( 'delete_term_taxonomy', $tt_id );

    	$wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) );

    	/**
    	 * Fires immediately after a term taxonomy ID is deleted.
    	 *
    	 * @since 2.9.0
    	 *
    	 * @param int $tt_id Term taxonomy ID.
    	 */
    	do_action( 'deleted_term_taxonomy', $tt_id );

    	// Delete the term if no taxonomies use it.
    	if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term ) ) ) {
    		$wpdb->delete( $wpdb->terms, array( 'term_id' => $term ) );
    	}

    	clean_term_cache( $term, $taxonomy );

    	/**
    	 * Fires after a term is deleted from the database and the cache is cleaned.
    	 *
    	 * The 'delete_$taxonomy' hook is also available for targeting a specific
    	 * taxonomy.
    	 *
    	 * @since 2.5.0
    	 * @since 4.5.0 Introduced the `$object_ids` argument.
    	 *
    	 * @param int     $term         Term ID.
    	 * @param int     $tt_id        Term taxonomy ID.
    	 * @param string  $taxonomy     Taxonomy slug.
    	 * @param WP_Term $deleted_term Copy of the already-deleted term.
    	 * @param array   $object_ids   List of term object IDs.
    	 */
    	do_action( 'delete_term', $term, $tt_id, $taxonomy, $deleted_term, $object_ids );

    	/**
    	 * Fires after a term in a specific taxonomy is deleted.
    	 *
    	 * The dynamic portion of the hook name, `$taxonomy`, refers to the specific
    	 * taxonomy the term belonged to.
    	 *
    	 * Possible hook names include:
    	 *
    	 *  - `delete_category`
    	 *  - `delete_post_tag`
    	 *
    	 * @since 2.3.0
    	 * @since 4.5.0 Introduced the `$object_ids` argument.
    	 *
    	 * @param int     $term         Term ID.
    	 * @param int     $tt_id        Term taxonomy ID.
    	 * @param WP_Term $deleted_term Copy of the already-deleted term.
    	 * @param array   $object_ids   List of term object IDs.
    	 */
    	do_action( "delete_{$taxonomy}", $term, $tt_id, $deleted_term, $object_ids );

    	return true;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/taxonomy.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/taxonomy.php#L2034)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/taxonomy.php#L2034-L2236)

## 󠀁[Hooks](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#hooks)󠁿

 [do_action( ‘deleted_term_taxonomy’, int $tt_id )](https://developer.wordpress.org/reference/hooks/deleted_term_taxonomy/)

Fires immediately after a term taxonomy ID is deleted.

 [do_action( ‘delete_term’, int $term, int $tt_id, string $taxonomy, WP_Term $deleted_term, array $object_ids )](https://developer.wordpress.org/reference/hooks/delete_term/)

Fires after a term is deleted from the database and the cache is cleaned.

 [do_action( ‘delete_term_taxonomy’, int $tt_id )](https://developer.wordpress.org/reference/hooks/delete_term_taxonomy/)

Fires immediately before a term taxonomy ID is deleted.

 [do_action( “delete_{$taxonomy}”, int $term, int $tt_id, WP_Term $deleted_term, array $object_ids )](https://developer.wordpress.org/reference/hooks/delete_taxonomy/)

Fires after a term in a specific taxonomy is deleted.

 [do_action( ‘edited_term_taxonomies’, array $edit_tt_ids )](https://developer.wordpress.org/reference/hooks/edited_term_taxonomies/)

Fires immediately after a term to delete’s children are reassigned a parent.

 [do_action( ‘edit_term_taxonomies’, array $edit_tt_ids )](https://developer.wordpress.org/reference/hooks/edit_term_taxonomies/)

Fires immediately before a term to delete’s children are reassigned a parent.

 [do_action( ‘pre_delete_term’, int $term, string $taxonomy )](https://developer.wordpress.org/reference/hooks/pre_delete_term/)

Fires when deleting a term, before any modifications are made to posts or terms.

## 󠀁[Related](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_list_pluck()](https://developer.wordpress.org/reference/functions/wp_list_pluck/)`wp-includes/functions.php` |

Plucks a certain field out of each object or array in an array.

  | 
| [clean_term_cache()](https://developer.wordpress.org/reference/functions/clean_term_cache/)`wp-includes/taxonomy.php` |

Removes all of the term IDs from the cache.

  | 
| [clean_object_term_cache()](https://developer.wordpress.org/reference/functions/clean_object_term_cache/)`wp-includes/taxonomy.php` |

Removes the taxonomy relationship to terms from the cache.

  | 
| [wp_remove_object_terms()](https://developer.wordpress.org/reference/functions/wp_remove_object_terms/)`wp-includes/taxonomy.php` |

Removes term(s) associated with a given object.

  | 
| [wp_get_object_terms()](https://developer.wordpress.org/reference/functions/wp_get_object_terms/)`wp-includes/taxonomy.php` |

Retrieves the terms associated with the given object(s), in the supplied taxonomies.

  | 
| [wp_set_object_terms()](https://developer.wordpress.org/reference/functions/wp_set_object_terms/)`wp-includes/taxonomy.php` |

Creates term and taxonomy relationships.

  | 
| [term_exists()](https://developer.wordpress.org/reference/functions/term_exists/)`wp-includes/taxonomy.php` |

Determines whether a taxonomy term exists.

  | 
| [is_taxonomy_hierarchical()](https://developer.wordpress.org/reference/functions/is_taxonomy_hierarchical/)`wp-includes/taxonomy.php` |

Determines whether the taxonomy object is hierarchical.

  | 
| [wpdb::update()](https://developer.wordpress.org/reference/classes/wpdb/update/)`wp-includes/class-wpdb.php` |

Updates a row in the table.

  | 
| [wpdb::get_col()](https://developer.wordpress.org/reference/classes/wpdb/get_col/)`wp-includes/class-wpdb.php` |

Retrieves one column from the database.

  | 
| [wpdb::delete()](https://developer.wordpress.org/reference/classes/wpdb/delete/)`wp-includes/class-wpdb.php` |

Deletes a row in the table.

  | 
| [delete_metadata_by_mid()](https://developer.wordpress.org/reference/functions/delete_metadata_by_mid/)`wp-includes/meta.php` |

Deletes metadata by meta ID.

  | 
| [wp_parse_args()](https://developer.wordpress.org/reference/functions/wp_parse_args/)`wp-includes/functions.php` |

Merges user defined arguments into defaults array.

  | 
| [get_taxonomy()](https://developer.wordpress.org/reference/functions/get_taxonomy/)`wp-includes/taxonomy.php` |

Retrieves the taxonomy object of $taxonomy.

  | 
| [get_term()](https://developer.wordpress.org/reference/functions/get_term/)`wp-includes/taxonomy.php` |

Gets all term data from database by term ID.

  | 
| [do_action()](https://developer.wordpress.org/reference/functions/do_action/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook.

  | 
| [get_option()](https://developer.wordpress.org/reference/functions/get_option/)`wp-includes/option.php` |

Retrieves an option value based on an option name.

  | 
| [wpdb::get_results()](https://developer.wordpress.org/reference/classes/wpdb/get_results/)`wp-includes/class-wpdb.php` |

Retrieves an entire SQL result set from the database (i.e., many rows).

  | 
| [wpdb::get_var()](https://developer.wordpress.org/reference/classes/wpdb/get_var/)`wp-includes/class-wpdb.php` |

Retrieves one value from the database.

  | 
| [wpdb::prepare()](https://developer.wordpress.org/reference/classes/wpdb/prepare/)`wp-includes/class-wpdb.php` |

Prepares a SQL query for safe execution.

  | 
| [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` |

Checks whether the given variable is a WordPress Error.

  |

[Show 16 more](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#)

| Used by | Description | 
| [WP_REST_Terms_Controller::delete_item()](https://developer.wordpress.org/reference/classes/wp_rest_terms_controller/delete_item/)`wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php` |

Deletes a single term from a taxonomy.

  | 
| [wp_ajax_delete_tag()](https://developer.wordpress.org/reference/functions/wp_ajax_delete_tag/)`wp-admin/includes/ajax-actions.php` |

Handles deleting a tag via AJAX.

  | 
| [wp_delete_category()](https://developer.wordpress.org/reference/functions/wp_delete_category/)`wp-includes/taxonomy.php` |

Deletes one existing category.

  | 
| [wp_delete_nav_menu()](https://developer.wordpress.org/reference/functions/wp_delete_nav_menu/)`wp-includes/nav-menu.php` |

Deletes a navigation menu.

  | 
| [wp_xmlrpc_server::wp_deleteCategory()](https://developer.wordpress.org/reference/classes/wp_xmlrpc_server/wp_deletecategory/)`wp-includes/class-wp-xmlrpc-server.php` |

Deletes a category.

  | 
| [wp_xmlrpc_server::wp_deleteTerm()](https://developer.wordpress.org/reference/classes/wp_xmlrpc_server/wp_deleteterm/)`wp-includes/class-wp-xmlrpc-server.php` |

Deletes a term.

  |

[Show 1 more](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#)

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#changelog)󠁿

| Version | Description | 
| [2.3.0](https://developer.wordpress.org/reference/since/2.3.0/) | Introduced. |

## 󠀁[User Contributed Notes](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#user-contributed-notes)󠁿

 1.   [Skip to note 3 content](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#comment-content-1225)
 2.    [Codex](https://profiles.wordpress.org/codex/)  [  10 years ago  ](https://developer.wordpress.org/reference/functions/wp_delete_term/#comment-1225)
 3.  [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_delete_term%2F%23comment-1225)
     Vote results for this note: 0[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_delete_term%2F%23comment-1225)
 4.  **Basic Example**
 5.      ```php
         <?php wp_delete_term( 25, 'category' )  ?>
         ```
     
 6.  Deletes the term with the ID 25 from the taxonomy “category” using the default
     function arguments
 7.   [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_delete_term%2F%3Freplytocom%3D1225%23feedback-editor-1225)
 8.   [Skip to note 4 content](https://developer.wordpress.org/reference/functions/wp_delete_term/?output_format=md#comment-content-4785)
 9.    [Md Aminur Islam](https://profiles.wordpress.org/aminurislam01/)  [  5 years ago  ](https://developer.wordpress.org/reference/functions/wp_delete_term/#comment-4785)
 10. [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_delete_term%2F%23comment-4785)
     Vote results for this note: 0[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_delete_term%2F%23comment-4785)
 11. Delete WooCommerce Product Category on Form submit with post request.
 12.     ```php
         if ( isset( $_POST['pro_cat_nonce'] ) || wp_verify_nonce( $_POST['pro_cat_nonce'], 'pro_cat_nonce_delete' ) ){ // nonce check
             if ( isset( $_POST['id'] ) && ! empty( $_POST['id'] ) ) {
                 // delete product_cat taxonomy term
                 $product_cat_id = intval( $_POST['id'] );
                 wp_delete_term( $product_cat_id, 'product_cat' );
             }
         }
         ```
     
 13.  [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_delete_term%2F%3Freplytocom%3D4785%23feedback-editor-4785)

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_delete_term%2F)
before being able to contribute a note or feedback.