Тема одной страницы, которая использует страницы для содержимого


Я создаю одностраничный сайт. На странице я хочу запустить 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>

Совет приветствуется! Спасибо.

Author: kaiser, 2012-10-24

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' );
 2
Author: kaiser, 2012-10-24 13:14:35

Если вы замените пули страниц их идентификаторами, то вы можете использовать параметр запроса "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;

?>
 0
Author: Parham, 2012-10-24 14:07:10