Создание цикла 'страницы записей' на основе самой страницы

16 янв. 2013 г., 14:01:27
Просмотры: 508
Голосов: 0

Настройка Настройки -> Чтение -> Страница записей установлена на моей странице 'Новости', и цикл для шаблона home.php заполняется записями... отлично.

Однако я также хочу иметь возможность создать другой цикл (даже с помощью WP_Query, если потребуется), который будет содержать саму страницу, которую я указал как Страницу записей.

Когда я пытаюсь создать такой цикл, он возвращает множество записей вместо запрошенной страницы. Вот мой код, сравните аргументы с SQL-запросом:

<?php

    $page = new WP_Query(array('post_type' => 'page', 'page_id' => 39));
    print_r($page);

    // ЗАПРОС: SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'page' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10

?>

Как видите, SQL-запрос неверен. Я предполагаю, что поскольку я установил эту страницу как Страницу записей, это мешает мне использовать её в цикле.

Есть ли способ обойти это? Мне нужно использовать заголовок, содержимое и произвольные поля в шаблоне home.php.

Спасибо

0
Все ответы на вопрос 2
5

Вы можете получить выбранную страницу для записей с помощью следующего кода:

$page_for_posts = get_option( 'page_for_posts' );

Затем, получить запрашиваемую запись следующим образом:

$post = get_post( $page_for_posts );

И получить необходимые данные:

echo apply_filters( 'the_title', $post->post_title );
echo apply_filters( 'the_content', $post->post_content );
echo get_post_meta( $post->ID, $key, $single);
16 янв. 2013 г. 14:11:55
Комментарии

Спасибо, Майк, первые две части я получил, мне действительно нужно перезаписать цикл. Я пробовал использовать setup_postdata, но это тоже не сработало... похоже, WP не хочет, чтобы я это делал ;-)

Ben Everard Ben Everard
16 янв. 2013 г. 14:18:49

Что ты имеешь в виду под "мне действительно нужно перезаписать цикл"?

Chip Bennett Chip Bennett
16 янв. 2013 г. 14:23:00

Я неудачно сформулировал, так как моя страница 'Новости' — это 'Страница записей', цикл изначально заполняется для отображения ряда записей. Мне нужно создать новый цикл только для страницы, тем самым перезаписав глобальный объект $post. Чтобы функции типа the_title() работали без необходимости передавать ID.

Ben Everard Ben Everard
16 янв. 2013 г. 14:36:04

Хм, если setup_postdata действительно не работает, интересно, есть ли обходной путь для этого. Возможно, вы можете создать условный оператор на своей странице?

Mike Madern Mike Madern
16 янв. 2013 г. 15:15:54

"Мне нужно создать новый цикл только для страницы, тем самым перезаписывая глобальный объект $post. Чтобы функции типа the_title() работали без необходимости передавать ID" - Вы хотите, чтобы ваш пользовательский цикл был до или после основного цикла запроса? Какой код вы пробовали? Что произошло неожиданно или не произошло так, как ожидалось?

Chip Bennett Chip Bennett
16 янв. 2013 г. 17:43:58
0

Предположим, что вы используете home.php, выводите основной цикл запросов как обычно, и хотите вывести дополнительный цикл, используя информацию о записи $post для страницы page_for_posts:

  1. Определите свой пользовательский запрос используя WP_Query() и соответствующие параметры записей.
  2. Нацельтесь на обычный объект записи для страницы через `get_option( 'page_for_posts' )
  3. Выведите свой пользовательский цикл запросов
  4. Сбросьте $post, используя wp_reset_postdata().
  5. Выведите основной цикл запросов

Например:

<?php
/**
 * Файл шаблона для страницы блога: home.php
 */

get_header();

 // Сначала выведем ваш пользовательский цикл
$home_query_args = array(
    'page_id' => get_option( 'page_for_posts' )
);
$home_query = new WP_Query( $home_query_args );

if ( $home_query->have_posts() ) : while ( $home_query->have_posts() ) : $home_query->the_post();
    // Выводим ваш пользовательский запрос как обычно,
    // используя все стандартные теги шаблонов записей,
    // такие как the_title(), the_content(), the_permalink() и т.д.
endwhile; endif;

// ВАЖНО: Сбросить $post
wp_reset_postdata();

 // Теперь выведем основной цикл запросов
if ( have_posts() ) : while ( have_posts() ) : the_post();
    // Обычный вывод цикла здесь,
    // используя все стандартные теги шаблонов записей
endwhile; endif;

get_footer();

Секретный ингредиент здесь — wp_reset_postdata(). Он сбрасывает глобальную переменную $post к основному циклу запросов.

16 янв. 2013 г. 22:15:03