CPT'yi varsayılan ana sayfa olarak nasıl kullanırsınız?


20

Kendi sitesi kendi site yapılandırmak için özel yazı türlerini yoğun bir şekilde kullanacak bir müşteri var. Ama talep ettikleri ana sayfa için bir kaya ile zor bir yerdeyim.

Gerçekte, ana sayfa WordPress içinde belirli bir "sayfa" yığını olacaktır. Temel olarak şu sayfalar olacaktır: Giriş , Blog , Hakkımızda , Portföy ve Bize Ulaşın . Hepsinin üst üste yığılması sayesinde bir sayfadan diğerine geçebilirsiniz.

İlk içgüdüm sadece bir sayfa kullanmak ( Ana Sayfa ) ve sayfa sümüklerini kabul eden ve doğru sırayı (yani [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]) veren bir kısa kod gömmekti . Sayfa, işleri düzenlemek, döngüyü kontrol etmek ve sayfanın sol tarafına gezinme eklemek için özel bir sayfa şablonu kullanır. Ama hepsi klunky gibi görünüyor.

Benim İdeal çözeltisi (denilen özel yazı alanı oluşturmak olacaktır Yığın son kullanıcı sürükle-bırak ile sayfaları konumlandırmak ve düzeni ve gezinme ve bu tür CPT icabına olmasını sağlar).

İdeal çözümümle ilgili sorun ayarlar. WordPress, sitenin varsayılan ana sayfası için bir sayfa seçmenize izin verir. Ama bir Yayın türüne bağlı oluyor sayfasında ve kullanıcılar ayrıca seçmek böylece o değiştirmek için de kanca nerede emin değilim Yığını varsayılan giriş sayfası olarak.

Öyleyse, varsayılan ana sayfa için kullanılabilir sayfaların açılır menüsüne bir CPT eklemek için nereye bağlarım?

Yanıtlar:


11

Yararlı cevap için @toscho sayesinde, ama bana biraz acayip hissettim, bu yüzden biraz etrafına dürttüm ve bunun yerine bir filtre ekleyebileceğimi anladım:

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

Güncelleştirme

Yukarıdaki kodu ekledikten sonra, aslında, ana sayfa olarak özel bir yazı türü kullanabildim, ancak WordPress bir "sayfa" yazı tipi olmadığı için kalıcı bağlantıları yeniden yönlendiriyordu. Böylece http://localhost/testyönlendirme yapardım http://localhost/test/stacks/home-stack, istediğim bu değildi.

Bununla birlikte, bu eylemin eklenmesi sorunu çözdü ve özel yazı türümü giriş sayfasıyla birlikte sorgular:

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

Ben de böyle bir filtre ile oynadım, ancak ön sayfa sorgusu ile sınırlanmalıdır. Ve sonra bazı tuhaf davranışlar / hatalar tarafından dövüldüm: Sadece 404'üm var. Her neyse +1. :)
fuxia

İyi yakalama. Fonksiyonun içindeki ekstra koşullu ( post_typeönceden ayarlanmadığından ve page_id0 olmadığından emin olun ) tüm 404'leri engeller. Artık tüm özel yayınlarım, tüm yayınlarım ve tüm sayfalarım için herhangi bir müdahale olmadan sorgu çalıştırabilirim.
EAMann

@EAmann Kod için teşekkürler! Ön sayfanın başlığını Yazı Başlığı olarak değiştirmesine rağmen olması gerektiği gibi çalışır | Ana sayfa adı, bu yalnızca Ana Sayfa adı olarak değiştirilebilir mi?
INT

Bu hiç işe yaramıyor ... sunucu uyarıları / hataları: wpa18013_add_pages_to_dropdown () ve Tanımsız değişken
Dameer

8

Belki bu yüzden? Önceki çözümümün geliştirilmiş sürümü .

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

Bu yalnızca özel gönderi türünü seçmek içindir, ancak bu özel gönderi türünü ön sayfa olarak görüntülemez mi? yoksa bir şey mi kaçırıyorum?
Hameedullah Han

@Hameedullah - Bir kez seçtiğinizde, WordPress, ön sayfa için hangi sayfanın kullanılması gerektiğini işaretleyen bir seçeneği günceller. Daha sonra, bir kullanıcı ön sayfayı ziyaret ettiğinde, WordPress aynı seçeneği veritabanından tekrar okur.
EAMann

@Hameedullah Khan Haklısın. Bu 3.1'den önce çalıştı, şimdi yazının kalıcı bağlantısına yönlendirildim - ve 404 alıyorum. Garip. Keşke bunun için zamanım olsaydı. :(
fuxia

5

Neden yalnızca front-page.phpnormal bir sorgu / Döngü kullanan bir şablon dosyası oluşturmuyorsunuz veya (Ön Sayfada CPT'yi görüntülemek için özel bir Tema seçeneği ayarlanmışsa), CPT'ye dayalı olarak özel bir sorgu / Döngü çıkarır?

Sorun, Ön Sayfa çıktısını kontrol etmek için ayrı bir Tema seçeneği oluşturmanız ve aynı zamanda kullanıcılara Ön Sayfayı statik sayfaya ayarlamaları talimatını vermenizdir.

İşleri kolaylaştırmak için, register_settingAyarlar API'sı aracılığıyla yaptığınız çağrıdaki "Okuma" seçenek grubunu kullanarak Tema seçeneğinizi ayar okumaya bağlayabilirsiniz, böylece mevcut Ön Sayfa seçenekleriyle görüntülenir.


Ben basit çözümleri seviyorum ve Chip senin en iyisi olduğunu düşünüyorum. Wordpress, ön sayfa codex.wordpress.org/Template_Hierarchy#Home_Page_display için özel şablonlara izin verir ve daha sonra biri bunun içinde ne isterse yapabilir.
anmari

Bu en sürdürülebilir ve en kolay çözümdür. front-page.phpWordpress şablonu hiyerarşisinin parçası olduğu için otomatik olarak seçilir. Bunun neden olduğunu hatırlamaya gerek yok (veya bir sonraki kişi için işaretlemeniz gerekiyor).
Odys

2

EAMann'ın 2011'de güncellemesini yazmasından bu yana bir şeyler değişmiş olabilir ve artık sağladığı wpa18013_add_pages_to_dropdown () işlevi çalışmıyor. Dameer tarafından yapılan bir yorumda belirtildiği gibi, bu işlev şu anda (Aralık 2013) "wpa18013_add_pages_to_dropdown () için eksik argüman 2" hatası veriyor

Benim için çözüm, ikinci parametre veya içeriğinin kontrolü olmadan işlevi yeniden yazmaktı. Kodun tamamı şu şekilde olur:

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

Yukarıdaki örnekte, eklediğim özel yazı türünün "yığın" yerine "unbox_tabs" olduğunu lütfen unutmayın.


1

Bir eklenti bir şablon eklemek için bu tekniği kullanıyorum . Yani, @ ChipBennett'in çözümü geçerli değil.

Statik Sayfalar listesindeki eklentiden CPT'leri ( ) eklemek için @ EAMann'ın çözümünü aşağıdaki gibi değiştirdim: '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' );
}

Çekirdek referansı v3.4.2: 3.5 RC3'teki
satır numaralarının küçük farkı, ancak kod aynı kalıyor

/**
 * 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 );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.