wp_delete_term()
云策文档标注
概述
wp_delete_term() 函数用于从数据库中删除一个分类法术语。它会处理子术语的父级更新、关联元数据的删除,并返回操作状态。
关键要点
- 删除术语时,如果它是其他术语的父级,子术语将更新为其父级。
- 关联的元数据会被自动删除。
- 参数包括术语ID、分类法名称和可选参数数组,用于覆盖默认术语ID等设置。
- 返回值可以是布尔值、整数或WP_Error,表示成功、失败或错误情况。
- 函数包含多个钩子(如 pre_delete_term、delete_term),允许在删除过程中执行自定义操作。
- 默认分类(如默认分类目录)不能被删除,函数会返回0以防止此操作。
代码示例
// 删除分类法“category”中ID为25的术语,使用默认参数
wp_delete_term( 25, 'category' );
// 删除WooCommerce产品分类术语的示例(包含非ce验证)
if ( isset( $_POST['pro_cat_nonce'] ) || wp_verify_nonce( $_POST['pro_cat_nonce'], 'pro_cat_nonce_delete' ) ) {
if ( isset( $_POST['id'] ) && ! empty( $_POST['id'] ) ) {
$product_cat_id = intval( $_POST['id'] );
wp_delete_term( $product_cat_id, 'product_cat' );
}
}注意事项
- 删除默认分类(如默认分类目录)会返回0,操作不会执行。
- 对于分层分类法,子术语的父级会被自动更新。
- 使用钩子可以在删除前后添加自定义逻辑,例如清理缓存或记录日志。
- 确保术语存在且分类法有效,否则函数可能返回false或WP_Error。
原文内容
Removes a term from the database.
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
$termintrequired-
Term ID.
$taxonomystringrequired-
Taxonomy name.
$argsarray|stringoptional-
Array of arguments to override the default term ID.
defaultintThe 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_defaultboolOptional. 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()
Source
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;
}
Hooks
- do_action( ‘deleted_term_taxonomy’, int $tt_id )
-
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 )
-
Fires after a term is deleted from the database and the cache is cleaned.
- do_action( ‘delete_term_taxonomy’, int $tt_id )
-
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 )
-
Fires after a term in a specific taxonomy is deleted.
- do_action( ‘edited_term_taxonomies’, array $edit_tt_ids )
-
Fires immediately after a term to delete’s children are reassigned a parent.
- do_action( ‘edit_term_taxonomies’, array $edit_tt_ids )
-
Fires immediately before a term to delete’s children are reassigned a parent.
- do_action( ‘pre_delete_term’, int $term, string $taxonomy )
-
Fires when deleting a term, before any modifications are made to posts or terms.
Changelog
| Version | Description |
|---|---|
| 2.3.0 | Introduced. |
Skip to note 3 content
Codex
Basic Example
Deletes the term with the ID 25 from the taxonomy “category” using the default function arguments
Skip to note 4 content
Md Aminur Islam
Delete WooCommerce Product Category on Form submit with post request.
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' ); } }