Почему the_content() не работает на странице {single-custom_post_type.php}?

19 сент. 2011 г., 18:52:27
Просмотры: 22.2K
Голосов: 8

Этот код из моей страницы single-publication.php.

Он выводит соответствующие произвольные поля и т.д. (здесь обернутые в теги шаблона), но the_content() не выводит содержимое записи. Я прибегнул к использованию $post->post_content (что работает), но загадка остается:

<div class="publication-info">
    <?php printf("<h2>%s</h2>", get_the_title() ); ?>
    <div class="publication-meta publication-credit"><?php the_publication_credit(); ?></div>
    <div class="publication-meta publication-date"><?php the_publication_date(); ?></div><br />
    <div class="publication-blurb" style="font-family:sans-serif;"><?php echo $post->post_content; // the_content() не работает. Почему? ?></div>
</div>

Что здесь происходит?

РЕДАКТИРОВАНИЕ: Я решил задать этот вопрос, потому что считал - ошибочно, как оказалось - что работающий $post и возвращение заголовка через get_the_title() являются железным доказательством того, что мы находимся внутри цикла. Но, очевидно, это не так. См. Codex о Цикле (второй параграф) и Codex о get_the_title() (список параметров). Кто-нибудь может объяснить?

2
Комментарии

Находится ли ваш блок publication-info внутри цикла?

Brian Fegter Brian Fegter
19 сент. 2011 г. 19:01:48

Я предполагаю, что да, так как $post заполнен и get_the_title() работает

djb djb
19 сент. 2011 г. 19:11:33
Все ответы на вопрос 2
7

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

if(have_posts()): while(have_posts()): the_post(); ?>

    <div class="publication-info">
        <?php printf("<h2>%s</h2>", get_the_title() ); ?>
        <div class="publication-meta publication-credit"><?php the_publication_credit(); ?></div>
        <div class="publication-meta publication-date"><?php the_publication_date(); ?></div><br />
        <div class="publication-blurb" style="font-family:sans-serif;"><?php echo $post->post_content; // the_content() не работает. Почему? ?></div>
    </div>

<?php endwhile; endif;
19 сент. 2011 г. 19:14:49
Комментарии

да, это работает. спасибо. но как я могу получить the_title() вне цикла? кодекс говорит $ID (int) (необязательно) ID записи или оставьте пустым, чтобы использовать текущую запись в цикле

djb djb
19 сент. 2011 г. 19:19:39

Потому что он использует объект $post, который установлен для страницы. Это действительно немного странно. Функция the_content() зависит от функции the_post().

Brian Fegter Brian Fegter
19 сент. 2011 г. 19:30:01

Да, вам нужно разместить функцию the_content() внутри цикла. Мне кажется, что the_content() должен быть установлен в файле single.php или post-type.php. Но по какой-то причине это не так. Вам все равно нужно иметь цикл в файле single.php или post-type.php.

Sisir Sisir
19 сент. 2011 г. 19:32:46

большое спасибо. последний вопрос: не могли бы вы указать на ресурс, который объясняет подробнее о том, когда и как устанавливается $post, если он не установлен в начале цикла? хотелось бы разобраться.

djb djb
19 сент. 2011 г. 19:39:56

@BrianFegter поправьте, если я ошибаюсь: в single-{post_type}.php всегда есть 1 пост. Поэтому while(have_posts()){} можно опустить. Разве не так?

Raptor Raptor
17 сент. 2013 г. 07:35:10

@ShivanRaptor Лучшие практики рекомендуют всегда включать цикл

Brian Fegter Brian Fegter
17 сент. 2013 г. 16:03:21

Я тоже запутался в этом. Может кто-то объяснить более понятно, почему заголовок доступен вне цикла, а содержимое - нет? @Brian, ты говоришь, что это потому что используется объект записи, установленный для страницы, но разве он не содержит также данные о содержимом? Что я упускаю, пожалуйста?

Robin Andrews Robin Andrews
29 окт. 2016 г. 17:38:48
Показать остальные 2 комментариев
0

Некоторые данные записи недоступны в get_posts по умолчанию, например, контент записи через the_content() или числовой ID. Это решается вызовом внутренней функции setup_postdata() с массивом $post в качестве аргумента:

<?php
$args = array( 'posts_per_page' => 3 );
$lastposts = get_posts( $args );
foreach ( $lastposts as $post ) :
  setup_postdata( $post ); ?>
    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    <?php the_content(); ?>
<?php endforeach; 
wp_reset_postdata();
?>

Смотрите Доступ ко всем данным записи

5 янв. 2015 г. 04:38:45