Come utilizzare un archivio di custom post type come pagina iniziale?
Vorrei utilizzare un archivio di custom post type come pagina iniziale del sito, in modo che
http://the_site.com/
sia un archivio di custom post type visualizzato secondo il mio file archive-{post-type}.php
.
Idealmente vorrei modificare la query utilizzando is_front_page()
nel mio file functions.php
. Ho provato il seguente codice, con una pagina chiamata "Home" come pagina iniziale:
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;
}
ma la pagina iniziale sta restituendo il contenuto di "Home" e sembra ignorare la query personalizzata.
Cosa sto sbagliando? C'è un modo migliore, in generale, per affrontare questo problema?
Dopo aver impostato una pagina statica come pagina iniziale, puoi aggiungere questo codice al tuo file functions.php
e il gioco è fatto. Questo farà in modo che venga chiamato correttamente anche il template archive-POSTTYPE.php
.
add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
//Assicurati che questo filtro non venga applicato all'area di amministrazione
if(is_admin()) {
return;
}
if($wp_query->get('page_id') == get_option('page_on_front')):
$wp_query->set('post_type', 'NOME DEL CUSTOM POST TYPE QUI');
$wp_query->set('page_id', ''); //Vuoto
//Imposta le proprietà che descrivono la pagina per riflettere che
//non stiamo effettivamente mostrando una pagina statica
$wp_query->is_page = 0;
$wp_query->is_singular = 0;
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
endif;
}

Questa funzione ha bisogno di if(is_admin()) return;
all'inizio, altrimenti interferisce con l'area di amministrazione.

Anche se ha funzionato per me, i miei menu primario e secondario sono scomparsi come risultato.

È quasi corretto. Questo codice sta modificando tutte le wp_queries, quindi dovrebbe essere if ( is_home() ) invece di if ($wp_query->get.....)

Sto utilizzando lo stesso codice ma nel mio template di pagina personalizzato invece che nella frontpage, e non mostra alcun risultato (come se non fossero stati aggiunti post personalizzati). Qualche idea?

Questa soluzione non supporta l'impaginazione. Qualsiasi URL /page/2 mostra ancora i primi 10 post.

Rinomina il tuo archivio CPT in home.php
Quindi utilizza pre_get_posts per modificare la query della home page in modo che vengano visualizzati solo i 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');
Sostituisci your-cpt con il nome del tuo custom post type.

Ciao Eli, benvenuto su WPSE. Le "risposte" sono pensate per rispondere alla domanda iniziale (i siti stackexchange non sono forum di discussione threadati). Questo sarebbe molto più adatto come commento.

Questa soluzione funziona meglio per me sovrascrivendo sia i post del blog che le pagine statiche in Impostazioni > Lettura > Mostra la pagina iniziale come:
<?php
/**
* Imposta l'archivio del custom post type come pagina iniziale.
*
* @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' );
/**
* Adattato da WP_Query::is_front_page per confrontare page_on_front con l'ID della pagina corrente.
*
* @since 1.0.0
*
* @param object $query La query principale di WP.
*/
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;
}
Sto usando questa soluzione insieme a un override del template utilizzando i filtri front_page_template
e home_template
per restituire un template personalizzato.

Per me rompe la paginazione: sia che si selezioni l'indice o una pagina statica come homepage, i link della paginazione appaiono, ma cliccando sulla pagina 2 ottengo:
- nel caso della pagina indice (predefinita): la pagina 404
- nel caso di una pagina statica: gli stessi risultati della pagina 1: l'argomento "paged" viene interpretato per mostrare la paginazione del tipo di pagina, non la paginazione della lista del tipo di post.
Penso che siano necessarie alcune regole di riscrittura per catturare l'argomento paged e passarlo correttamente.
In ogni caso, una pagina template personalizzata dovrebbe essere la soluzione con alcune regole di riscrittura aggiuntive.
