@CheGevara

Как в WordPress получить список категорий со свежими записями в них?

Возникла задача — получить и выести список из 5ти категорий в которых есть самые новые записи.
Не понимаю как сделать =(
  • Вопрос задан
  • 386 просмотров
Решения вопроса 1
artzolin
@artzolin Куратор тега WordPress
php, WordPress разработка сайтов artzolin.ru
Задача не сама простая, как может показаться на первый взгляд. Дело в том, что мы не знаем заранее сколько нужно заказать постов из базы, которые будут иметь 5 уникальных рубрик. Мы можем заказать все посты и остановить цикл пока не наберем нужные 5, но на больших объемах данных это создаст излишнюю нагрузку

Я бы пошел таким путем: на хуке save_post мы можно добавлять свежие термины записи в начало массива с помощью array_unshift()

add_action( 'save_post', 'update_fresh_terms' );
if ( ! function_exists( 'update_fresh_terms' ) ) {
	function update_fresh_terms( $post_id ) {

		if ( $_POST['post_type'] === 'post' ) {
			$fresh_terms = get_option( '_fresh_category', array() );

			// Получаем термины текущего поста.
			$terms = get_the_terms( $post_id, 'category' );

			if ( is_array( $terms ) ) {
				foreach ( $terms as $key => $term ) {
					array_unshift( $fresh_terms, $term->term_id ); // Добавляем id новых терминов в начало массива.
				}
			}

			$fresh_terms = array_unique( $fresh_terms );

			update_option( '_fresh_category', $fresh_terms );
		}
	}
}


Получить термины для использования можно с помощью нативной get_option(). Или же можно создать дополнительную функцию, которая при первом использовании, когда массив с терминами еще пустой, будет делать запрос всех постов из базы и собирать массив терминов по «свежести»

if ( ! function_exists( 'get_fresh_terms' ) ) {
	function get_fresh_terms( $count = 5, $post_type = 'post', $term_name = 'category' ) {

		$fresh_terms = get_option( '_fresh_' . $term_name, array() );

		if ( empty( $fresh_terms ) ) {

			// Задаем нужные нам критерии выборки данных из БД.
			$args = array(
				'posts_per_page' => -1,
				'post_type'      => $post_type,
			);

			$posts = get_posts( $args );

			foreach ( $posts as $key => $post ) {

				// Получаем термины текущего поста.
				$terms = get_the_terms( $post->ID, $term_name );

				if ( is_array( $terms ) ) {
					foreach ( $terms as $key => $term ) {
						$fresh_terms[] = $term->term_id;
					}
				}
			}

			$fresh_terms = array_unique( $fresh_terms );
		}

		// Если запрос не дал ни одной категории, возвращаем false.
		if ( empty( $fresh_terms ) ) {
			return false;
		} else {
			update_option( '_fresh_' . $term_name, $fresh_terms );
		}

		return $fresh_terms;
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы