## _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()