Come utilizzare un archivio di custom post type come pagina iniziale?

12 ott 2011, 05:16:34
Visualizzazioni: 19.8K
Voti: 19

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?

1
Commenti

is_front_page() non funzionerà con pre_get_posts

Brad Dalton Brad Dalton
18 ago 2014 08:05:30
Tutte le risposte alla domanda 5
6
34

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;

}
12 ott 2011 06:01:45
Commenti

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

brasofilo brasofilo
11 set 2013 03:01:22

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

super9 super9
19 apr 2015 20:44:37

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

Leo Caseiro Leo Caseiro
10 giu 2015 07:59:05

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?

trainoasis trainoasis
22 lug 2018 10:33:27

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

rg89 rg89
19 lug 2019 22:45:56

Per supportare l'impaginazione: if ( $query->get('paged') ) { $paged = $query->get('paged'); } elseif ( $query->get('page') ) { $paged = $query->get('page'); } else { $paged = 1; } $query->set('paged', $paged);

Jonathan Nicol Jonathan Nicol
26 set 2019 10:58:19
Mostra i restanti 1 commenti
1

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.

18 ago 2014 08:03:08
Commenti

finalmente, una spiegazione chiara e pratica!

Jack Jack
13 giu 2015 18:56:16
2

Grazie per la risposta ljaas—stavo cercando di risolvere proprio questo problema. Per far sì che venga chiamato il template dell'archivio del custom post type ho dovuto aggiungere le seguenti condizioni:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
19 lug 2013 02:06:03
Commenti

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.

Johannes Pille Johannes Pille
19 lug 2013 02:31:48

Grazie per la chiarificazione Johannes. È quello che pensavo, anche se non riuscivo a capire come commentare la risposta poiché non c'è alcuna opzione 'aggiungi commento' disponibile. Questa è una funzione sensibile al tempo, o sono cieco?

Eli Eli
20 lug 2013 23:09:09
0

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.

26 mar 2015 03:31:20
0

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.

8 set 2015 17:04:15