Почему the_content() не работает на странице {single-custom_post_type.php}?
Этот код из моей страницы 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() (список параметров). Кто-нибудь может объяснить?
Вполне возможно, что ваш 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;

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

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

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

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

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

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

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

Некоторые данные записи недоступны в 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();
?>
Смотрите Доступ ко всем данным записи
