WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_post_ancestors() WP 2.5.0

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

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

Хуков нет.

Возвращает

Массив. ID родителей или пустой массив, если они не найдены.

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

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

Примеры

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

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

Тогда:

$ancestors = get_post_ancestors( 30 );

/* Вернет

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

#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

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

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

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

Код get post ancestors: wp-includes/post.php VER 5.0.3

<?php
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 = $ancestors[] = $post->post_parent;

	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 ) )
			break;

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

	return $ancestors;
}

Cвязанные функции

Из метки: post пост

Еще из метки: Связи (постов терминов)

Еще из раздела: Страницы

4 коммента
  • @ Dastan cайт: im1instrumental.net

    Вот я не понимаю как сделать родительский пост пример вот negative
    1-Сам пост http://www.hipstrumentals.com/2011/11/kid-ink-like-a-g-instrumental-hook/
    2-родительский пост http://www.hipstrumentals.com/2011/11/kid-ink-like-a-g-instrumental-hook/kid-ink-ft-travis-porter-like-a-g-instrumental/

    Ответить7.2 лет назад #
    • Kama7297

      Че это еще за определение родительский пост? Пост — одноуровневый тип записи, который объединяется категориями. Родительскими могут быть только постоянные страницы — у них многоуровневая структура.

      Ответить7.2 лет назад #
      • @ Mixa cайт: mixa-blog.org.ua

        Ничего подобного. Я как раз нашел этот пост потому что искал информацию о том, как создавать родительские посты. Тут дело не в иерархии. Посмотрите как реализованы вариаии товара в wp e commerce

        Ответить6.7 лет назад #
        • Kama7297

          В таблице постов есть поле "родитель". Теоретически конечно можно создать дочерний пост, к посту. Но, это уже нестандартный подход и нужно будет под это дело писать код отдельный (плагин) или что-то в этом роде. Базово, ВП такое не поддерживает, насколько я знаю. unknw

          Кстати, если есть на примете такой плагин, не могли бы поделиться. Только интересует плагин отдельно под это дело, а не как одна из функций, какого-то плагина.

          Ответить6.7 лет назад #
Здравствуйте, !     Войти . Зарегистрироваться