Как использовать CPT в качестве домашней страницы по умолчанию?
-
22-10-2019 - |
Вопрос
У меня есть клиент, который будет использовать пользовательские типы публикаций для настройки своего сайта. Но я между камнем и тяжелым местом для их запрошенной домашней страницы.
На самом деле домашняя страница будет стопкой конкретных «страниц» в WordPress. По сути, будут страницы для: вступление, Блог, О нас, портфолио, а также Свяжитесь с нами. Анкет Все они будут сложены друг на друга, чтобы вы могли прокрутить с одной страницы на другую.
Моим первым инстинктом было просто использовать страницу (называемая Дом) и внедряет шорт -код, который принимает слизняки страниц и выводит правильный порядок (т.е. [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]
) На странице будет использоваться пользовательский шаблон страницы, чтобы выложить вещи, управлять циклом и добавлять навигацию в левую сторону страницы. Но все это кажется Клунки.
Мой идеал Решение будет заключаться в создании пользовательского типа поста (называемый Куча) Это позволяет конечному пользователю позиционировать страницы с помощью перетаскивания и заставить CPT позаботиться о макете, навигации и тому подобном.
Проблема с моим идеальным решением - это настройки. WordPress позволяет выбрать страницу для домашней страницы по умолчанию сайта. Но он привязан к типу поста страница, и я не уверен, где зацепить это, чтобы изменить это, чтобы пользователи также могли выбрать Куча Как домашняя страница по умолчанию.
Итак, где мне зацепить, чтобы добавить 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 );
Обновлять
После добавления приведенного выше кода я был, действительно, мог использовать пользовательский тип поста в качестве домашней страницы, но WordPress перенаправлял постоянные ссылки, потому что это был не тип «страницы». Так 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' );
Другие советы
Может быть, так? Уточненная версия Мое раннее решение.
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?
Проблема заключается в том, что вам придется создать отдельную опцию темы, чтобы управлять выводом на первой полосе, в то же время инструктируя пользователей установить первую страницу на статическую страницу.
Чтобы облегчить ситуацию, вы можете подключить вариант своей темы к чтению настроек, используя группу опций для чтения »в своем звонке к register_setting
через API настройки, так что он отображается с существующими параметрами на первой полосе.
Я думаю, что, возможно, что -то изменилось с тех пор, как Иманн написал свое обновление в 2011 году, и функция WPA18013_ADD_PAGES_TO_DROPDOWN (), которую он поставляет, больше не работает. Как упомянуто в комментарии Dameer, эта функция в настоящее время (декабрь 2013 г.) выбрасывает ошибку «отсутствующий аргумент 2 для wpa18013_add_pages_to_dropdown ()»
В любом случае, решением было переписать функцию без этого второго параметра или проверку его содержимого. Полный блок кода становится:
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' );
Обратите внимание, что в приведенном выше примере пользовательский тип поста, который я добавляю, является «UNBOX_TABS», а не «стек».
я использую эта техника Чтобы включить шаблон из плагина. Таким образом, решение @Chipbennett не применяется.
Чтобы добавить CPT ( 'hierarchical' => 'false'
) Из плагина в списке статических страниц я изменил решение @eamann следующим образом:
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' );
}
Ссылка на основное значение v3.4.2:
небольшая разница в номерах строк в 3,5 RC3, но код остается прежним
/**
* 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' => __( '— Select —' )
, '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 );