Bagaimana Anda menggunakan CPT sebagai laman beranda default?

20

Saya punya klien yang situsnya akan banyak menggunakan jenis posting khusus untuk mengonfigurasi situs mereka. Tapi saya berada di antara batu dan tempat yang sulit untuk halaman rumah yang diminta.

Pada kenyataannya, halaman beranda akan berupa setumpuk "halaman" tertentu di WordPress. Pada dasarnya, akan ada halaman untuk: Intro , Blog , Tentang Kami , Portofolio , dan Hubungi Kami . Mereka semua akan ditumpuk di atas satu sama lain sehingga Anda dapat menggulir dari satu halaman ke halaman lainnya.

Naluri pertama saya adalah hanya menggunakan halaman (disebut Home ) dan menyematkan kode pendek yang menerima siput halaman dan menampilkan urutan yang tepat (yaitu [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]). Halaman akan menggunakan templat halaman khusus untuk meletakkan berbagai hal, mengontrol lingkaran, dan menambahkan navigasi ke sisi kiri halaman. Tapi itu semua tampak klunky.

Solusi ideal saya adalah membuat jenis posting kustom (disebut Stack ) yang memungkinkan pengguna akhir untuk memposisikan halaman dengan drag-drop dan memiliki CPT mengurus tata letak dan navigasi dan semacamnya.

Masalah dengan solusi ideal saya adalah pengaturan. WordPress memungkinkan Anda untuk memilih halaman untuk halaman muka default situs. Tapi itu terkait dengan jenis halaman posting , dan saya tidak yakin di mana menghubungkannya untuk memodifikasi sehingga pengguna juga dapat memilih Stack sebagai halaman awal default.

Jadi, di mana saya menghubungkan ke dalam untuk menambahkan CPT ke dropdown halaman yang tersedia untuk halaman muka default?

EAMann
sumber

Jawaban:

11

Terima kasih kepada @toscho untuk jawaban yang bermanfaat, tapi rasanya agak meretas bagi saya, jadi saya mencari sedikit dan mencari tahu saya bisa menambahkan filter sebagai gantinya:

function wpa18013_add_pages_to_dropdown( $pages, $r ){
    if('page_on_front' == $r['name']){
        $args = array(
            'post_type' => 'stack'
        );
        $stacks = get_posts($args);
        $pages = array_merge($pages, $stacks);
    }

    return $pages;
}
add_filter( 'get_pages', 'wpa18013_add_pages_to_dropdown', 10, 2 );

Memperbarui

Setelah menambahkan kode di atas, saya memang bisa menggunakan jenis posting khusus sebagai beranda, tetapi WordPress akan mengarahkan ulang permalink karena itu bukan tipe posting "halaman". Jadi http://localhost/testakan diarahkan ke http://localhost/test/stacks/home-stack, yang bukan yang saya inginkan.

Namun, menambahkan tindakan ini, memperbaikinya dan menanyakan jenis pos kustom saya bersama dengan halaman untuk halaman beranda:

function enable_front_page_stacks( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}
add_action( 'pre_get_posts', 'enable_front_page_stacks' );
EAMann
sumber
Saya bermain dengan filter seperti itu juga, tetapi harus dibatasi untuk permintaan halaman depan. Dan kemudian saya dikalahkan oleh beberapa perilaku / bug aneh: Saya hanya 404-an. Pokoknya +1. :)
fuxia
Tangkapan yang bagus. Persyaratan ekstra di dalam fungsi (pastikan post_typebelum ditetapkan dan itu page_idbukan 0) mencegah semua 404s. Sekarang saya dapat menjalankan kueri untuk semua posting kustom saya, semua posting saya, dan semua halaman saya tanpa gangguan.
EAMann
@EAmann Terima kasih untuk kodenya! Ini berfungsi sebagaimana mestinya, meskipun itu mengubah judul halaman depan menjadi Judul Posting | Nama beranda, apakah ini bisa diubah menjadi nama beranda, di suatu tempat?
INT
Ini tidak berfungsi sama sekali ... peringatan / kesalahan server: Argumen yang hilang 2 untuk wpa18013_add_pages_to_dropdown () dan variabel Tidak
Terdefinisi
8

Mungkin begitu? Versi halus dari solusi saya sebelumnya .

add_filter( 'wp_dropdown_pages', 'add_cpt_to_front_page_dropdown', 10, 1 );


/**
 * Adds CPTs to the list of available pages for a static front page.
 *
 * @param  string $select Existing select list.
 * @return string
 */
