Задать вопрос
@alex0176

Как подсчитать количество постов для каждой таксономии?

Нужно получить количество постов для каждой таксономии в 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)
Может у кого то есть идеи, как можно будет оптимизировать подсчет количества постов для каждого из термов таксономий и пост тайпов.
  • Вопрос задан
  • 118 просмотров
Подписаться 2 Сложный Комментировать
Решения вопроса 1
artzolin
@artzolin Куратор тега WordPress
php, WordPress разработка сайтов artzolin.ru
Если к таксономии привязан один post_type, то для запроса достаточно аргумента count

$args = array(
	'count' => true,
);

$terms = get_terms( $args );


Если же через стандартные аргументы задачу не решить, посмотрите кеширование через функцию wp_cache_set()

$cache_key = 'term_post_counts';
$counts = get_transient($cache_key);

if ($counts === false) {
    $counts = $wpdb->get_results($sql);
    set_transient($cache_key, $counts, HOUR_IN_SECONDS);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы