Возвращать только Count из запроса wp_query?

Вопрос или проблема

Возможно ли с помощью стандартных встроенных инструментов в WordPress заставить wp_query возвращать только количество запроса?

Сейчас у меня есть запрос, в котором несколько meta_queries, но единственное, что меня интересует это фактическое количество запроса.

Я знаю, что могу использовать свойство found_posts, но сам запрос создает большую нагрузку, выполняя SELECT * и, таким образом, возвращает весь объект.

Я мог бы так же легко выполнить запрос к базе данных с помощью пользовательского запроса, используя $wpdb, но я хотел бы использовать встроенную систему запросов, если это возможно..

Я искал ответ на этот вопрос в SE и Google, но ничего не нашел.

Если я плохо объяснил свою проблему, дайте знать, и я постараюсь разъяснить.

Всего хорошего

Нет встроенной функции, чтобы достичь того, чего вы хотите, по крайней мере, не для сложных meta_queries, как эта. Если вам нужно использовать встроенные функции для этого, лучше использовать WP_Query.

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

'fields' => 'ids',
'no_found_rows' => true,

Это может быть даже немного быстрее, чем пользовательский SQL-запрос, и результаты из WP_Query также кэшируются.

Я знаю, что на это уже был дан ответ, и поскольку ваш вопрос был основан на использовании WP_Query, мой ответ, вероятно, маловероятен, но вы также можете попробовать использовать это:

wp_count_posts( $type, $perm );

где $type = post_type (post, page, 'custom-post-type-slug') и где $perm = Для включения частных постов, доступных текущему пользователю, установите ‘readable’

Я использовал это в прошлом с большим успехом 🙂

wp_count_posts('post')->publish -> возвращает только количество опубликованных постов.

Я бы написал простую функцию, которая возвращала бы как количество постов, так и сами посты (на основе ответа @Pieter)

function get_posts_with_count($query_args, $page, $per_page)
{
    // подсчитываем посты
    $posts_query = new WP_Query(
        $query_args,
    );
    $posts_count = count($posts_query->get_posts());
    $max_pages = ceil($posts_count / $page);

    // теперь фактически получаем посты
    $query_args['posts_per_page'] = $per_page;
    $query_args['paged'] = $page;
    unset($query_args['fields']);
    $posts_query = new WP_Query(
        $query_args
    );
    $posts = $posts_query->get_posts();

    return array(
        'posts_count' => $posts_count,
        'max_pages' => $max_pages,
        'data' => $posts
    );
}

Если вам нужен полный пример – на основе заметок Pитера:

$query = new WP_Query(
    array(
        'post_type' => 'post_type_goes_here',
        'posts_per_page' => 0, //нам не нужно возвращать объекты
        'no_found_rows' => true,
    )
);

if ($query->have_posts()) echo $query->found_posts;

Ответ или решение

Чтобы ответить на ваш запрос относительно оптимизации WP_Query для получения только количества результатов, следует обратить внимание на несколько аспектов, связанных с тем, как WordPress обрабатывает запросы к базе данных. Такой подход позволяет не только использовать встроенные возможности WordPress, но и оптимизировать производительность за счет снижения нагрузки на базу данных.

Теория

В основе вашей задачи лежит необходимость использовать WP_Query для получения только количества записей, соответствующих определенным мета-запросам, без извлечения всех данных о записях. Стандартный подход к реализации таких запросов предполагает использование параметра fields для изменения возвращаемого результата и параметра no_found_rows для улучшения производительности.

  • fields: Параметр, который может быть установлен в 'ids', чтобы вернуть только идентификаторы записей. Это уменьшает объем данных, извлекаемых из базы, поскольку возвращаются только идентификаторы вместо всех полных объектов записей.
  • no_found_rows: Этот параметр, установленный в true, предотвращает подсчет всех строк в базе данных, что значительно ускоряет выполнение запросов на больших наборах данных. Обычно этот параметр используется, когда пагинация не требуется.

Пример

Рассмотрим пример запроса, который использует эти параметры:

$query = new WP_Query(
    array(
        'post_type' => 'custom_post_type', // Замените на ваш тип записи
        'meta_query' => array(
            array(
                'key' => 'your_meta_key',
                'value' => 'your_meta_value',
                'compare' => '='
            ),
            // Добавьте другие мета-запросы по необходимости
        ),
        'fields' => 'ids', // Возвращаем только идентификаторы
        'no_found_rows' => true, // Не подсчитывать общее количество строк
    )
);

// Получаем количество записей
$post_count = count($query->posts);
echo 'Количество записей: ' . $post_count;

Применение

Использование этого подхода позволяет существенно сократить накладные расходы на выполнение запросов, особенно в тех случаях, когда необходимо обработать большое количество записей. WP_Query, благодаря встроенным возможностям кеширования, может быть более эффективным, чем выполнение необработанных SQL-запросов через $wpdb, что также минимизирует возможные ошибки и повышает безопасность кода.

Кроме того, при определенных условиях можно использовать более специализированные функции, такие как wp_count_posts(), если требуется получить количество записей определенного типа без учета сложных мета-запросов. Это может быть полезно, если ваши требования к выборке записей не включают сложные фильтры.

Дальнейшие шаги

  • Тестирование и оптимизация: Проверьте производительность вашего запроса на тестовом и продуктивном окружении, чтобы убедиться, что используются оптимальные конфигурации.
  • Логирование и мониторинг: Внедрите системы логирования для отслеживания времени выполнения запросов, что может быть полезно для дальнейшей оптимизации.
  • Пересмотр архитектуры: В случае увеличения сложности запросов или роста данных может потребоваться пересмотреть архитектуру системы, чтобы обеспечить масштабируемость и стабильность.

С применением данных подходов ваш сайт на WordPress сможет более эффективно обрабатывать запросы, предоставляя пользователю необходимую информацию с минимальными задержками и сниженной нагрузкой на серверные ресурсы.

Оцените материал
Добавить комментарий

Капча загружается...