Нужно получить количество постов для каждой таксономии в WordPress.
Вот есть следующий код:
public static function output_html(int $post_id, array $post_types) : string {
$all_tax = Taxonomy::get_taxonomies($post_types);
if($all_tax) {
foreach( $all_tax as $tax_name => $label ) {
$terms = self::get_terms($tax_name);
if($terms) {
foreach ($terms as $term_id => $name) {
self::updateCounts($tax_name, $term_id);
echo '<div class="term-item" >'. esc_html($name) .'</div>';
// code...
}
}
}
}
}
// The number of posts for each term is being counted
private static function updateCounts(string $taxName, int $termId) : void {
$post_types = (array) get_taxonomy($taxName)->object_type;
//$guid = sha1(json_encode([$termId, $taxName, $post_types]));
//if (get_transient($guid) === false) {
foreach ($post_types as $type) {
$args = [ 'posts_per_page' => -1,
'post_type' => $type,
'tax_query' => [['taxonomy' => $taxName, 'terms' => $termId]],
];
$countQuery = new \WP_Query($args);
update_term_meta($termId, "count_{$type}", $countQuery->found_posts);
}
//set_transient($guid, true, 60);
}
}
Здесь происходит множество запросов. На каждый терм создаться отдельный WP_Query и идет подсчет и записывается в таблицу "wp_termmeta". Это создает колоссальную нагрузку на сервер.
Если, например, у будет 40 термов которые будут закреплены к разным post types (2) и таксономиям (3) то это составляет: 40 * 2 * 3 = 240. Несколько вложенных циклов это не самый лучший алгоритм Q(n2)
Может у кого то есть идеи, как можно будет оптимизировать подсчет количества постов для каждого из термов таксономий и пост тайпов.