function add_cpt_to_front_page_dropdown( $select )
{
    if ( FALSE === strpos( $select, '<select name="page_on_front"' ) )
    {
        return $select;
    }

    $cpt_posts = get_posts(
        array(
            'post_type'      => 'YOUR_POST_TYPE'
        ,   'nopaging'       => TRUE
        ,   'numberposts'    => -1
        ,   'order'          => 'ASC'
        ,   'orderby'        => 'title'
        ,   'posts_per_page' => -1
        )
    );

    if ( ! $cpt_posts ) // no posts found.
    {
        return $select;
    }

    $current = get_option( 'page_on_front', 0 );

    $options = walk_page_dropdown_tree(
        $cpt_posts
    ,   0
    ,    array(
            'depth'                 => 0
         ,  'child_of'              => 0
         ,  'selected'              => $current
         ,  'echo'                  => 0
         ,  'name'                  => 'page_on_front'
         ,  'id'                    => ''
         ,  'show_option_none'      => ''
         ,  'show_option_no_change' => ''
         ,  'option_none_value'     => ''
        )
    );

    return str_replace( '</select>', $options . '</select>', $select );
}
fuxia
sumber
Ini hanya untuk memilih jenis posting khusus, tetapi itu tidak membuatnya menampilkan jenis posting khusus sebagai halaman depan? atau aku melewatkan sesuatu?
Hameedullah Khan
@Hameedullah - Setelah Anda memilihnya, WordPress memperbarui opsi yang menandai halaman mana yang seharusnya digunakan untuk halaman depan. Kemudian, ketika pengguna mengunjungi halaman depan, WordPress membaca opsi yang sama kembali dari database.
EAMann
@Hameedullah Khan Anda benar. Ini berfungsi sebelum 3.1, sekarang saya dialihkan ke permalink pos - dan saya mendapatkan 404. Aneh. Saya berharap saya punya waktu untuk ini. :(
fuxia
5

Mengapa tidak hanya membuat front-page.phpfile templat, yang menggunakan kueri / Loop normal, atau (jika opsi Tema khusus diatur untuk menampilkan CPT pada Halaman Depan), menghasilkan kueri / Loop kustom, berdasarkan CPT?

Masalahnya adalah Anda harus membuat opsi Tema terpisah untuk mengontrol output Halaman Depan, sementara pada saat yang sama memerintahkan pengguna untuk mengatur Halaman Depan ke halaman statis.

Untuk mempermudah, Anda bisa mengaitkan opsi Tema Anda ke pengaturan-membaca, menggunakan grup opsi "Membaca" di panggilan Anda register_settingmelalui Pengaturan API, sehingga itu ditampilkan dengan opsi Halaman Depan yang ada.

Chip Bennett
sumber
Saya suka solusi sederhana dan saya pikir Chip Anda adalah yang terbaik. Wordpress memungkinkan templat khusus untuk halaman depan codex.wordpress.org/Template_Hierarchy#Home_Page_display dan kemudian orang dapat melakukan apa pun yang disukai di dalamnya.
anmari
Ini adalah solusi yang paling mudah dikelola dan langsung. Ini front-page.phpdipilih secara otomatis karena merupakan bagian dari hierarki template wordpress. Tidak perlu mengingat mengapa ini terjadi (atau perlu menandainya untuk orang berikutnya).
Odys
2

Saya pikir sesuatu mungkin telah berubah sejak EAMann menulis pembaruan pada tahun 2011, dan fungsi wpa18013_add_pages_to_dropdown () yang ia suplai tidak lagi berfungsi. Seperti yang disebutkan dalam komentar oleh Dameer, fungsi ini saat ini (Desember 2013) melempar kesalahan "Argumen 2 hilang untuk wpa18013_add_pages_to_dropdown ()"

Solusinya, bagi saya, adalah menulis ulang fungsi tanpa parameter kedua itu, atau memeriksa isinya. Blok penuh kode kemudian menjadi:

function add_unbox_tabs_to_dropdown( $pages ){
    $args = array(
        'post_type' => 'unbox_tabs'
    );
    $items = get_posts($args);
    $pages = array_merge($pages, $items);

    return $pages;
}
add_filter( 'get_pages', 'add_unbox_tabs_to_dropdown' );

function enable_front_page_unbox_tabs( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'unbox_tabs' );
}
add_action( 'pre_get_posts', 'enable_front_page_unbox_tabs' );

Harap perhatikan bahwa dalam contoh di atas, jenis posting khusus yang saya tambahkan adalah "unbox_tabs" daripada "stack".

Matthew Bernhardt
sumber
1

Saya menggunakan teknik ini untuk memasukkan templat dari sebuah plugin. Jadi, solusi @ ChipBennett tidak berlaku.

Untuk menambahkan CPT ( ) dari plugin dalam daftar Static Pages, saya memodifikasi solusi @ EAMann sebagai berikut: 'hierarchical' => 'false'

add_action( 'admin_head-options-reading.php', 'wpse_18013_modify_front_pages_dropdown' );
add_action( 'pre_get_posts', 'wpse_18013_enable_front_page_stacks' );

function wpse_18013_modify_front_pages_dropdown()
{
    // Filtering /wp-includes/post-templates.php#L780
    add_filter( 'get_pages', 'wpse_18013_add_cpt_to_pages_on_front' );
}

function wpse_18013_add_cpt_to_pages_on_front( $r )
{
    $args = array(
        'post_type' => 'stack'
    );
    $stacks = get_posts( $args );
    $r = array_merge( $r, $stacks );

    return $r;
}

function wpse_18013_enable_front_page_stacks( $query )
{
    if( '' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'] )
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}

Referensi inti v3.4.2:
sedikit perbedaan nomor baris dalam 3,5 RC3, tetapi kode tetap sama

/**
 * wp-admin/options-reading.php#L96
 * Happens inside a <li><label>-</label></li>
 */
    wp_dropdown_pages( array( 
                'name' => 'page_on_front'
            ,   'echo' => 0
            ,   'show_option_none' => __( '&mdash; Select &mdash;' )
            ,   'option_none_value' => '0'
            ,   'selected' => get_option( 'page_on_front' ) 
        ) 
    )

/**
  * wp-includes/post-template.php#L768
  */
function wp_dropdown_pages($args = '') {
    $defaults = array( /* defaults array */ );    
    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );  
    $pages = get_pages( $r );
brasofilo
sumber