¿Cómo usar un archivo de tipo de entrada personalizado como página de inicio?

12 oct 2011, 05:16:34
Vistas: 19.8K
Votos: 19

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?

1
Comentarios

is_front_page() no funcionará con pre_get_posts

Brad Dalton Brad Dalton
18 ago 2014 08:05:30
Todas las respuestas a la pregunta 5
6
34

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;

}
12 oct 2011 06:01:45
Comentarios

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

brasofilo brasofilo
11 sept 2013 03:01:22

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

super9 super9
19 abr 2015 20:44:37

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.....)

Leo Caseiro Leo Caseiro
10 jun 2015 07:59:05

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?

trainoasis trainoasis
22 jul 2018 10:33:27

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

rg89 rg89
19 jul 2019 22:45:56

Para admitir paginación: if ( $query->get('paged') ) { $paged = $query->get('paged'); } elseif ( $query->get('page') ) { $paged = $query->get('page'); } else { $paged = 1; } $query->set('paged', $paged);

Jonathan Nicol Jonathan Nicol
26 sept 2019 10:58:19
Mostrar los 1 comentarios restantes
1

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.

18 ago 2014 08:03:08
Comentarios

¡finalmente, una explicación clara y práctica!

Jack Jack
13 jun 2015 18:56:16
2

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;
19 jul 2013 02:06:03
Comentarios

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.

Johannes Pille Johannes Pille
19 jul 2013 02:31:48

Gracias por la aclaración Johannes. Eso es lo que pensaba, aunque no pude encontrar cómo comentar la respuesta ya que no hay una función 'añadir comentario' disponible. ¿Es esta una función que depende del tiempo o simplemente no la estoy viendo?

Eli Eli
20 jul 2013 23:09:09
0

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.

26 mar 2015 03:31:20
0

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.

8 sept 2015 17:04:15