問題描述
我有一個客户端,網站將大量使用自定義帖子類型來配置他們的網站。但是,我在一個岩石和一個困難的地方為他們要求的主頁。
實際上,主頁將是 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。