wp_delete_term() WP 2.3.0

Видаляє термін (категорію, мітку) із Бази Даних.

Якщо поточний термін є батьківським для інших, то після його видалення дочірні терміни пересунуться на рівень вище.

Разом із терміном видаляються всі пов’язані метадані. Дивіться: delete_metadata_by_mid() .

Повертає

true|false|int|WP_Error.

  • true– Якщо все пройшло вдало.
  • false– якщо не вдалося вилучити термін.
  • 0– якщо цей термін видаляти не можна.
  • wp_error– якщо такси немає.

Використання

wp_delete_term( $term_id, $taxonomy, $args );
$term_id
(число) (обов’язковий)
ID терміну, який потрібно видалити. Наприклад, id рубрики.
$taxonomy
(рядок) (обов’язковий)
Таксономія, до якої належить термін. Наприклад, категорії для рубрик.
$args
(масив)

Параметри видалення терміна. Зокрема, тут можна вказати, куди поміщати об’єкти терміну, що видаляється (пости рубрики, що видаляється), якщо вони залишаються “осиротілими” (без будь-якого терміну).

Іншими словами, тут ми можемо вказати базовий термін (рубрику), куди збиратимуться всі осиротілі записи. Можна вказати два параметри:

  • default(число) – після видалення осиротілі записи будуть прикріплені до зазначеного терміну.
  • force_default(логічний) – якщо true, то записи з віддаленого терміну потраплять у вказаний у default термін, незалежно, залишаються вони осиротілими чи ні (лишилися вони інші мітки чи ні).

Для таксономії category , default береться з налаштування: «Рубрика за замовчуванням».

За замовчуванням: []

Приклади

0

#1 Видалимо елемент таксономії

Видалимо термін 25, який знаходиться в таксономії category. Інакше кажучи, видалимо рубрику з ID 25.

wp_delete_term(25, 'category');
0

#2 Приклад використання аргументів

Видалимо термін 25, таксономії “books”. При цьому помістимо всі записи цього терміна в термін 15 (параметр default) і не важливо, чи залишаються ці записи осиротілими (параметр force_default)

wp_delete_term( 25, 'books', [ 'default'=>15, 'force_default'=>true ] );

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 2.3.0Введено.

Код wp_delete_term() WP 6.0.2

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.
		}
	}

	// Не можу розраховувати на дефект 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 коли вирівнюють термін, до будь-яких змін є виконані для повідомлень або термінів.
	 *
	 * @ 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 resigned a parent.
		 *
		 * @ Since 2.9.0
		 *
		 * @param array $edit_tt_ids На array of term taxonomy IDs для 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 resigned a parent.
		 *
		 * @ Since 2.9.0
		 *
		 * @param array $edit_tt_ids На array of term taxonomy IDs для given term.
		 */
		do_action( 'edited_term_taxonomies', $edit_tt_ids );
	}

	// Get the term before deleting it or its term relationships as 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 ) && isset( $default ) ) {
			$ terms = array ($ default);
		} else {
			$ terms = array_diff ($ terms, array ($ term));
			if ( isset( $default ) && 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 {@see '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 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 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *