問題描述

我有一個客戶端,網站將大量使用自定義帖子型別來配置他們的網站。但是,我在一個岩石和一個困難的地方為他們要求的主頁。

實際上,主頁將是 WordPress 中特定”pages” 的堆疊。基本上,將有一些頁面:簡介,部落格,關於我們,投資組合和聯絡我們。它們將被堆疊在一起,以便您可以從一個頁面滾動到另一個頁面。

我的第一本能就是使用一個頁面 (稱為 Home),並嵌入一個接受頁面段落並輸出正確順序的短程式碼 (即 [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]) 。該頁面將使用自定義頁面模板來放置東西,控制迴圈,並在頁面的左側新增導航。但是,這一切似乎都很瘋狂。

我的理想解決方案是建立一個自定義帖子型別 (稱為 Stack),允許終端使用者使用 drag-drop 定位頁面,並讓 CPT 處理佈局和導航等。

我的理想解決方案的問題是設定。 WordPress 允許您選擇網站的預設主頁的頁面。但它繫結到一個 post 型別的頁面,我不知道在哪裡可以修改,以便使用者也可以選擇一個 Stack 作為預設主頁。

那麼,為了將 CPT 新增到預設主頁的可用頁面的下拉式清單中,我在哪裡掛鉤?

最佳解決方案

感謝 @toscho 的有用的答案,但它感覺有點駭客給我,所以我戳了一下,想出我可以新增一個過濾器:

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

Update

新增上述程式碼之後,確實可以使用自定義帖子型別作為主頁,但 WordPress 會重定向固定連結,因為它不是”page” 帖子型別。所以 http://localhost/test 會重定向到 http://localhost/test/stacks/home-stack,這不是我想要的。

然而,新增此操作會修復並查詢我的自定義帖子型別以及主頁的頁面:

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

次佳解決方案

也許是這樣?精煉版 my earlier solution

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

第三種解決方案

為什麼不建立一個使用普通查詢/迴圈的 front-page.php 模板檔案,或者 (如果在主頁上設定了自定義主題選項來顯示 CPT),則會根據 CPT 輸出自定義查詢/迴圈?

問題在於,您必須建立一個單獨的主題選項來控制 Front Page 輸出,同時指示使用者將 Front Page 設定為靜態頁面。

為了使事情變得更簡單,您可以使用 「設定」API 呼叫 register_setting 中的 「閱讀」 選項組將主題選項掛接到 settings-reading 中,以便使用現有的 Front-Page 選項顯示。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。