問題描述

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

實際上,主頁將是 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。