¿Cómo usar un archivo de tipo de entrada personalizado como página de inicio?
Me gustaría usar un archivo de tipo de entrada personalizado como página de inicio del sitio, de modo que
http://the_site.com/
sea un archivo de tipo de entrada personalizado mostrado según mi archivo archive-{post-type}.php
.
Idealmente, me gustaría modificar la consulta usando is_front_page()
en mi archivo functions.php
. Intenté lo siguiente, con una página llamada "Inicio" como mi página principal:
add_filter('pre_get_posts', 'my_get_posts');
function my_get_posts($query){
global $wp_the_query;
if(is_front_page() && $wp_the_query === $query){
$query->set('post_type','album');
$query->set('posts_per_page',-1);
}
return $query;
}
pero la página de inicio está devolviendo el contenido de "Inicio" y parece estar ignorando la consulta personalizada.
¿Qué estoy haciendo mal? ¿Hay una mejor manera, en general, de hacer esto?
Después de configurar una página estática como tu página de inicio, puedes añadir esto a tu functions.php
y estarás listo. Esto también llamará correctamente a la plantilla archive-POSTTYPE.php
.
add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
//Asegurar que este filtro no se aplique al área de administración
if(is_admin()) {
return;
}
if($wp_query->get('page_id') == get_option('page_on_front')):
$wp_query->set('post_type', 'NOMBRE DEL TIPO DE ENTRADA PERSONALIZADO AQUÍ');
$wp_query->set('page_id', ''); //Vacío
//Establecer propiedades que describen la página para reflejar que
//realmente no estamos mostrando una página estática
$wp_query->is_page = 0;
$wp_query->is_singular = 0;
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
endif;
}

Esta función necesita if(is_admin()) return;
al principio, de lo contrario afectará el área de administración.

Aunque esto funcionó para mí, mis menús primario y secundario desaparecieron como resultado.

Está casi correcto. Este código está modificando todas las wp_queries, así que debería ser if ( is_home() ) en lugar de if ($wp_query->get.....)

Estoy usando lo mismo pero en mi plantilla de página personalizada en lugar de la página de inicio, y no muestra resultados (como si no se hubieran agregado publicaciones personalizadas). ¿Alguna idea?

Esta solución no admite paginación. Cualquier URL /page/2 sigue mostrando las primeras 10 publicaciones.

Renombra tu archivo de CPT a home.php
Luego usa pre_get_posts para modificar la consulta de la página de inicio para que solo se muestren los CPT
function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
}
}
add_action('pre_get_posts','wpsites_home_page_cpt_filter');
Reemplaza 'your-cpt' con el nombre de tu tipo de contenido personalizado.

Gracias por la respuesta ljaas—estaba buscando resolver exactamente este problema. Para conseguir que se llame la plantilla de archivo del tipo de entrada personalizado tuve que añadir las siguientes condiciones:
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;

Hola Eli, bienvenido a WPSE. Las "respuestas" están destinadas a responder la pregunta inicial (los sitios stackexchange no son foros de discusión con hilos). Esto encajaría mucho mejor como un comentario.

Esto funciona mejor para mí al sobrescribir tanto las entradas del blog como las páginas estáticas en Ajustes > Lectura > Tu página de inicio muestra:
<?php
/**
* Establece un tipo de entrada personalizado como archivo para la página de inicio.
*
* @since 1.0.0
*/
function ql_set_as_front_page( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( ql_is_front_page( $query ) ) {
$query->set( 'page_id', '' );
$query->is_page = false;
$query->is_singular = false;
$query->set( 'post_type', 'MYCPT' );
$query->is_archive = true;
$query->is_post_type_archive = true;
}
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );
/**
* Tomado de WP_Query::is_front_page y adaptado para comparar page_on_front con el ID de página actual.
*
* @since 1.0.0
*
* @param object $query La consulta principal WP Query.
*/
function ql_is_front_page( $query ) {
if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
return true;
elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
return true;
else
return false;
}
Lo estoy usando junto con una plantilla personalizada utilizando los filtros front_page_template
y home_template
para devolver una plantilla personalizada.

Para mí, rompe la paginación: ya sea que selecciones el índice o una página estática como página de inicio, los enlaces de paginación aparecen, pero al hacer clic en la página 2 obtengo:
- en caso de página índice (por defecto): la página 404
- en caso de página estática: los mismos resultados que la página 1: el argumento "paged" se interpreta entonces para mostrar la paginación del tipo de página, no la paginación de la lista del tipo de publicación.
Creo que se necesitan algunas reglas de reescritura para capturar el argumento "paged" y pasarlo correctamente.
De todos modos, una página de plantilla personalizada debería ser la solución con algunas reglas de reescritura adicionales.
