Как использовать пользовательский тип записи в качестве главной страницы?
Я хочу установить главную страницу сайта как отдельную запись из пользовательского типа записи. Мне удалось изменить запрос для главной страницы на архив пользовательского типа записи с помощью следующего кода (оригинально опубликовано здесь):
function custom_front_page($wp_query){
if($wp_query->get('page_id')==get_option('page_on_front')){
$wp_query->set('post_type','album');
$wp_query->set('page_id',''); // очищаем
// исправляем условные функции
$wp_query->is_page = false;
$wp_query->is_archive = true;
$wp_query->is_post_type_archive = true;
}
}
add_action('pre_get_posts','custom_front_page');
Если заменить
$wp_query->is_archive = true;
$wp_query->is_post_type_archive = true;
на
$wp_query->is_single = true;
то будет вызываться шаблон single-album.php
, как мне и нужно, но при этом возвращаются ВСЕ записи из категории "Albums", вместо одной.
Добавление
$wp_query->set('posts_per_page',1);
не даёт эффекта.
Что я должен сделать вместо этого?
Бонусный вопрос: есть ли где-то хороший справочник по манипуляции с query
таким образом?

Мне пришлось делать то же самое для клиента, и я нашел два полезных ресурса, которые мне помогли:
Как использовать пользовательский тип записи (CPT) в качестве главной страницы?

Ответы должны быть больше, чем просто ссылки. Они должны действительно содержать решение проблемы, а не просто направлять туда, где пользователь возможно найдёт ответ. Пожалуйста, помогите предотвратить устаревание ссылок, [отредактируйте] свой ответ и предоставьте необходимую информацию, которая поможет автору вопроса и будущим посетителям решить их проблему.

Вот решение, которое сработало у меня:
function add_<MYTPE>_to_dropdown( $pages, $r )
{
// Добавляем пользовательский тип записи в выпадающий список страниц
if('page_on_front' == $r['name'])
{
$args = array(
'post_type' => '<MYTYPE>' // Указываем тип записи
);
$items = get_posts($args);
$pages = array_merge($pages, $items); // Объединяем страницы с пользовательскими записями
}
return $pages;
}
add_filter( 'get_pages', 'add_<MYTPE>_to_dropdown' );
function enable_front_page_<MYTPE>( $query )
{
// Разрешаем использовать пользовательский тип записи в качестве главной страницы
if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
$query->query_vars['post_type'] = array( 'page', '<MYTPE>' ); // Добавляем тип записи в запрос
}
add_action( 'pre_get_posts', 'enable_front_page_<MYTPE>' );
Просто замените <MYTYPE>
на машинное имя вашего пользовательского типа записи

Это больше не работает. Вам нужно избавиться от второго аргумента $r
. Лучше использовать ответ Мэтью: http://wordpress.stackexchange.com/a/126271/30597

https://wordpress.org/plugins/mpress-custom-front-page/ похоже реализует правильную логику в чистом виде.
Github https://github.com/wpscholar/mpress-custom-front-page/
