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