Cómo crear una portada personalizada en WordPress usando Genesis Framework

Cómo crear una portada personalizada en WordPress usando Genesis Framework
Photo by mauRÍCIO SANTOS / Unsplash

Uno de los aspectos que más me gusta de WordPress es que rara vez estamos obligados a aceptar el comportamiento predeterminado del sistema. Casi siempre existe alguna forma de personalizarlo sin modificar el núcleo ni complicar el mantenimiento del sitio.

En mi caso necesitaba que la portada de Cyberia.MX mostrara únicamente cierto contenido. Quería incluir las entradas normales del blog, pero excluir varias categorías que funcionan como secciones independientes. Además, deseaba que en la portada aparecieran algunos Custom Post Types que había creado para organizar películas, libros, aplicaciones y sitios web.

La solución era, naturalmente, un loop personalizado.

Sin embargo, no quería agregar más código al archivo functions.php, ya que toda esa lógica únicamente sería utilizada en la portada del sitio. Preferí encapsularla en una plantilla de página personalizada y utilizar esa plantilla como página principal del sitio.

Es cierto que Genesis Framework permite excluir categorías desde su configuración, lo cual resuelve parcialmente el problema. Sin embargo, definir la consulta directamente mediante WP_Query ofrece un control mucho mayor sobre el contenido que se mostrará.

Además, en el tema Prose, que utilizaba este sitio en ese momento, esa configuración simplemente no estaba funcionando como esperaba.

Por esa razón decidí implementar una portada completamente personalizada.

Crear la plantilla de página

El primer paso consiste en crear un nuevo archivo PHP dentro del tema. Para que WordPress lo reconozca como una plantilla únicamente necesitamos incluir el comentario Template Name.

<?php
/**
 * Plantilla de portada para Cyberia.MX
 *
 * @author Javier Sanchez
 * @package Prose
 * @subpackage Personalización
 */

/*
Template Name: Portada
*/

Con eso será suficiente para que la plantilla aparezca dentro de los atributos de cualquier página del administrador de WordPress.

Atributos de página en WordPress

Una vez creada la página (sin contenido) podremos asignarle esta plantilla y posteriormente configurarla como la portada estática del sitio desde Ajustes → Lectura.

Aunque WordPress la considera una "página estática", en realidad su contenido será completamente dinámico.

Sustituir el loop de Genesis

Genesis construye la página utilizando su propio loop. Lo primero que debemos hacer es eliminar ese comportamiento y registrar el nuestro.

remove_action('genesis_loop', 'genesis_do_loop');
add_action('genesis_loop', 'cyberia_home_loop');

A partir de este momento será la función cyberia_home_loop() la encargada de generar todo el contenido de la portada.

Construir la consulta personalizada

Genesis proporciona la función genesis_custom_loop(), que internamente utiliza los mismos argumentos que WP_Query.

Eso significa que prácticamente cualquier consulta que pueda realizarse con WordPress puede trasladarse a Genesis de forma muy sencilla.

En mi caso la consulta quedó así:

$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, 4, 1, 213
    )
);

Cada uno de estos argumentos cumple una función específica.

post_type

Por defecto WordPress únicamente consulta el tipo de contenido post.

Aquí indicamos que también queremos incluir los tipos de contenido personalizados:

  • películas
  • libros
  • aplicaciones

De esta forma todos ellos aparecen mezclados cronológicamente en la portada.

paged

Este parámetro mantiene funcionando correctamente la paginación.

Sin él, la portada siempre mostraría la primera página de resultados independientemente del número de página solicitado.

category__not_in

Este es el argumento más importante para este caso.

Recibe un arreglo con los identificadores de las categorías que no deben aparecer dentro del resultado de la consulta.

Esto resulta especialmente útil cuando algunas categorías funcionan como secciones independientes del sitio y no queremos duplicar su contenido en la portada.

Una vez definidos los argumentos simplemente los enviamos a genesis_custom_loop().

genesis_custom_loop($args);

Código completo

La plantilla completa queda de la siguiente manera.

<?php
/**
 * Plantilla de 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, 4, 1, 213
        )
    );

    genesis_custom_loop($args);
}

genesis();

La página asociada a esta plantilla no necesita contener ningún texto. Todo el contenido será generado automáticamente por el loop personalizado.

Además, seguimos teniendo disponibles todos los hooks y filtros de Genesis, por lo que podemos extender fácilmente el comportamiento de la portada sin afectar el resto del sitio.

¿Por qué utilizar una plantilla personalizada?

Una de las ventajas de este enfoque es mantener el código aislado.

En lugar de llenar functions.php con condiciones como:

if ( is_front_page() ) {
    ...
}

toda la lógica vive dentro de un único archivo que únicamente se ejecuta cuando WordPress carga esa plantilla.

En la práctica funciona como un functions.php exclusivo para la portada.

El mismo patrón puede utilizarse para construir páginas completamente personalizadas, landing pages, secciones especiales o cualquier otra vista que requiera un comportamiento distinto al del resto del sitio.

Actualización

La primera versión de este artículo contenía un error que provocaba que la portada siempre mostrara la primera página de resultados.

La solución consistió en agregar el siguiente argumento al arreglo de la consulta:

'paged' => get_query_var('page') ? get_query_var('page') : 1,

Con ese cambio la paginación volvió a funcionar correctamente.

Nota (2026)

Este artículo fue escrito para Genesis Framework clásico, anterior a Gutenberg y al sistema moderno de bloques de WordPress. Aunque el ecosistema ha evolucionado considerablemente, esta técnica sigue siendo válida para quienes mantienen sitios construidos sobre Genesis tradicional o temas hijos que continúan utilizando su sistema de hooks y plantillas.

!!! alert-info "Se necesita Genesis Framework"

El código mostrado en este artículo depende de **Genesis Framework** y no funcionará sobre una instalación estándar de WordPress sin dicho framework.