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

23 мар. 2015 г., 18:04:37
Просмотры: 23.5K
Голосов: 10

У меня есть один шаблон страницы по умолчанию, который я хочу использовать для двух сценариев. Я предпочитаю использовать только один шаблон страницы ради простоты для моего клиента.

Вот что я пытаюсь реализовать:

if родительская_страница ИЛИ дочерняя_страница_без_потомков {
  отображать макет_полной_ширины
}
if дочерняя_страница_с_потомками или страница_внук {
  отображать макет_с_боковым_меню
}

Это возможно?

Вот что я попробовал до сих пор:

if( is_page() && $post->post_parent > 0 ) {
  // отображать макет_с_боковым_меню
} else {
  // отображать макет_полной_ширины
}

Пока что это работает для страниц верхнего уровня, отображая макеты полной ширины. Но как мне убедиться, что макет с боковым меню отображается только на дочерних страницах с потомками и на страницах-внуках? И чтобы для дочерних страниц без потомков отображался макет полной ширины?

Заранее спасибо. Я уверен, что есть простое решение, просто я относительно новичок в WP и все еще пытаюсь понять, что можно, а что нельзя сделать.

0
Все ответы на вопрос 2
0

Перед тем как прочитать решение, предложенное Bravokeyl, я методом проб и ошибок наконец пришел к решению, которое сработало в моем случае. Я не уверен, какое из двух решений лучше или более правильное, я знаю лишь то, что мой вариант сработал для моей конкретной проблемы.

Вот код, который я использовал для отображения макета во всю ширину или макета с боковым меню:

if( is_page() && $post->post_parent > 0 ) { 
  // у записи есть родительские элементы

  $children = get_pages('child_of='.$post->ID);
  if( count( $children ) != 0 ) {
    // отображаем макет с боковым меню
  }

  $parent = get_post_ancestors($post->ID);
  if( count( $children ) <= 0  && empty($parent[1]) ) {
    // отображаем макет во всю ширину
  } elseif ( count( $children ) <= 0  && !empty($parent[1]) )  {
    // отображаем макет с боковым меню
  }

} else {
  // у записи нет родительских элементов
  // отображаем макет во всю ширину
}
25 мар. 2015 г. 23:12:45
2
Level-0
--Level-1
----Level-2
------Level-3
----Levelanother-2
--Levelanother-1

проверить, является ли страница страницей верхнего уровня (она может иметь или не иметь дочерних страниц)?

$post->$post_parent == 0 или пустой get_post_ancestors( $post ) возвращает только Level-0 страницы.

Является ли страница дочерней и относится только к Level-1 или Levelanother-1?

$post->$post_parent > 0 или не пустой get_post_ancestors( $post ) и пустой get_post_ancestors( $post->post_parent )

Является ли страницей level-1, но не имеет дочерних страниц, как Levelanother-1?

$post->$post_parent > 0 или не пустой get_post_ancestors( $post ) и пустой get_post_ancestors( $post->post_parent ) и count(get_children( $post ->ID, 'ARRAY_A' )) == 0 ..

Я ещё не проверял это..но должно работать нормально. Вы также можете поэкспериментировать с get_page_children() и get_posts()

23 мар. 2015 г. 22:16:33
Комментарии

Спасибо, bravokeyl. Ваше решение сработало для меня. После множества проб и ошибок (в основном ошибок) я сегодня утром, ещё до прочтения вашего ответа, придумал собственное решение. Опубликую его ниже.

laura.f laura.f
25 мар. 2015 г. 22:58:44

Отлично! Вы нашли решение.

bravokeyl bravokeyl
26 мар. 2015 г. 00:35:38