web-dev-qa-db-fra.com

Comment utiliser une archive de type de publication personnalisée comme page d'accueil?

J'aimerais utiliser une archive de type publication personnalisée comme page de couverture d'un site, afin que

 http://the_site.com/

est une archive de type publication personnalisée affichée selon mon fichier archive-{post-type}.php.

Idéalement, j'aimerais modifier la requête en utilisant is_front_page() dans mon fichier functions.php. J'ai essayé ce qui suit, avec une page appelée "Accueil" comme page d'accueil:

 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;
 }

mais la page d'accueil renvoie le contenu de "Accueil" et semble ignorer la requête personnalisée.

Qu'est-ce que je fais mal? Y a-t-il une meilleure façon, en général, d’agir à ce sujet?

14
Isaac Lubow

Après avoir défini une page statique comme page d’accueil, vous pouvez l’ajouter à votre functions.php et vous êtes prêt à partir. Cela appellera également le modèle archive-POSTTYPE.php correctement.

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;

}
26
Ijaas

Renommez votre archive CPT en home.php

Puis utilisez pre_get_posts pour modifier la requête de la page d’accueil afin que seul l’affichage de 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');

Remplacez your-cpt par le nom de votre type de message personnalisé.

5
Brad Dalton

Merci pour la réponse ljaas - je cherchais à résoudre ce problème précis. Pour pouvoir appeler le modèle d'archive de type publication personnalisé, je devais ajouter les conditions suivantes:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
1
Eli

Cela fonctionne mieux pour moi en remplaçant les articles de blog et la page statique dans Paramètres> Lecture> Affichages page de garde:

<?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;
}

Je l'utilise conjointement avec un remplacement de modèle utilisant les filtres front_page_template et home_template pour renvoyer un modèle personnalisé.

0
Elliot

Pour moi, ça casse la pagination: soit vous sélectionnez l’index, soit une page statique comme page d’accueil, les liens de pagination apparaissent, mais en cliquant sur la page 2, j’obtiens:

  • en cas de page d'index (par défaut): la page 404
  • en cas de page statique: résultats identiques à ceux de la page 1: l'argument "paginé" est ensuite interprété pour afficher la pagination du type de page, et non la pagination de la liste des types de publication.

Je pense qu'il a besoin de règles de réécriture pour intercepter l'argument paginé et le transmettre correctement.

Quoi qu'il en soit, une page de modèle personnalisée devrait constituer la solution avec quelques règles de réécriture supplémentaires.

0
nderambure