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->Comentando algunas funciones para WordPress] 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
} ?>
11 responses
Pero en este caso el autor debe publicar el contenido como si fueran páginas y no posts ¿cierto?. ¿No sería más sencillo diferenciar plantillas por medio de las categorías?.
Es decir, cuando tal post esté bajo cierta categoría, entonces que tenga cierta plantilla.
@Fernando: claro, es sólo para páginas. En general, no me gusta ocupar posts para contenidos que no sean “periódicos”, o sea, que no tengan una relación cronológica entre sí, por ello es que preferí utilizar páginas.
Por otra parte, en el caso de las páginas el orden de jerarquía es inherente a ellas, en cambio en los posts sólo puedes crear jerarquías a través de categorías.
Al final, vale la pena recordar que WordPress, a pesar de tener características de CMS, está enfocado principalmente a weblogs; para este tipo de uso siempre habrá que “estirarlo” un poco. En lo personal sólo vale la pena como alternativa en cuanto lo conozco bastante, sé lo que se puede hacer con él (estirándolo) y tengo algo de experiencia desarrollando proyectos con él, y todo ello significa finalmente un ahorro de tiempo y esfuerzo; pero sin dudas que (de nuevo, en lo personal, y al menos para este proyecto en particular) hay otras plataformas (como Drupal) que se pueden ajustar bastante mejor a otros tipos de sitios.
Entiendo, pero a la larga no podría traer inconvenientes que ciertos en artículos se utilice en una estructura de páginas?.
Es decir, al escribir en páginas no se permite categorizar, o utilizar tags, y por lo tanto no habría manera de tener un Feed de sólo ese tipo de artículos, y por defecto creo que el sistema de búsqueda no busca en páginas, aunque de esto no estoy seguro.
Son dudas, obviamente desconozco los detalles del proyecto en el que trabajas e igual lo que te comento no importa. Pero como también me ha tocado trabajar en este tipo de proyectos en el que hay que sacarle el jugo como sea a WordPress a veces existen distintas soluciones con ventajas y desventajas.
@Fernando: claro, no permite categorizar sino jerarquizar, lo que en este caso era más útil; y con respecto a las tags, hay un par de plugins que permiten agregarlas a las páginas —en este caso utilicé Simple Tags.
Sobre la búsqueda, a partir de la versión 2.5 ya se incluyen las páginas en los resultados; pero feed de páginas si que no hay, aunque creo que vale la pena hacer la distinción de que los feeds son mayormente útiles para seguir las actualizaciones de contenidos que se van renovando periódicamente, por lo que no tiene sentido utilizarlos en contenidos que son permanentes.
Una gran ventaja de hacer esta distinción es que permite también mantener un blog como sistema de “noticias” o “anuncios”, en el que sí hayan contenidos que tengan que ver con una cierta cronología y al que los usuarios se puedan suscribir mediante RSS / e-mail; es decir, estos posts pueden convivir fácilmente con el contenido permanente del sitio, que en este caso son los números publicados por la revista.
Que tal estoy leyendo el articulo y hay algo que no entiendo bien.
Yo trabajo tambien con post parents y array sobretodo para los menu con id current o para colocar banners diferentes según categorias o pages.
Esta funcion ancestors suplanta el array osea, es lo mismo por ejemplo colocar;
ancestors))) echo ‘class=”menu-hover”‘; ?>
va a generar el mismo resultado?
PERDON AHI LE QUITE LAS ETIQUETAS DEL CODIGO
Que tal estoy leyendo el articulo y hay algo que no entiendo bien.
Yo trabajo tambien con post parents y array sobretodo para los menu con id current o para colocar banners diferentes según categorias o pages.
Esta funcion ancestors suplanta el array osea, es lo mismo por ejemplo colocar;
if (is_page(array(78,’80’,’82’,’83’))) echo ‘class=”menu-hover”‘;
if (is_page(array(78,$post->ancestors).)) echo ‘class=”menu-hover”‘;
va a generar el mismo resultado?
@nicolas: en verdad, no lo he intentado, pero creo que es probable que funcione de ese modo.
En mi caso, decidí usar este modo porque se irán agregando nuevos descendientes de una página en particular, por lo que en caso de hacerlo (y sin usar
$post->ancestorsde esta forma), tendría que haber editado el theme cada vez que agregara un nuevo descendiente, usando la funciónis_page(array(1,2,3...))[…] una vuelta por su código para descubrir funciones o variables no muy utilizadas (por ejemplo, $post->ancestors) pero que nos podrían […]
[…] __isset( $key ), y el que resulta mucho más interesante, __get( $key ), que por ejemplo, permite cargar los “ancestros” de una entrada sobre demanda (con “lazy loading”), pero además tiene la posiblidad de cargar […]
[…] WordPress: Encontrar los “ancestros” de una página (9) […]
[…] __isset( $key ), y el que resulta mucho más interesante, __get( $key ), que por ejemplo, permite cargar los “ancestros” de una entrada sobre demanda (con “lazy loading”), pero además tiene la posiblidad de cargar […]