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

16

Я хотел бы использовать архив пользовательских типов записей в качестве главной страницы сайта, чтобы

 http://the_site.com/

архив пользовательских типов записей, отображаемый в соответствии с моим archive-{post-type}.phpфайлом

В идеале я хотел бы изменить запрос, используя is_front_page()в моем functions.phpфайле. Я попробовал следующее, со страницей под названием «Домой» в качестве моей главной страницы:

 add_filter('pre_get_posts', 'my_get_posts');
 function my_get_posts($query){
     global $wp_the_query;
     if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
     }
     return $query;
 }

но первая страница возвращает содержимое «Home» и, похоже, игнорирует пользовательский запрос.

Что я делаю неправильно? Есть ли вообще лучший способ сделать это?

Исаак Любов
источник
is_front_page () не будет работать с pre_get_posts
Брэд Далтон

Ответы:

27

После того, как вы установили статическую страницу в качестве домашней страницы, вы можете добавить ее к себе, functions.phpи все готово . Это будет archive-POSTTYPE.phpправильно вызывать шаблон.

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn't applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
        $wp_query->set('page_id', ''); //Empty

        //Set properties that describe the page to reflect that
        //we aren't really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}
Ijaas
источник
Эта функция нужна if(is_admin()) return;в самом начале, иначе она портится из админки.
Brasofilo
1
Хотя это сработало для меня, мои первичные и вторичные меню исчезли в результате.
super9
Это почти правильно. Этот код меняет все wp_queries, так что должно быть if (is_home ()) вместо if ($ wp_query-> get .....)
Leo Caseiro
Я использую то же самое, но на своем шаблоне пользовательской страницы вместо главной страницы, и он не показывает результатов (как будто никакие пользовательские сообщения не были добавлены). Есть предположения?
trainoasis
Это решение не поддерживает подкачку страниц. Любой URL / page / 2 по-прежнему показывает первые 10 сообщений.
rg89
6

Переименуйте свой архив CPT в home.php

Затем используйте pre_get_posts, чтобы изменить запрос домашней страницы, чтобы отображался только CPT

function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
    }
  }

add_action('pre_get_posts','wpsites_home_page_cpt_filter');

Замените your-cpt именем вашего пользовательского типа сообщения.

Брэд Далтон
источник
2
наконец, четкое, работоспособное объяснение!
Джек,
1

Спасибо за ответ ljaas - я искал решение именно этой проблемы. Для того, чтобы получить шаблон архива с настраиваемым типом записи, мне нужно было добавить следующие условия:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
Eli
источник
2
Привет Эли, добро пожаловать в WPSE. «Ответы» предназначены для ответа на первоначальный вопрос (сайты для обмена стеками не являются дискуссионными форумами ). Это было бы намного лучше подходит для комментария .
Йоханнес Пилль,
Спасибо за разъяснения, Йоханнес. Это то, что я подумал, хотя я не мог понять, как комментировать ответ, так как функция «Добавить комментарий» недоступна. Это особенность, чувствительная ко времени, или я слепой?
Эли
0

Это работает лучше для меня, переопределяя как сообщения в блоге, так и статическую страницу в Настройки> Чтение> Отображение главной страницы:

<?php
/**
 * Set custom post type archive as front page.
 *
 * @since 1.0.0
 */
function ql_set_as_front_page( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( ql_is_front_page( $query ) ) {
        $query->set( 'page_id', '' );
        $query->is_page = false;
        $query->is_singular = false;
        $query->set( 'post_type', 'MYCPT' );
        $query->is_archive = true;
        $query->is_post_type_archive = true;
    }
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );

/**
 * Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
 * 
 * @since 1.0.0
 * 
 * @param object $query The main WP Query.
 */
function ql_is_front_page( $query ) {
    if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
        return true;
    elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
        return true;
    else
        return false;
}

Я использую его в сочетании с переопределением шаблона с использованием фильтров front_page_templateи home_templateдля возврата пользовательского шаблона.

Эллиот
источник
0

Для меня это нарушает нумерацию страниц: либо вы выбираете индекс или статическую страницу в качестве домашней страницы, появляются ссылки на нумерацию страниц, но при нажатии на страницу 2 я получаю:

  • в случае страницы индекса (по умолчанию): страница 404
  • в случае статической страницы: те же результаты, что и на странице 1: аргумент "paged" интерпретируется таким образом, чтобы показать нумерацию страниц типа страницы, а не нумерацию списка типов записей.

Я думаю, что нужны некоторые правила переписывания, чтобы перехватить аргумент и передать его правильно.

В любом случае, пользовательская страница шаблона должна быть решением с некоторыми дополнительными правилами переписывания.

nderambure
источник