Jak użyć niestandardowego archiwum typów postów jako strony głównej?

16

Chciałbym użyć niestandardowego archiwum typów postów jako strony głównej witryny, aby to zrobić

 http://the_site.com/

to niestandardowe archiwum typu post wyświetlane zgodnie z moim archive-{post-type}.phpplikiem.

Idealnie chciałbym zmienić zapytanie przy użyciu is_front_page()w moim functions.phppliku. Próbowałem, używając strony o nazwie „Strona główna” jako mojej strony głównej:

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

ale strona główna zwraca treść „Strona główna” i wydaje się ignorować niestandardowe zapytanie.

Co ja robię źle? Czy istnieje ogólnie lepszy sposób na to?

Izaak Lubow
źródło
is_front_page () nie będzie działać z pre_get_posts
Brad Dalton

Odpowiedzi:

27

Po ustawieniu strony statycznej jako strony głównej możesz ją dodać do swojej strony functions.phpi możesz zacząć. Spowoduje to również archive-POSTTYPE.phpprawidłowe wywołanie szablonu.

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;

}
Ijaas
źródło
Ta funkcja potrzebuje if(is_admin()) return;na samym początku, w przeciwnym razie zadziała z obszarem administracyjnym.
brasofilo
1
Chociaż zadziałało to dla mnie, moje menu główne i dodatkowe zniknęły w rezultacie.
super9,
Jest prawie poprawnie. Ten kod zmienia wszystkie wp_queries, więc powinien być taki, jeśli (is_home ()) zamiast if ($ wp_query-> get .....)
Leo Caseiro
Używam tego samego, ale na swoim niestandardowym szablonie strony zamiast na pierwszej stronie i nie wyświetla żadnych wyników (tak jakby nie dodano żadnych niestandardowych postów). jakieś pomysły?
trainoasis
To rozwiązanie nie obsługuje stronicowania. Każdy adres URL / page / 2 nadal pokazuje pierwsze 10 postów.
rg89
6

Zmień nazwę swojego archiwum CPT na home.php

Następnie użyj pre_get_posts, aby zmienić zapytanie na stronie głównej, aby wyświetlać tylko 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');

Zamień swój-cpt na nazwę niestandardowego typu posta.

Brad Dalton
źródło
2
wreszcie jasne, wykonalne wyjaśnienie!
Jack
1

Dzięki za odpowiedź, Ljaas - Chciałem rozwiązać dokładnie ten problem. Aby uzyskać niestandardowy szablon archiwum typu posta do wywołania, musiałem dodać następujące warunki:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
Eli
źródło
2
Cześć Eli, witamy w WPSE. „Odpowiedzi” mają na celu odpowiedzieć na pierwsze pytanie (witryny Stackexchange nieforami dyskusyjnymi na wątkach ). Byłoby to znacznie lepiej pasujące do komentarza .
Johannes Pille,
Dzięki za wyjaśnienie, Johannes. Tak myślałem, chociaż nie mogłem wymyślić, jak skomentować odpowiedź, ponieważ nie jest dostępna funkcja „dodaj komentarz”. Czy to funkcja wrażliwa na czas, czy też jestem ślepa?
Eli
0

To działa lepiej dla mnie, zastępując zarówno posty na blogu, jak i statyczną stronę w Ustawieniach> Czytanie> Strona główna wyświetla:

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

Używam go w połączeniu z zastąpieniem szablonu za pomocą filtrów front_page_templatei home_templatedo zwrócenia niestandardowego szablonu.

Elliot
źródło
0

Dla mnie łamie paginację: albo wybierasz indeks, albo stronę statyczną jako stronę główną, linki do stronicowania pojawiają się, ale po kliknięciu na stronę 2 otrzymuję:

  • w przypadku strony indeksu (domyślnie): strona 404
  • w przypadku strony statycznej: te same wyniki, co strona 1: argument „stronicowany” jest następnie interpretowany w celu pokazania stronicowania typu strony, a nie stronicowania listy typów postów.

Myślę, że potrzebuje pewnych reguł przepisywania, aby złapać argument stronicowany i przekazać go poprawnie.

W każdym razie niestandardowa strona szablonu powinna być rozwiązaniem z dodatkowymi regułami przepisywania.

nderambure
źródło