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?
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;
}
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é.
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;
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é.
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:
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.