Cómo crear una portada personalizada en WordPress usando Genesis Framework
Les comparto el siguiente escenario: quiero que mi portada, la de Cyberia.MX muestre las entradas de algunas categorías, pero no todas. También quiero que muestro los tipos de entradas personalizados que he creado (Custom Post Types), por ejemplo, películas, aplicaciones, libros, sitios web.
La solución era, por supuesto un loop personalizado, pero para evitar llenar mi archivo functions.php
de código que solo se ejecutaría en una sola página, decidí crear una página personalizada y asignarla como mi página principal.
Es cierto que Genesis Framework permite especificar las categorías que quieres excluir — con referencia a la primera parte de mi problema —, pero me parece que me da un mejor control especificarlo dentro de los argumentos de mi loop personalizado.
Además, por alguna razón, en Prose (el tema que utiliza este sitio) esa configuración no era tomada en cuenta.
La solución total a esta serie de características es una página personalizada asignada como página estática — que no es una página estática, pero de eso hablaré en otro momento —.
Para poder incluir el código en esta página estática debemos crear primero una plantilla de página y esto es simple porque solo es necesario un comentario en el archivo .php
, aunque para efectos de clarificar el código, agrego algunos comentarios que ayudan a comprender el objetivo de la plantilla.
<?php
/**
* Este archivo crea la plantilla Portada para Cyberia.MX
*
* @author Javier Sanchez
* @package Prose
* @subpackage Personalización
*/
/*
Template Name: Portada
*/
Eso es suficiente para que esta plantilla aparezca como opción al momento de editar una página.
El siguiente paso es eliminar el loop por defecto y agregar una acción con el nuestro:
remove_action('genesis_loop', 'genesis_do_loop');
add_action ('genesis_loop', 'cyberia_home_loop');
Ahora que hemos declarado que el loop lo va a proporcionar la función cyberia_home_loop
vamos a declarar los argumentos para nuestro loop. Estos argumentos tienen el formato que se utiliza para la función WP_Query, ya que genesis_custom_loop
es una forma más potente y simplificada que la función original.
$args = array (
'post_type' => array( 'post','peliculas', 'libros', 'apps'),
'paged' => get_query_var('page') ? get_query_var('page') : 1,
'category__not_in' => array (34, 35, 36, 236,72, 210, 229,72,4,1,213)
);
Lo primero que hacemos es llamar a la variable global \(paged</code> para asegurar la correcta paginación del blog en la portada personalizada. La siguiente línea crea la variable <code>\)args
como un arreglo que contiene los tres argumentos de mi consulta personalizada:
post_type
— indica en un arreglo qué tipos de entradas van a consultarse, ya que de forma estándar solo se incluye el tipo'post'
, pero en mi caso hay tres tipos de entradas más.paged
— indica que debe seguirse el orden de paginación previamente configurado.category__not_in
— este es el que más me interesa, establece en un arreglo cuáles categorías no deben incluirse en la salida de la consulta.
Esta variable $args
la pasamos como argumento a la función genesis_custom_loop
en la siguiente línea de nuestra función:
genesis_custom_loop ( $args );
La última línea de nuestra página personalizada es la llamada al motor de nuestro blog:
genesis();
A continuación te muestro el código completo:
<?php
/**
* Este archivo crea la plantilla Portada para Cyberia.MX
*
* @author Javier Sanchez
* @package Prose
* @subpackage Personalización
*/
/*
Template Name: Portada
*/
remove_action('genesis_loop', 'genesis_do_loop');
add_action ('genesis_loop', 'cyberia_home_loop');
function cyberia_home_loop () {
$args = array (
'post_type' => array( 'post','peliculas', 'libros', 'apps'),
'paged' => get_query_var('page') ? get_query_var('page') : 1,
'category__not_in' => array (34, 35, 36, 236,72, 210, 229,72,4,1,213)
);
genesis_custom_loop ( $args );
}
genesis();
?>
Nuestra página no debe tener ningún contenido, al elegir esta plantilla el contenido se genera automáticamente. Y por supuesto tenemos todos los hook y filtros acostumbrados.
La ventaja de crear páginas personalizadas en Genesis Framework es que todas no es necesario crear pruebas condicionales para activar códigos cuando vemos la portada. Esta plantilla se llama automáticamente y todo el código dentro se ejecuta. Es como un archivo functions.php
exclusivo para la Portada.
Y claro que podemos tener plantillas personalizadas para categorías, post específicos, etiquetas, etc. Pero poco a poco iremos conociendo esta potente característica de Genesis Framework.
Actualización: Republico esta entrada porque el código anterior tenía un error que ocasionaba que siempre se presentara la página 1 en la portada. Por alguna razón que desconozco la variable global $paged no se tomaba en cuenta. Ahora sí.
Agregué esta línea que hace que todo funcione con normalidad.
'paged' => get_query_var('page') ? get_query_var('page') : 1,
Se necesita Genesis Framework
Recuerda, para poder utilizar el código mostrado en este artículo, es necesario contar con Genesis FrameWork.