Comment utiliser une archive de type de publication personnalisée comme première page?

16

Je voudrais utiliser une archive de type de publication personnalisée comme première page d'un site, afin que

 http://the_site.com/

est une archive de type de publication personnalisée affichée en fonction de mon archive-{post-type}.phpfichier.

Idéalement, je voudrais modifier la requête à l'aide is_front_page()de mon functions.phpfichier. J'ai essayé ce qui suit, avec une page intitulée "Accueil" comme première page:

 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 première page 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, de procéder?

Isaac Lubow
la source
is_front_page () ne fonctionnera pas avec pre_get_posts
Brad Dalton

Réponses:

27

Après avoir défini une page statique comme page d'accueil, vous pouvez l'ajouter à votre functions.phpet vous êtes prêt à partir. Cela appellera également le archive-POSTTYPE.phpmodèle 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;

}
Ijaas
la source
Cette fonction a besoin if(is_admin()) return;au tout début, sinon elle gâche la zone d'administration.
brasofilo
1
Alors que cela fonctionnait pour moi, mes menus principal et secondaire ont disparu en conséquence.
super9
C'est presque correctement. Ce code modifie toutes les wp_queries, il devrait donc être if (is_home ()) au lieu de if ($ wp_query-> get .....)
Leo Caseiro
J'utilise le même mais sur mon modèle de page personnalisé au lieu de la page d'accueil, et il ne montre aucun résultat (comme si aucun message personnalisé n'a été ajouté). Des pensées?
trainoasis
Cette solution ne prend pas en charge la pagination. Toute URL / page / 2 affiche toujours les 10 premiers messages.
rg89
6

Renommez votre archive CPT en home.php

Utilisez ensuite pre_get_posts pour modifier la requête de la page d'accueil afin que seul l'affichage 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 publication personnalisé.

Brad Dalton
la source
2
enfin, une explication claire et réalisable!
Jack
1

Merci pour la réponse ljaas - je cherchais à résoudre ce problème exact. Afin d'obtenir le modèle d'archive de type de publication personnalisé à appeler, j'ai dû ajouter les conditions suivantes:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
Eli
la source
2
Salut Eli, bienvenue au WPSE. Les «réponses» sont censées répondre à la question initiale (les sites stackexchange ne sont pas des forums de discussion filetés ). Ce serait un bien meilleur ajustement pour un commentaire .
Johannes Pille
Merci pour la clarification Johannes. C'est ce que je pensais, même si je ne pouvais pas comprendre comment commenter la réponse car il n'y a pas de fonctionnalité «ajouter un commentaire» disponible. Est-ce une fonctionnalité urgente ou suis-je aveugle?
Eli
0

Cela fonctionne mieux pour moi, remplaçant à la fois les articles de blog et la page statique dans Paramètres> Lecture> La page d'accueil s'affiche:

<?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 en conjonction avec un remplacement de modèle à l'aide des filtres front_page_templateet home_templatepour retourner un modèle personnalisé.

Elliot
la source
0

Pour moi, cela rompt 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: mêmes résultats que la page 1: l'argument "paginé" est alors interprété pour montrer la pagination du type de page, pas la pagination de la liste des types de messages.

Je pense qu'il a besoin de quelques 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 être la solution avec des règles de réécriture supplémentaires.

nderambure
la source