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

12 окт. 2011 г., 05:16:34
Просмотры: 19.8K
Голосов: 19

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

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;
}

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

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

1
Комментарии

is_front_page() не будет работать с pre_get_posts

Brad Dalton Brad Dalton
18 авг. 2014 г. 08:05:30
Все ответы на вопрос 5
6
34

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

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Убедимся, что этот фильтр не применяется в админ-панели
    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', ''); //Очищаем

        //Устанавливаем свойства, описывающие страницу, чтобы отразить,
        //что мы на самом деле не отображаем статическую страницу
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}
12 окт. 2011 г. 06:01:45
Комментарии

Этой функции нужно добавить if(is_admin()) return; в самом начале, иначе это нарушит работу административной области.

brasofilo brasofilo
11 сент. 2013 г. 03:01:22

Хотя это сработало для меня, в результате исчезли мои основное и дополнительное меню.

super9 super9
19 апр. 2015 г. 20:44:37

Почти правильно. Этот код изменяет все wp_queries, поэтому нужно использовать if ( is_home() ) вместо if ($wp_query->get.....)

Leo Caseiro Leo Caseiro
10 июн. 2015 г. 07:59:05

Я использую такой же код, но в своем пользовательском шаблоне страницы вместо главной, и он не показывает результатов (как будто не было добавлено ни одного произвольного типа записи). Есть идеи?

trainoasis trainoasis
22 июл. 2018 г. 10:33:27

Это решение не поддерживает постраничную навигацию. Любой URL с /page/2 по-прежнему показывает первые 10 записей.

rg89 rg89
19 июл. 2019 г. 22:45:56

Для поддержки пагинации: if ( $query->get('paged') ) { $paged = $query->get('paged'); } elseif ( $query->get('page') ) { $paged = $query->get('page'); } else { $paged = 1; } $query->set('paged', $paged);

Jonathan Nicol Jonathan Nicol
26 сент. 2019 г. 10:58:19
Показать остальные 1 комментариев
1

Переименуйте архив вашего 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 на название вашего пользовательского типа записи.

18 авг. 2014 г. 08:03:08
Комментарии

наконец-то понятное, рабочее объяснение!

Jack Jack
13 июн. 2015 г. 18:56:16
2

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

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
19 июл. 2013 г. 02:06:03
Комментарии

Привет, Eli, добро пожаловать на WPSE. "Ответы" предназначены для ответа на первоначальный вопрос (сайты stackexchange не являются форумами с ветвящимися обсуждениями). Это было бы гораздо уместнее в виде комментария.

Johannes Pille Johannes Pille
19 июл. 2013 г. 02:31:48

Спасибо за разъяснение, Johannes. Так я и думал, но не смог понять, как оставить комментарий к ответу, так как нет доступной функции 'добавить комментарий'. Это функция, доступная только через определенное время, или я просто ослеп?

Eli Eli
20 июл. 2013 г. 23:09:09
0

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

<?php
/**
 * Устанавливает архив произвольного типа записи в качестве главной страницы.
 *
 * @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' );

/**
 * Взято из WP_Query::is_front_page и адаптировано для сравнения page_on_front с ID текущей страницы.
 * 
 * @since 1.0.0
 * 
 * @param object $query Основной 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, чтобы возвращать пользовательский шаблон.

26 мар. 2015 г. 03:31:20
0

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

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

Думаю, здесь нужны дополнительные правила перезаписи, чтобы корректно обработать аргумент "paged" и передать его правильно.

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

8 сент. 2015 г. 17:04:15