WordPress: Encontrar los “ancestros” de una página

Recientemente estuve trabajando en un sitio web para una revista académica. La estructura del sitio requería definir diferentes plantillas para algunas de las secciones del sitio.

Decidí montar el sitio sobre WordPress y usar su sistema de páginas para estructurar el contenido; dado que la idea de esto era no tener que estar editando cosas “a mano” cada vez que se agregaran nuevos contenidos, necesitaba conocer los “ancestros” de una página —o sea, su padre ($post->post_parent), el padre de su padre, etc.— para poder determinar a qué sección del sitio correspondía.

Ya antes había explorado algunas posibilidades para trabajar con páginas padre, hermanas e hijas (exprimiendo la analogía al límite), pero nada de eso me servía en este caso.

Afortunadamente, a partir de la versión 2.5 de WordPress existe una variable que aporta justamente la información que necesitaba: se trata de $post->ancestors. Esta variable almacena en un array el $post->ID del padre de la página presente, el padre de su padre, el padre de su padre su padre, etc. hasta llegar a la página de primer nivel (o sea, la que se encuentra directamente bajo la raíz del sitio). Por ejemplo, al hacer un print_r($post->ancestors) de una página “x”, tendríamos algo así:

Array
(
    [0] => 46
    [1] => 118
    [2] => 27
)

Donde [0] es el padre de la página presente; [1] el padre del padre y [2] el padre del padre del padre… el $post->post_parent de [2] (o sea, de la página con la ID 27), es 0, o sea, index.php?p=27 es la página de primer nivel.

Ahora, para determinar si una página está bajo alguna otra, podemos utilizar una versión que forma parte de PHP: in_array(), donde el primer argumento será la “aguja” y el segundo el “pajar”. En mi caso, quería aplicar una plantilla especial si la página era descendiente de la página con la ID 27, por lo que la usé de este modo in_array(27, $post->ancestors).

Con esto, podemos agregar un nuevo condicional al archivo functions.php del tema que estamos desarrollando:

function is_article() //determinar si la pagina presente es un artículo de la revista
{ global $post;
if ( 27, $post->ancestors ) { return true; }
}

… y luego podemos ocupar este condicional de manera similar a las Conditional Tags de WordPress:

<?php if ( is_article() ) {
 // hacer cosas
} ?>