Наткнулся на один интересный пример, показывающий как можно расширить функцию body_class() (см. описание).
body_class была введена в версии 2.7 и очень удобна для стилизации определенных постов, страниц, дочерних страниц и т.д. Один из минусов стилизации дочерних страниц — это, если мы посмотрим на дочернюю страницу 3, 4, 5 ... уровней, то мы увидим, что добавляется класс описывающий рядом стоящую родительскую страницу, а не родительской страницы верхнего уровня. Но что делать, если нам нужно опираться именно на родительскую страницу верхнего уровня и если текущая страница — дочерняя к ней (неважно какой уровень), то указывать ей особые стили.
Аналогичной проверкой можно выводить, допустим, какой-то блок в сайдбаре только для страниц одной "ветки" — для родительской страницы и для всех её предков любого уровня.
Для просто реализации такой задачи существует встроенная функция WordPress — get_post_ancestors(). C её помощью мы можем получить ID родительской страницы верхнего уровня.
Давайте посмотрим пример, показывающий как к стандартным классам body_class() добавить свой класс top-level-parent-pageid-123. Код как обычно вставляется в файл шаблона functions.php:
add_filter('body_class','top_level_parent_id_body_class'); function top_level_parent_id_body_class($classes) { global $wpdb, $post; if (is_page()) { if ($post->post_parent) { $ancestors=get_post_ancestors($post->ID); $root=count($ancestors)-1; $parent = $ancestors[$root]; } else { $parent = $post->ID; } $classes[] = 'top-level-parent-pageid-' . $parent; } return $classes; }
После того как мы вставим этот код в functions.php, функция body_class(), кроме прочих, будет выводить класс "top-level-parent-pageid-123", где 123 — ID родительской страницы верхнего уровня.
Нужно было узнать ID родительской страницы, относительно той, на которой находишься. Помог кусок Вашего кода:
if ($post->post_parent) {
$ancestors=get_post_ancestors($post->ID);
$root=count($ancestors)-1;
$parent = $ancestors[$root];
} else {
$parent = $post->ID;
}
Спасибо!