SummArg | Cursos y recursos para webmasters

16/12/2010

Incluir páginas y subpáginas en WordPress

Estaba trabajando en un projecto en el que tenía que ingeniarmelas para colocar en el menú de cabecera las páginas hijas y las páginas padre, con sus respectivos condicionales para el caso de que no existieran subpáginas de un item. Afortunadamente me encontré con el blog de Gabriel Svennerberg en donde llegó a elaborar un código muy prolijo que pude utilizar para mi proyecto.

Este contenido está extraido del mencionado blog.

Chequear si la página tiene subpáginas

En primer lugar busqué un método en el codex de WordPress que ayude a determinar si la página actual tiene o no subpáginas, al no encontrarlo elaboré un modo de hacerlo. Básicamente se trata de llamar a las páginas hijas utilizando wp_list_pages() y ver si devuelve algo. No es lindo pero funciona.

$children = wp_list_pages('&child_of='.$post->ID.'&echo=0');
if($children) {
 // Si esta página contiene subpáginas...
}

Chequear si es una página padre o una subpágina

Lo siguiente que tuve que resolver fue el chequeo para conocer si la página actual es una página padre o es una subpágina. Esto se puede realizar con el siguiente código:

if(is_page() && $post->post_parent) {
 // Si es una subpágina
} else {
 // Es página padre
}

Cargando el submenu

Ahora necesitaba una forma de cargar las subpáginas. Esto se puede hacer utilizando la función wp_list_pages(). La parte complicada de esto es que no existe un modo para obtener la página padre y las subpáginas en una misma llamada, así que hay que llamar a la función dos veces y con ligeros cambios cada vez.

if(is_page() && $post->post_parent) {
 // Si es una subpágina
 $children = wp_list_pages("title_li=&include=".$post->post_parent ."&echo=0");
 $children .= wp_list_pages("title_li=&child_of=".$post->post_parent ."&echo=0");
} else if($has_subpages) {
    // Es una página contiene subpáginas
    $children = wp_list_pages("title_li=&include=".$post->ID ."&echo=0");
    $children .= wp_list_pages("title_li=&child_of=".$post->ID ."&echo=0");
}

Hay otros modos de hacer esto, pero el beneficio de este método es que automáticamente obtenemos class=”current_page_item” en el item que representa la página en la que actualmente estamos, lo cual es útil si queremos darle un estilo en particular.

Salida a HTML

El último paso consiste en imprimir el HTML, para lo que elegí una lista desordenada.

<?php // Chequear que haya algo para mostrar ?>
<?php if ($children) { ?>
<ul>
    <?php echo $children; ?>
</ul>
<?php } ?>

Colocando todo junto

Ahora es tiempo de colocar todas las piezas juntas. Este código puede colocarse en cualquiera de las secciones de tu theme.

<?php
$has_subpages = false;
// Chequea para ver si la página actual tiene subpáginas
$children = wp_list_pages('&child_of='.$post->ID.'&echo=0');
if($children) {
    $has_subpages = true;
}
// Reseting $children
$children = "";
// Llama a los items dependiendo si es una subpágina o página padre
if(is_page() && $post->post_parent) {
    // Si es una subpagina
    $children = wp_list_pages("title_li=&include=".$post->post_parent ."&echo=0");
    $children .= wp_list_pages("title_li=&child_of=".$post->post_parent ."&echo=0");
} else if($has_subpages) {
    // Si es una página padre que tiene subpáginas
    $children = wp_list_pages("title_li=&include=".$post->ID ."&echo=0");
    $children .= wp_list_pages("title_li=&child_of=".$post->ID ."&echo=0");
}
?>
<?php // Chequea que exista algo que mostrar ?>
<?php if ($children) { ?>
<ul>
    <?php echo $children; ?>
</ul>
<?php } ?>

Dejar un comentario