WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

get_post_ancestors()WP 2.5.0

Получает ID всех родительских записей к указанной в виде массива.

Работает на основе: get_post()
Основа для: get_ancestors()
1 раз — 0.001242 сек (очень медленно) | 50000 раз — 0.33 сек (очень быстро) | PHP 7.2.5, WP 5.0.1

Хуков нет.

Возвращает

int[]. Возвращает массив из ID родительских записей. Если родительских записей нет, то будет возвращен пустой массив.

Использование

get_post_ancestors( $post_id );
$post_id(число/объект) (обязательный)
ID или объект записи (поста), родителей которого нужно получить.

Примеры

0

#1 Демонстрация

Допустим страница 30 является дочерней к 20, а 20 дочерней к 10. Т.е. 10 - страница верхнего уровня, а порядок сверху вниз по дереву такой: 10 > 20 > 30.

Тогда:

$ancestors = get_post_ancestors( 30 );

/* Вернет

Array
(
	[0] => 20
	[1] => 10
)
*/
0

#2 Выведем заголовок самой родительской страницы

Пусть структура наших страниц такая:

Страница 1 (ID=611)
	- Страница 1-1 (ID=613)
		- Страница 1-1-1 (ID=615)
			- Страница 1-1-1-1 (ID=617)
Страница 2 (ID=712)
	- Страница 2-1 (ID=755)
	- Страница 2-2 (ID=781)

Получим заголовок самой родительской страницы:

// Получаем массив с id всех родителей (передаём ID Страница 1-1-1-1)
$ids = get_post_ancestors( 617 );

/* Вернет

Array
(
	[0] => 615
	[1] => 613
	[2] => 611
)
*/

// Берём последний ID из массива - это ID самой верхней страницы
$id  = array_pop( $ids );

// Выводим заголовок этой страницы
echo get_the_title( $id ); // выведет Страница 1
0

#3 Проверим есть ли дочерняя страница

У нас есть вложенная структура постоянных страниц и нам нужно проверить является ли ID 34 родителем для страницы 12:

$ancestors = get_post_ancestors( 12 );
if( in_array(34, $ancestors) )
	echo "пост 34 - это родительский к 12";
else
	echo "пост 34 не является родителем поста 12";

Список изменений

С версии 2.5.0 Введена.

Код get_post_ancestors() WP 6.5.2

function get_post_ancestors( $post ) {
	$post = get_post( $post );

	if ( ! $post || empty( $post->post_parent ) || $post->post_parent == $post->ID ) {
		return array();
	}

	$ancestors = array();

	$id          = $post->post_parent;
	$ancestors[] = $id;

	while ( $ancestor = get_post( $id ) ) {
		// Loop detection: If the ancestor has been seen before, break.
		if ( empty( $ancestor->post_parent ) || ( $ancestor->post_parent == $post->ID ) || in_array( $ancestor->post_parent, $ancestors, true ) ) {
			break;
		}

		$id          = $ancestor->post_parent;
		$ancestors[] = $id;
	}

	return $ancestors;
}
4 комментария
    Войти