Функция wp_count_posts() в WordPress: параметры, возвращаемое значение, примеры использования

# Функция WP_COUNT_POSTS()

Функция wp_count_posts() используется в WordPress для получения количества записей (постов) любого типа и состояния (опубликованные, черновики и т.д.). 

Эта функция позволяет эффективно узнать, сколько постов определенного типа имеется в блоге. Альтернативный способ — использование функции get_posts(), но это менее эффективный метод. Поэтому, если вы разрабатываете для WordPress версии 2.5 и выше, лучше использовать именно wp_count_posts().

## Параметры функции

- **$type (string)**: Название типа поста, количество которого вы хотите узнать. По умолчанию — 'post'.

- **$perm (string)**: Для учета приватных постов текущего авторизованного пользователя, установите это значение на readable. По умолчанию — ''.

## Возвращаемое значение

Функция возвращает объект класса stdClass, содержащий количество постов для каждого статуса. Если тип поста не существует, вернется пустой объект.

## Применение функции

### Пример 1: Количество опубликованных постов

Чтобы получить количество опубликованных постов, можно использовать следующий код:

$count_posts = wp_count_posts();
$published_posts = $count_posts->publish;

Если вам не нужна поддержка PHP4, можно сократить запись:

$published_posts = wp_count_posts()->publish;

### Пример 2: Учет черновиков

Чтобы вычислить, сколько черновиков у вас в базе данных, воспользуйтесь таким кодом (для PHP5 и выше):

$draft_posts = wp_count_posts()->draft;

### Пример 3: Учет других типов постов

Чтобы посчитать количество опубликованных постов для пользовательского типа поста, например, new_post_type, используйте следующий код:

$published_posts = wp_count_posts('new_post_type')->publish;

### Пример 4: Основное использование

Эта функция возвращает объект с количеством постов по каждому статусу. Вы можете использовать функцию var_dump() для просмотра содержимого этого объекта.

$count_posts = wp_count_posts();

// Результат может выглядеть так:
/*
stdClass Object
(
    [publish] => 60
    [future]  => 0
    [draft]   => 9
    [pending] => 3
    [private] => 0
    [trash]   => 0
    [auto-draft] => 3
    [inherit]    => 0
)
*/

## Примечания

- Функция использует глобальный объект базы данных WordPress: $wpdb.

## Изменения

- **С версии 2.5.0**: Функция была представлена в данной версии WordPress.

## Код функции

Ниже приведен исходный код функции wp_count_posts() для понимания её ��аботы:

function wp_count_posts( $type = 'post', $perm = '' ) {
    global $wpdb;

    if ( ! post_type_exists( $type ) ) {
        return new stdClass();
    }

    $cache_key = _count_posts_cache_key( $type, $perm );

    $counts = wp_cache_get( $cache_key, 'counts' );
    if ( false !== $counts ) {
        foreach ( get_post_stati() as $status ) {
            if ( ! isset( $counts->{$status} ) ) {
                $counts->{$status} = 0;
            }
        }
        return apply_filters( 'wp_count_posts', $counts, $type, $perm );
    }

    $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";

    if ( 'readable' === $perm && is_user_logged_in() ) {
        $post_type_object = get_post_type_object( $type );
        if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) {
            $query .= $wpdb->prepare(
                " AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))",
                get_current_user_id()
            );
        }
    }

    $query .= ' GROUP BY post_status';

    $results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
    $counts  = array_fill_keys( get_post_stati(), 0 );

    foreach ( $results as $row ) {
        $counts[ $row['post_status'] ] = $row['num_posts'];
    }

    $counts = (object) $counts;
    wp_cache_set( $cache_key, $counts, 'counts' );

    return apply_filters( 'wp_count_posts', $counts, $type, $perm );
}

Этот текст на русском языке является более простым в восприятии и может помочь пользователю начать работу с функцией wp_count_posts() в WordPress.

Leave a Reply

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