¿Cómo utilizar un archivo de tipo de publicación personalizado como portada?

16

Me gustaría utilizar un archivo de tipo de publicación personalizado como página principal de un sitio, para que

 http://the_site.com/

es un archivo de tipo de mensaje personalizado que se muestra según mi archive-{post-type}.phparchivo.

Idealmente, me gustaría alterar la consulta usando is_front_page()en mi functions.phparchivo. 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 principal 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?

Isaac Lubow
fuente
is_front_page () no funcionará con pre_get_posts
Brad Dalton

Respuestas:

27

Después de establecer una página estática como página de inicio, puede agregarla a su página functions.phpy ya está listo. Esto también llamará a la archive-POSTTYPE.phpplantilla correctamente.

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn't applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
        $wp_query->set('page_id', ''); //Empty

        //Set properties that describe the page to reflect that
        //we aren't really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}
Ijaas
fuente
Esta función necesita if(is_admin()) return;desde el principio, de lo contrario, se mete con el área de administración.
brasofilo
1
Si bien esto funcionó para mí, mis menús primario y secundario desaparecieron como resultado.
super9
Es casi correctamente Este código está cambiando todos los wp_queries, por lo que debería ser if (is_home ()) en lugar de if ($ wp_query-> get .....)
Leo Caseiro
Estoy usando lo mismo pero en mi plantilla de página personalizada en lugar de la página principal, y no muestra resultados (como si no se hubieran agregado publicaciones personalizadas). ¿Alguna idea?
trainoasis
Esta solución no admite paginación. Cualquier URL / página / 2 todavía muestra las primeras 10 publicaciones.
rg89
6

Cambie el nombre de su archivo CPT a home.php

Luego use pre_get_posts para alterar la consulta de la página de inicio para que solo se muestre la 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');

Reemplace your-cpt con el nombre de su tipo de publicación personalizada.

Brad Dalton
fuente
2
finalmente, una explicación clara y viable!
Jack
1

Gracias por la respuesta ljaas: estaba buscando resolver este problema exacto. Para poder llamar a la plantilla de archivo de tipo de publicación personalizada, tuve que agregar las siguientes condiciones:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
Eli
fuente
2
Hola Eli, bienvenido a WPSE. Las "respuestas" están destinadas a responder la pregunta inicial (los sitios de intercambio de pila no son foros de discusión enhebrados ). Esto sería mucho mejor para un comentario .
Johannes Pille
Gracias por la aclaración Johannes. Eso es lo que pensé, aunque no pude averiguar cómo comentar la respuesta, ya que no hay una función de "agregar comentario" disponible. ¿Es esta una característica sensible al tiempo o soy ciego?
Eli
0

Esto funciona mejor para mí al anular las publicaciones de blog y la página estática en Configuración> Lectura> Visualizaciones de la página principal:

<?php
/**
 * Set custom post type archive as front page.
 *
 * @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' );

/**
 * Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
 * 
 * @since 1.0.0
 * 
 * @param object $query The main 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 anulación de plantilla usando los filtros front_page_templatey home_templatepara devolver una plantilla personalizada.

Elliot
fuente
0

Para mí, rompe la paginación: ya sea que seleccione el índice o una página estática como página de inicio, aparecen los enlaces de paginación, pero al hacer clic en la página 2 obtengo:

  • en caso de página de índice (predeterminado): la página 404
  • en caso de página estática: los mismos resultados que en la página 1: el argumento "paginado" se interpreta para mostrar la paginación de tipo de página, no la paginación de lista de tipo de publicación.

Creo que necesita algunas reglas de reescritura para captar el argumento paginado y pasarlo correctamente.

De todos modos, una página de plantilla personalizada debería ser la solución con algunas reglas de reescritura adicionales.

nderambure
fuente