Функция _update_post_term_count() в WordPress: обновление количества терминов

## _UPDATE_POST_TERM_COUNT() │ WP 2.3.0

Функция _update_post_term_count() обновляет количество терминов на основе типов объектов текущей таксономии. Она является закрытой (private) функцией и предназначена для использования только ядром WordPress. Рекомендуется не использовать эту функцию непосредственно в вашем коде.

### Хуки из функции

- update_post_term_count_statuses: используется для изменения статуса обновления колич��ства постов.
- edit_term_taxonomy: вызывается перед изменением терминов таксономии.
- edited_term_taxonomy: вызывается после изменения терминов таксономии.

### Возврат

Функция не возвращает ничего (null).

### Применение

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

Примеры

Пример использования

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

В этом примере создаётся новая таксономия "жанр" для записи постов, и функция _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 будет вызываться сразу после изменения количества постов, связанных с любым термином из таксономии "жанр", что обеспечит точный подсчёт связанных постов для каждого термина.

Примечания

  • Глобальный объект базы данных WordPress: $wpdb.

Журнал изменений

  • Версия 2.3.0 — введена в WordPress.

Код функции _update_post_term_count() WP 6.7.2

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' );

    /**
     * Фильтрует статусы постов для обновления количества терминов.
     *
     * @since 5.7.0
     *
     * @param string[]    $post_statuses Список статусов постов, которые следует включить в подсчёт. По умолчанию 'publish'.
     * @param WP_Taxonomy $taxonomy      Текущий объект таксономии.
     */
    $post_statuses = esc_sql( apply_filters( 'update_post_term_count_statuses', $post_statuses, $taxonomy ) );

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

        // Для вложений может быть статус 'inherit', мы должны основывать подсчёт на статусе родителя, если это так.
        if ( $check_attachments ) {
            $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 ) {
            $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 ) );
        }

        /** Этот хук задокументирован в wp-includes/taxonomy.php */
        do_action( 'edit_term_taxonomy', $term, $taxonomy->name );
        $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );

        /** Этот хук задокументирован в wp-includes/taxonomy.php */
        do_action( 'edited_term_taxonomy', $term, $taxonomy->name );
    }
}

Связанные функции

  • Таксономии (категории, метки)
    • get_ancestors()
    • get_term_parents_list()
    • wp_get_split_terms()
    • WP_Tax_Query()
    • wp_terms_checklist()

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *