Come utilizzare un archivio di tipi di post personalizzato come prima pagina?


16

Vorrei utilizzare un archivio di tipi di post personalizzato come prima pagina di un sito, quindi

 http://the_site.com/

è un archivio di tipi di post personalizzato visualizzato in base al mio archive-{post-type}.phpfile.

Idealmente, vorrei modificare la query utilizzando is_front_page()nel mio functions.phpfile. Ho provato quanto segue, con una pagina chiamata "Home" come prima pagina:

 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 prima pagina restituisce il contenuto di "Home" e sembra ignorare la query personalizzata.

Che cosa sto facendo di sbagliato? C'è un modo migliore, in generale, di farlo?


is_front_page () non funzionerà con pre_get_posts
Brad Dalton,

Risposte:


27

Dopo aver impostato una pagina statica come pagina iniziale, puoi aggiungerla alla tua functions.phpe sei a posto. Questo chiamerà anche il archive-POSTTYPE.phpmodello correttamente.

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;

}

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

1
Mentre questo ha funzionato per me, i miei menu principale e secondario sono scomparsi di conseguenza.
super9,

È quasi correttamente. Questo codice sta cambiando tutte le wp_queries, quindi dovrebbe essere if (is_home ()) anziché if ($ wp_query-> get .....)
Leo Caseiro,

Sto usando lo stesso ma sul mio modello di pagina personalizzato anziché su frontpage e non mostra risultati (come se non fossero stati aggiunti post personalizzati). qualche idea?
trainoasi,

Questa soluzione non supporta il paging. Qualsiasi URL / page / 2 mostra ancora i primi 10 post.
rg89

6

Rinomina il tuo archivio CPT su home.php

Quindi utilizza pre_get_posts per modificare la query della home page in modo da visualizzare solo 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 tipo di post personalizzato.


2
finalmente una spiegazione chiara e fattibile!
Jack,

1

Grazie per la risposta ljaas: stavo cercando di risolvere questo esatto problema. Per ottenere il modello di archivio del tipo di posta personalizzato da chiamare, ho dovuto aggiungere le seguenti condizioni:

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

2
Ciao Eli, benvenuto in WPSE. Le "risposte" hanno lo scopo di rispondere alla domanda iniziale (i siti di stackexchange non sono forum di discussione threaded ). Questo sarebbe molto più adatto per un commento .
Johannes Pille,

Grazie per il chiarimento Johannes. Questo è quello che ho pensato, anche se non sono riuscito a capire come commentare la risposta in quanto non è disponibile la funzione "Aggiungi commento". È una funzione sensibile al tempo o sono cieco?
Eli,

0

Questo funziona meglio per me ignorando sia i post del blog sia la pagina statica in Impostazioni> Lettura> Schermate della prima pagina:

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

Lo sto usando in combinazione con una sostituzione del modello usando i filtri front_page_templatee home_templateper restituire un modello personalizzato.


0

Per me interrompe l'impaginazione: o selezioni l'indice o una pagina statica come pagina iniziale, vengono visualizzati i collegamenti di impaginazione ma quando faccio clic su pagina 2 ottengo:

  • in caso di pagina indice (impostazione predefinita): la pagina 404
  • in caso di pagina statica: gli stessi risultati della pagina 1: l'argomento "impaginato" viene quindi interpretato per mostrare l'impaginazione del tipo di pagina, non l'impaginazione dell'elenco dei tipi di post.

Penso che abbia bisogno di alcune regole di riscrittura per catturare l'argomento paginato e passarlo correttamente.

Ad ogni modo, una pagina di modello personalizzata dovrebbe essere la soluzione con alcune regole di riscrittura aggiuntive.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.