Создание цикла 'страницы записей' на основе самой страницы
Настройка Настройки -> Чтение -> Страница записей
установлена на моей странице 'Новости', и цикл для шаблона 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
.
Спасибо
Вы можете получить выбранную страницу для записей с помощью следующего кода:
$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);

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

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

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

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

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

Предположим, что вы используете home.php
, выводите основной цикл запросов как обычно, и хотите вывести дополнительный цикл, используя информацию о записи $post
для страницы page_for_posts
:
- Определите свой пользовательский запрос используя
WP_Query()
и соответствующие параметры записей. - Нацельтесь на обычный объект записи для страницы через `get_option( 'page_for_posts' )
- Выведите свой пользовательский цикл запросов
- Сбросьте
$post
, используяwp_reset_postdata()
. - Выведите основной цикл запросов
Например:
<?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
к основному циклу запросов.
