_update_post_term_count()WP 2.3.0

Обновляет количество записей (постов) прикрепленных к термину (элементе таксономии). Какие типы записей считать, берется из настроек таксономии.

Функция отвечает за обновление подсчёта постов в термине (тегов или категорий) для определённой таксономии, связанной с записями (post). Функция считает количество записей, связанных с каждым термином, и обновляет это значение в базе данных.

Такое обновление происходит автоматически при создании/обновлении поста привязанного к таксономии или при добавлении/удалении термина.

Внутренняя функция — эта функция рассчитана на использование самим ядром. Не рекомендуется использовать эту функцию в своем коде.

Возвращает

null. Ничего (null).

Использование

_update_post_term_count( $terms, $taxonomy );
$terms(int[]) (обязательный)
Список ID терминов таксономии.
$taxonomy(WP_Taxonomy) (обязательный)
Объект таксономии, термины которого указаны в предыдущем параметре.

Примеры

0

#1 Демо

Так как _update_post_term_count() является внутренней функцией WordPress и опасно использовать ее напрямую в коде темы или плагина, пример использования данной функции основан на ее применении внутри функции register_taxonomy().

В примере создается новая таксономия "genre" для записей post, а функция _update_post_term_count() используется для подсчета количества записей, связанных с каждым термином в этой таксономии.

add_action( 'init', 'create_book_tax' );

function create_book_tax() {
  register_taxonomy(
	  'genre',
	  'post',
	  array(
		  'label' => __( 'Genre' ),
		  'rewrite' => array( 'slug' => 'genre' ),
		  'update_count_callback' => '_update_post_term_count',
	  )
  );
}

В этом примере _update_post_term_count будет вызываться сразу после изменения количества записей, связанных с любым термином из таксономии “genre”, что обеспечит точный подсчет количества связанных записей для каждого термина.

Заметки

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

Список изменений

С версии 2.3.0 Введена.

Код _update_post_term_count() WP 6.4.3

function _update_post_term_count( $terms, $taxonomy ) {
	global $wpdb;

	$object_types = (array) $taxonomy->object_type;

	foreach ( $object_types as &$object_type ) {
		list( $object_type ) = explode( ':', $object_type );
	}

	$object_types = array_unique( $object_types );

	$check_attachments = array_search( 'attachment', $object_types, true );
	if ( false !== $check_attachments ) {
		unset( $object_types[ $check_attachments ] );
		$check_attachments = true;
	}

	if ( $object_types ) {
		$object_types = esc_sql( array_filter( $object_types, 'post_type_exists' ) );
	}

	$post_statuses = array( 'publish' );

	/**
	 * Filters the post statuses for updating the term count.
	 *
	 * @since 5.7.0
	 *
	 * @param string[]    $post_statuses List of post statuses to include in the count. Default is 'publish'.
	 * @param WP_Taxonomy $taxonomy      Current taxonomy object.
	 */
	$post_statuses = esc_sql( apply_filters( 'update_post_term_count_statuses', $post_statuses, $taxonomy ) );

	foreach ( (array) $terms as $term ) {
		$count = 0;

		// Attachments can be 'inherit' status, we need to base count off the parent's status if so.
		if ( $check_attachments ) {
			// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration
			$count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status IN ('" . implode( "', '", $post_statuses ) . "') OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) IN ('" . implode( "', '", $post_statuses ) . "') ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) );
		}

		if ( $object_types ) {
			// phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration
			$count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status IN ('" . implode( "', '", $post_statuses ) . "') AND post_type IN ('" . implode( "', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) );
		}

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edit_term_taxonomy', $term, $taxonomy->name );
		$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );

		/** This action is documented in wp-includes/taxonomy.php */
		do_action( 'edited_term_taxonomy', $term, $taxonomy->name );
	}
}