Bagaimana cara menggunakan arsip jenis posting khusus sebagai halaman depan?

16

Saya ingin menggunakan arsip jenis kiriman khusus sebagai halaman depan situs, jadi

 http://the_site.com/

adalah arsip jenis kiriman khusus yang ditampilkan menurut saya archive-{post-type}.php file .

Idealnya saya ingin mengubah kueri menggunakan file is_front_page()saya functions.php. Saya mencoba yang berikut, dengan halaman yang disebut "Beranda" sebagai halaman depan saya:

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

tetapi halaman depan mengembalikan konten "Beranda" dan tampaknya mengabaikan permintaan khusus.

Apa yang saya lakukan salah? Apakah ada cara yang lebih baik, secara umum, untuk melakukan hal ini?

Isaac Lubow
sumber
is_front_page () tidak akan berfungsi dengan pre_get_posts
Brad Dalton

Jawaban:

27

Setelah Anda menetapkan halaman statis sebagai halaman rumah Anda, Anda dapat menambahkan ini ke Anda functions.phpdan Anda baik untuk pergi. Ini akan memanggil archive-POSTTYPE.phptemplate dengan benar juga.

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
sumber
Fungsi ini perlu if(is_admin()) return;di awal, jika tidak mengacaukan area admin.
brasofilo
1
Sementara ini bekerja untuk saya, menu primer dan sekunder saya menghilang sebagai hasilnya.
super9
Hampir benar. Kode ini mengubah semua wp_queries, jadi seharusnya if (is_home ()) alih-alih if ($ wp_query-> get .....)
Leo Caseiro
Saya menggunakan yang sama tetapi pada templat halaman khusus saya alih-alih halaman depan, dan itu tidak menunjukkan hasil (seolah-olah tidak ada posting khusus yang ditambahkan). Adakah pikiran?
trainoasis
Solusi ini tidak mendukung paging. Setiap URL / halaman / 2 masih menampilkan 10 posting pertama.
rg89
6

Beri nama baru arsip CPT Anda ke home.php

Kemudian gunakan pre_get_posts untuk mengubah kueri beranda sehingga hanya tampilan 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');

Ganti cpt Anda dengan nama jenis posting kustom Anda.

Brad Dalton
sumber
2
akhirnya, penjelasan yang jelas dan bisa diterapkan!
Jack
1

Terima kasih atas jawabannya ljaas — saya ingin menyelesaikan masalah yang tepat ini. Untuk mendapatkan templat arsip jenis pos kustom yang harus dipanggil, saya harus menambahkan ketentuan berikut:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
Eli
sumber
2
Hai Eli, selamat datang di WPSE. "Jawaban" dimaksudkan untuk menjawab pertanyaan awal (situs stackexchange tidak berurutan di forum diskusi ). Ini akan jauh lebih cocok untuk komentar .
Johannes Pille
Terima kasih atas klarifikasi Johannes. Itulah yang saya pikirkan, meskipun saya tidak tahu bagaimana mengomentari jawabannya karena tidak ada fitur 'tambahkan komentar' yang tersedia. Apakah ini fitur yang sensitif terhadap waktu, atau saya buta?
Eli
0

Ini berfungsi lebih baik bagi saya untuk menimpa posting blog dan halaman statis di Pengaturan> Membaca> Tampilan halaman depan:

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

Saya menggunakannya bersama dengan template yang menimpa menggunakan filter front_page_templatedan home_templatemengembalikan template kustom.

Elliot
sumber
0

Bagi saya itu merusak pagination: baik Anda memilih indeks atau halaman statis sebagai halaman rumah, tautan pagination muncul tetapi ketika mengklik pada halaman 2 saya mendapatkan:

  • dalam hal halaman indeks (default): halaman 404
  • dalam kasus halaman statis: hasil yang sama seperti halaman 1: argumen "paged" kemudian ditafsirkan untuk menunjukkan pagination jenis halaman, bukan pagination daftar jenis posting.

Saya pikir perlu beberapa aturan penulisan ulang untuk menangkap argumen paged dan meneruskannya dengan benar.

Bagaimanapun, halaman templat khusus harus menjadi solusi dengan beberapa aturan penulisan ulang tambahan.

nderambure
sumber