Як використовувати архів спеціального типу публікації як основну сторінку?


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

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

Що я роблю неправильно? Чи є кращий спосіб, взагалі, робити це?


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;

}

Ця функція потрібна if(is_admin()) return;на самому початку, інакше вона поспішає з областю адмін.
brasofilo

1
Поки це працювало для мене, моє первинне та другорядне меню зникли в результаті.
super9

Це майже правильно. Цей код змінює всі wp_queries, тому він повинен бути if (is_home ()) замість if ($ wp_query-> get .....)
Лео Кейсіро

Я використовую те ж саме, але в моєму власному шаблоні сторінки замість передньої сторінки, і він не показує результатів (як би не додано спеціальних публікацій). Будь-які думки?
траїноз

Це рішення не підтримує підкачки. Будь-яка URL / сторінка / 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');

Замініть ваш-cpt на ім’я вашого спеціального типу публікації.


2
нарешті, чітке, дієве пояснення!
Джек

1

Дякую за відповідь ljaas - я хотів вирішити цю точну проблему. Для отримання шаблону архіву користувальницького типу публікації потрібно було додати наступні умови:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;

2
Привіт Елі, ласкаво просимо до WPSE. "Відповіді" призначені для відповіді на початкове запитання (stackexchange сайти не є потоковими дискусійними форумами ). Це було б набагато краще для коментаря .
Йоганнес Піл

Дякую за уточнення Йоганне. Це те, що я думав, хоча я не міг зрозуміти, як прокоментувати відповідь, оскільки немає доступної функції "Додати коментар". Це функція, що відрізняється часом, чи я сліпий?
Елі

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: потім "аргументований" аргумент інтерпретується для відображення сторінки сторінки тип сторінки, а не сторінки публікації списку типів публікацій.

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

У будь-якому випадку, користувацька сторінка шаблону повинна бути рішенням з деякими додатковими правилами перезапису.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.