Тема одной страницы, которая использует страницы для содержимого
Я создаю одностраничный сайт. На странице я хочу запустить WP_Query три или четыре раза, чтобы вытащить эти 3-4 страницы.
Страница выглядит примерно так:
<div class="row">
<?php
$args = array( 'pagename' => 'page-1');
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
get_template_part('content');
endwhile;
endif;
// Reset Post Data
wp_reset_postdata();
?>
</div>
<div class="row">
<?php
$args = array( 'pagename' => 'page-2');
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
get_template_part('content');
endwhile;
endif;
// Reset Post Data
wp_reset_postdata();
?>
</div>
<div class="row">
<?php
$args = array( 'pagename' => 'page-3');
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
get_template_part('content');
endwhile;
endif;
// Reset Post Data
wp_reset_postdata();
?>
</div>
Конечно, я здесь повторяюсь, и это немного напрасно. Что я хочу сделать, так это использовать этот экземпляр WP_Query. Вот что я сделал, но, похоже, это вообще ничего не возвращает. Это должно быть что-то глупое, но я не вижу, что это может быть (в functions.php):
/**
* Functionize wp_query
*
* @since 0.1
*/
function waterstreet_fetch_page( $pagename ){
$args = array( 'pagename' => $pagename );
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
get_template_part('content');
endwhile;
endif;
// Reset Post Data
wp_reset_postdata();
}
Тогда, конечно, в моих файлах шаблонов я хочу иметь возможность просто запускать:
<div class="row">
<?php waterstreet_fetch_page('page-1'); ?>
</div>
<div class="row">
<?php waterstreet_fetch_page('page-2'); ?>
</div>
<div class="row">
<?php waterstreet_fetch_page('page-3'); ?>
</div>
Совет приветствуется! Спасибо.
2 answers
Как упростить свою жизнь
Я бы пошел довольно простым путем:
- Добавить страницу "главная/родительская"
- Примените свой шаблон там
- Добавьте "дочерние" страницы на эту главную страницу
- Измените запрос, чтобы включить их
Пример кода в качестве плагина для быстрого тестирования
Вот (непроверенный) плагин, который изменяет аргументы запроса, чтобы не только свести его к одному запросу, но и изменить основной запрос, поэтому никакого увеличения производительности не требуется принято.
Объяснение
Я не уверен, как вы могли бы получить идентификатор родительской записи (текущий) внутри функции. Я думаю, вам придется установить его вручную. В любом случае: попробуйте сделать это с помощью get_queried_object_id()
(что, скорее всего, не сработает) или посмотрите, сможете ли вы извлечь его из объекта $query
. Вы также можете прикрепить второй фильтр к post_clauses
и просто изменить аргументы в этом фильтре (где get_queried_object_id()
уже должен присутствовать - или нет).
Самое приятное, что делает эта функция, - это прикрепляет orderby
значение равно menu_order
, поэтому вы можете использовать то, что тип публикации страницы поддерживает по умолчанию. Imo вы всегда должны как можно больше использовать то, что предлагает core.
<?php
/** Plugin Name: (#70317) »kaiser« Fetch all child posts */
/**
* Calls the child pages
*
* @param object $query
* @return object $query
*/
function wpse70317_pre_get_posts( $query )
{
if (
! $query->is_home()
OR ! $query->is_front_page()
OR ! $query->is_main_query()
)
{
return $query;
}
$query->set( 'post_type', 'page' );
$query->set( 'post_status', 'inherit' );
// Allow the menu order (meta value) to be used
// ... and start with 0 and count up
$query->set( 'order', 'ASC' );
$query->set( 'orderby', 'menu_order' );
// Change this to your parent posts ID
$query->set( 'post_parent', 1 );
return $query;
}
add_action( 'pre_get_posts', 'wpse70317_pre_get_posts' );
Если вы замените пули страниц их идентификаторами, то вы можете использовать параметр запроса "post__in" и "страница" в качестве типа post_type в одном запросе:
<?php
$args = array( 'post_type' => 'page', 'post__in' => array(2, 3, 5));
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
get_template_part('content');
endwhile;
endif;
?>