Как отобразить содержимое страницы в шаблоне страницы?

11 мар. 2013 г., 20:16:23
Просмотры: 181K
Голосов: 14

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

Структура должна быть такой:
---------------------------

Заголовок страницы

содержимое страницы

Заголовок запрошенной записи

содержимое запрошенной записи
---------------------------

  • Что я могу сделать?
4
Комментарии

В чем проблема? Это шаблон страницы, поэтому у вас есть доступ к содержимому страницы. С помощью другого отдельного запроса вы можете получить доступ к конкретной записи, например, и таким образом вывести ее содержимое. И что?

tfrommen tfrommen
11 мар. 2013 г. 20:25:58

Пожалуйста, не спешите ставить минусы. Я долго бился над этим и затем нашел решение. Я попытался создать вопрос и ответ здесь, чтобы поделиться логикой с другими — думаю, это прояснит ситуацию так, как я искал. Надеюсь, вопрос и ответ понятны вам.

Mayeenul Islam Mayeenul Islam
11 мар. 2013 г. 20:41:22

Во-первых, я не ставил минус вашему вопросу. Во-вторых, спасибо, что делитесь своими знаниями с нами. Вы абсолютно правы, делая это. Полагаю, проблема в том (или была в том), что этот вопрос не был таким сложным для опытных пользователей/разработчиков WP, а также в том, что вы опубликовали только вопрос. Если вы хотите сразу задать вопрос и дать ответ, просто включите ваш ответ/решение прямо на той же странице, где пишете вопрос. Под кнопкой Опубликовать вопрос есть галочка Ответить на свой вопрос. Еще раз спасибо.

tfrommen tfrommen
11 мар. 2013 г. 21:10:00

wp_reset_postdata() приходит на помощь. Должно выполняться после каждого пользовательского запроса.

kaiser kaiser
11 мар. 2013 г. 22:06:47
Все ответы на вопрос 2
2
27

Я использую два цикла. Первый цикл предназначен для отображения содержимого страницы, а второй — для вывода содержимого запрошенных записей. Я добавил комментарии в код, где это необходимо. Я сделал акцент на циклах, так как Deckster0 сказал в службе поддержки WordPress, что the_content() работает только внутри цикла WordPress. Я размещаю этот код в своем собственном шаблоне:

<?php
/*
* Шаблон: Мой шаблон
*/
get_header(); ?>

<div id="container">
    <div id="content" class="pageContent">

    <h1 class="entry-title"><?php the_title(); ?></h1> <!-- Заголовок страницы -->
    <?php
    // ДЛЯ ОТОБРАЖЕНИЯ СОДЕРЖИМОГО СТРАНИЦЫ
    while ( have_posts() ) : the_post(); ?> <!-- Поскольку the_content() работает только внутри цикла WP -->
        <div class="entry-content-page">
            <?php the_content(); ?> <!-- Содержимое страницы -->
        </div><!-- .entry-content-page -->

    <?php
    endwhile; // сброс цикла страницы
    wp_reset_query(); // сброс запроса страницы
    ?>

    <?php
    // ДЛЯ ОТОБРАЖЕНИЯ СОДЕРЖИМОГО ЗАПИСЕЙ
    ?>                        
        <?php
        $my_query = new WP_Query( 'cat=1' ); // В качестве примера использована категория с ID 1
        ?>
        <?php if ( $my_query->have_posts() ) : ?>
        <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <?php while ($my_query->have_posts()) : $my_query->the_post(); ?>

            <h1 class="entry-title"><?php the_title(); ?></h1> <!-- Заголовок запрошенной записи -->
            <div class="entry-content">
                <?php the_excerpt(); ?> <!-- Краткое содержание запрошенной записи -->
            </div><!-- .entry-content -->

        <?php endwhile; // сброс цикла записей ?>

        </div><!-- #post-<?php the_ID(); ?> -->

        <?php
        wp_reset_postdata(); // сброс запроса записей
        endif;
        ?>

    </div><!-- #content -->         
</div><!-- #container -->
11 мар. 2013 г. 20:39:12
Комментарии

Второй запрос не должен находиться внутри if( have_posts() ), потому что это условие всегда будет истинным. Вам следует использовать if( $my_query->have_posts() ) после строки $my_query = new WP_Query( 'cat=1' ); и строк с аргументами, если вы хотите проверить наличие результатов в этом запросе.

t31os t31os
12 апр. 2013 г. 11:31:11

@t31os вы правы. Это моя ошибка. Теперь исправил код следующим образом. Спасибо за обнаружение. :)

Mayeenul Islam Mayeenul Islam
28 мая 2014 г. 16:28:30
0

Использование двух циклов — распространённый способ, но немного избыточный.

Каждая запись или страница даёт вам супер-переменную $post. Задумывались ли вы, почему ваш get_post_meta() работает с простым $post->ID ;) ?

Таким образом, перед началом работы с WP_Query(), которая получает ваши записи для списка, вы можете получить доступ к данным текущей страницы/записи через $post->ID, $post->post_content, $post->guid и так далее.

Внутри цикла эта переменная заполняется данными текущей записи. Чтобы сохранить её для дальнейшего использования, вы можете либо создать новую переменную:

$temp_post = $post

// new WP_Query() + цикл здесь

либо вызвать

wp_reset_query()

после формирования списка. Последнюю функцию следует вызывать в любом случае, чтобы убедиться, что данные в вашей боковой панели соответствуют текущей странице/записи.

11 мар. 2013 г. 23:34:43