Как использовать архив пользовательских типов записей в качестве главной страницы?
-
-
is_front_page () не будет работать сpre_get_postsis_front_page() will not work with pre_get_posts
- 0
- 2014-08-18
- Brad Dalton
-
5 ответ
- голосов
-
- 2011-10-12
После того,как вы установили статическую страницу в качестве домашней страницы,вы можете добавить ее в свой
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; }
After you have set a static page as your home page you can add this to your
functions.php
and you are good to go. This will call thearchive-POSTTYPE.php
template correctly as well.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;` в самом начале,иначе она испортит админку.This function needs `if(is_admin()) return;` at the very beginning, otherwise it messes with the admin area.
- 0
- 2013-09-11
- brasofilo
-
Хотя это сработало для меня,в результате исчезли основные и второстепенные меню.While this worked for me, my primary and secondary menus disappeared as result.
- 1
- 2015-04-19
- super9
-
Это почти правильно.Этот код меняет все wp_queries,поэтому он должен бытьif (is_home ()) вместоif ($ wp_query->get .....)It's almost correctly. This code is changing all wp_queries, so it should be if ( is_home() ) instead of if ($wp_query->get.....)
- 0
- 2015-06-10
- Leo Caseiro
-
Я использую то же самое,но в моем шаблоне настраиваемой страницы вместо главной страницы,и он не показывает результатов (как будто не было добавлено никаких настраиваемых сообщений).Есть предположения?I'm using the same but on my custom page template instead of frontpage, and it shows no results (as if no custom posts were added). Any thoughts?
- 0
- 2018-07-22
- trainoasis
-
Это решение не поддерживает разбиение на страницы.Любой URL-адрес/page/2 по-прежнему показывает первые 10 сообщений.This solution doesn't support paging. Any /page/2 URL still shows the first 10 posts.
- 0
- 2019-07-19
- rg89
-
Для поддержки пагинации: если ($ query->get ('paged')) {$paged=$ query->get ('paged');} elseif ($ query->get ('page')) {$paged=$ query->get ('страница');} иначе {$paged=1;} $ query-> set ('paged',$paged);To support pagination: if ( $query->get('paged') ) { $paged = $query->get('paged'); } elseif ( $query->get('page') ) { $paged = $query->get('page'); } else { $paged = 1; } $query->set('paged', $paged);
- 1
- 2019-09-26
- Jonathan Nicol
-
- 2014-08-18
Измените имя вашего архива 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 именем своего пользовательского типа сообщения.
Re-name your CPT archive to home.php
Then use pre_get_posts to alter the home page query so only CPT's display
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');
Replace your-cpt with the name of your custom post type.
-
наконец-то четкое,работоспособное объяснение!finally, a clear, workable explanation!
- 2
- 2015-06-13
- Jack
-
- 2013-07-18
Спасибо за ответ ljaas - я искал решение именно этой проблемы.Чтобы вызвать шаблон архива произвольного типа сообщений,мне пришлось добавить следующие условия:
$wp_query->is_post_type_archive = 1; $wp_query->is_archive = 1;
Thanks for the answer ljaas—I was looking to solve this exact problem. In order to get the custom post type archive template to be called I had to add the following conditions:
$wp_query->is_post_type_archive = 1; $wp_query->is_archive = 1;
-
Привет,Эли,добро пожаловать в WPSE.«Ответы» предназначены для ответа на начальный вопрос (сайты stackexchange * не являются дискуссионными форумами *).Это было бы гораздо лучше для * комментария *.Hi Eli, welcome to WPSE. "Answers" are meant to answer the initial question (stackexchange sites are *not threaded discussion forums*). This would be a much better fit for a *comment*.
- 2
- 2013-07-18
- Johannes Pille
-
Спасибо за разъяснение,Йоханнес.Я так и думал,хотя не мог понять,как прокомментировать ответ,так как функции «добавить комментарий» нет.Это временная функция,или я слепой?Thanks for the clarification Johannes. That is what I thought, though I could not figure out how to comment on the answer as there is no 'add comment' feature available. Is this a time-sensitive feature, or am I blind?
- 0
- 2013-07-20
- Eli
-
- 2015-03-26
Это работает лучше,если я переопределяю как сообщения в блоге,так и статическую страницу в разделе «Настройки»> «Чтение»> «Отображение первой страницы»:
<?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
для возврата настраиваемого шаблона.This works better for me overriding both blog posts and static page in Settings > Reading > Front page displays:
<?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; }
I'm using it in conjunction with a template override using the filters
front_page_template
andhome_template
to return a custom template. -
- 2015-09-08
Для меня это нарушает разбиение на страницы: либо вы выбираете индекс,либо статическую страницу в качестве домашней страницы,отображаются ссылки для разбивки на страницы,но при нажатии на страницу 2 я получаю:
- в случае индексной страницы (по умолчанию): страница 404
- в случае статической страницы: те же результаты,что и на странице 1: аргумент "paged" затем интерпретируется для отображения разбивки на страницы по типу страницы,а не по списку типов сообщений.
Я думаю,что нужны некоторые правила перезаписи,чтобы перехватить выгружаемый аргумент и правильно передать его.
В любом случае,пользовательский шаблон страницы должен быть решением с некоторыми дополнительными правилами перезаписи.
For me it breaks the pagination : either you select the index or a static page as the home page, the pagination links shows up but when clicking on page 2 I get :
- in case of index page (default) : the 404 page
- in case of static page : the same results as page 1 : the "paged" argument is then interpreted to show the page type pagination, not the post type list pagination.
I think it needs some rewrite rules to catch the paged argument and pass it correctly.
Anyway, a custom template page should be the solution with some additional rewrite rules.
Я хотел бы использовать архив пользовательского типа сообщений в качестве главной страницы сайта,чтобы
- это архив пользовательского типа сообщений,отображаемый в соответствии с моим файлом
archive-{post-type}.php
.В идеале я хотел бы изменить запрос,используя
is_front_page()
в моем файлеfunctions.php
.Я попробовал следующее,со страницей под названием "Главная" в качестве главной страницы:но главная страница возвращает содержимое "Home" и,похоже,игнорирует пользовательский запрос.
Что я делаю не так?Есть ли вообще лучший способ сделать это?