Отображение последнего поста из категории на странице
Я хочу отобразить на странице содержимое последнего поста из категории.
Например, в категории foo
есть следующие посты:
- Hello World
- Hello Mars
- Foo bar
Учитывая, что Foo Bar является последней статьей из категории foo, ее содержимое должно быть отображено на странице:
<title>
<content>
Где <title>
это Foo bar и <content>
это содержимое поста.
Как я могу это сделать?
У меня возникли трудности с реализацией ответа @Pieter. Я добавил эти строки в functions.php
:
function latest_post() {
$args = array(
'posts_per_page' => 1, // нам нужен только последний пост, поэтому получаем только его
'cat' => '4' // Используйте ID категории, также можно заменить на category_name, который использует ярлык категории
);
$str = "";
$posts = get_posts($args);
foreach($posts as $post):
$str = $str."<h2>".$post->title."</h2>";
$str = $str."<p class='post-content-custom'>".$post->content."</p>";
endforeach;
return $str;
}
add_shortcode('latest_post', 'latest_post');
На странице я делаю:
[latest_post]
Однако ошибок не появляется, но содержимое поста не отображается.
Вы можете использовать WP_Query
, чтобы получить последнюю запись из категории и вывести её. Ознакомьтесь с параметрами категорий. По умолчанию WP_Query
использует тип записи post
и сортирует записи по дате, поэтому мы можем исключить эти параметры из запроса. Если вам нужно что-то другое, вы можете просто определить это в аргументах.
Вы можете попробовать что-то вроде этого:
$args = array(
'posts_per_page' => 1, // Нам нужна только последняя запись, поэтому получаем только её
'cat' => 'ID КАТЕГОРИИ', // Используем ID категории, можно также заменить на category_name, который использует slug категории
//'category_name' => 'SLUG КАТЕГОРИИ FOO',
);
$q = new WP_Query( $args);
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
// Ваши шаблонные теги и разметка, например:
the_title();
}
wp_reset_postdata();
}
Это даст вам основу, которую вы можете модифицировать, настраивать и использовать по своему усмотрению. Если вы не уверены в параметрах и их использовании, обратитесь к документации WP_Query
за помощью.
РЕДАКТИРОВАНИЕ
Я действительно не понимаю, почему вы решили изобретать велосипед и использовать get_posts
, когда я уже показал вам рабочий пример использования WP_Query
. Ваше использование get_posts
вместе со свойствами WP_Post
совершенно неверно.
Свойства
WP_Post
не фильтруются, поэтому их вывод будет совершенно необработанным и не будет выглядеть так же, как вывод шаблонных тегов, таких какthe_title()
илиthe_content()
. Вам необходимо применять соответствующие фильтры к этим свойствам.title
иcontent
— это неверные свойстваWP_POST
. Второй ответ совершенно неверен. Правильные свойства — этоpost_title
иpost_content
.Вы можете использовать шаблонные теги как обычно, просто применив
setup_postdata( $post );
, а затем вызвавwp_reset_postdata()
после этого.
Вы можете попробовать следующий вариант:
function latest_post() {
$args = array(
'posts_per_page' => 1, // Нам нужна только последняя запись, поэтому получаем только её
'cat' => '4' // Используем ID категории, можно также заменить на category_name, который использует slug категории
);
$str = "";
$posts = get_posts($args);
foreach($posts as $post):
$str = $str."<h2>". apply_filters( 'the_title', $post->post_title) ."</h2>";
$str = $str."<p class='post-content-custom'>". apply_filters( 'the_content', $post->post_content ) ."</p>";
endforeach;
return $str;
}
add_shortcode('latest_post', 'latest_post');

Вам нужно добавить его в шаблон, где требуется отображать этот пост. Не хочу показаться грубым, но мы ожидаем, что вы хотя бы знаете основы. :-)

Смотрите мою правку. Насколько я вижу, размер массива 1
, что ожидаемо, но я не понимаю, почему функция не возвращает нужный результат. Можете проверить код (и, возможно, добавить рабочую версию в ваш ответ)? Спасибо!

Вы можете сделать что-то подобное:::
$args = array(
'post_type' => '__post_type__',
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'ASC'
);
$posts = get_posts($args);
foreach($posts as $post):
echo $post->ID;
echo $post->title;
echo $post->content;
endforeach;

Куда мне это добавить? В контент страницы (редактируя в текстовом режиме)?

в шаблоне, части шаблона или файле functions.php, если вы используете шорткоды
