Cum să folosești arhiva unui tip de postare personalizat ca pagină principală?

12 oct. 2011, 05:16:34
Vizualizări: 19.8K
Voturi: 19

Aș dori să folosesc arhiva unui tip de postare personalizat ca pagină principală a site-ului, astfel încât

 http://the_site.com/

să fie o arhivă de tip de postare personalizat afișată conform fișierului meu archive-{post-type}.php.

Ideal, aș dori să modific query-ul folosind is_front_page() în fișierul meu functions.php. Am încercat următoarea variantă, cu o pagină numită "Home" setată ca pagină principală:

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

dar pagina principală returnează conținutul paginii "Home" și pare să ignore query-ul personalizat.

Ce fac greșit? Există o modalitate mai bună, în general, de a realiza acest lucru?

1
Comentarii

is_front_page() nu va funcționa cu pre_get_posts

Brad Dalton Brad Dalton
18 aug. 2014 08:05:30
Toate răspunsurile la întrebare 5
6
34

După ce ai setat o pagină statică ca pagină de start, poți adăuga acest cod în functions.php și ești gata de pornire. Acest lucru va apela și șablonul archive-POSTTYPE.php corect.

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Asigură-te că acest filtru nu se aplică în zona de administrare
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'NUMELE TIPULUI DE POSTARE AICI');
        $wp_query->set('page_id', ''); //Gol

        //Setează proprietățile care descriu pagina pentru a reflecta faptul că
        //nu afișăm de fapt o pagină statică
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}
12 oct. 2011 06:01:45
Comentarii

Această funcție are nevoie de if(is_admin()) return; chiar la început, altfel interferează cu zona de administrare.

brasofilo brasofilo
11 sept. 2013 03:01:22

Deși a funcționat pentru mine, meniurile mele principale și secundare au dispărut ca urmare.

super9 super9
19 apr. 2015 20:44:37

Este aproape corect. Acest cod modifică toate wp_queries, deci ar trebui să fie if ( is_home() ) în loc de if ($wp_query->get.....)

Leo Caseiro Leo Caseiro
10 iun. 2015 07:59:05

Folosesc același lucru, dar în șablonul meu personalizat de pagină în loc de pagina principală, și nu afișează niciun rezultat (ca și cum nu ar fi adăugate postări personalizate). Aveți idei?

trainoasis trainoasis
22 iul. 2018 10:33:27

Această soluție nu suportă paginare. Orice URL /page/2 afișează în continuare primele 10 postări.

rg89 rg89
19 iul. 2019 22:45:56

Pentru a suporta paginarea: 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 sept. 2019 10:58:19
Arată celelalte 1 comentarii
1

Redenumește arhiva CPT-ului tău în home.php

Apoi folosește pre_get_posts pentru a modifica interogarea paginii de acasă astfel încât să afișeze doar CPT-uri

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');

Înlocuiește your-cpt cu numele tipului tău de postare personalizată.

18 aug. 2014 08:03:08
Comentarii

în sfârșit, o explicație clară și practică!

Jack Jack
13 iun. 2015 18:56:16
2

Mulțumesc pentru răspuns, ljaas—chiar căutam să rezolv această problemă exactă. Pentru a asigura că șablonul de arhivă pentru tipul personalizat de postare este apelat, a trebuit să adaug următoarele condiții:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
19 iul. 2013 02:06:03
Comentarii

Salut Eli, bine ai venit pe WPSE. „Răspunsurile” sunt menite să răspundă la întrebarea inițială (site-urile stackexchange nu sunt forumuri de discuții ierarhizate). Acest lucru ar fi mult mai potrivit pentru un comentariu.

Johannes Pille Johannes Pille
19 iul. 2013 02:31:48

Mulțumesc pentru clarificare, Johannes. Exact asta credeam și eu, dar nu am reușit să înțeleg cum să comentez la răspuns, deoarece nu apare nicio opțiune de „adaugă comentariu”. Este o funcționalitate care devine disponibilă după un timp, sau sunt pur și simplu orb?

Eli Eli
20 iul. 2013 23:09:09
0

Pentru mine funcționează mai bine prin suprascrierea atât a articolelor de blog cât și a paginii statice în Setări > Citire > Afișare pagină principală:

<?php
/**
 * Setează arhiva de tip post personalizat ca pagină principală.
 *
 * @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' );

/**
 * Preluat din WP_Query::is_front_page și adaptat pentru a compara page_on_front cu ID-ul paginii curente.
 * 
 * @since 1.0.0
 * 
 * @param object $query Interogarea principală 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;
}

Folosesc acest cod împreună cu o suprascriere a șablonului utilizând filtrele front_page_template și home_template pentru a returna un șablon personalizat.

26 mar. 2015 03:31:20
0

Pentru mine, acest lucru strică paginarea: fie că selectezi pagina de index sau o pagină statică ca pagină principală, linkurile de paginare apar, dar când dai clic pe pagina 2, primesc:

  • în cazul paginii de index (implicită): pagina 404
  • în cazul paginii statice: aceleași rezultate ca pe pagina 1: argumentul "paged" este interpretat pentru a afișa paginarea tipului de pagină, nu paginarea listei de postări.

Cred că sunt necesare câteva reguli de rescriere pentru a captura argumentul "paged" și a-l transmite corect.

Oricum, o pagină de șablon personalizată ar trebui să fie soluția, împreună cu câteva reguli suplimentare de rescriere.

8 sept. 2015 17:04:15