it-swarm.com.ru

Как использовать пользовательский тип записи в качестве главной страницы?

Я бы хотел, чтобы на первой странице сайта было одно сообщение из пользовательского типа. Мне удалось изменить запрос для моей главной страницы на пользовательский тип сообщения архив со следующим кодом (изначально размещен здесь ):

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',''); // empty
        // fix conditional functions
        $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, как мне бы хотелось, но он по-прежнему возвращает ВСЕ сообщения в категории "Альбомы", а не только один.

Добавление

$wp_query->set('posts_per_page',1);

не имеет никакого эффекта.

Что я должен делать вместо этого?

Дополнительный вопрос: есть ли где-нибудь хорошая справка о том, как манипулировать query таким образом?

5
Isaac Lubow

Самый простой способ отобразить один пост на главной странице:

global $wp_query;
$wp_query = new WP_Query( array( 'p' => 'POST ID HERE' ) );
include( 'single-POSTTYPE.php' );
2
Ijaas

Мне пришлось сделать то же самое для клиента, и я нашел два ресурса, которые мне помогли:

Как вы используете CPT в качестве домашней страницы по умолчанию?

http://wpquestions.com/question/show/id/2944

4
dwaser

Это решение, которое работает для меня:

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> на ваше машинное имя

1
Marco Panichi

https://wordpress.org/plugins/mpress-custom-front-page/ , похоже, правильно реализует правильную логику.

Github https://github.com/wpscholar/mpress-custom-front-page/

1
lkraav