Как использовать wp_get_recent_posts в WordPress?
Я пытаюсь вывести заголовки и краткие описания последних 8 записей в боковой колонке.
Но получаю список, в котором:
- Все ссылки ведут к самой старой записи
- Все заголовки имеют вид "ID записи, которая должна отображаться" + "заголовок самой старой записи"
- Все описания берутся из самой старой записи
<?php
$args = array( 'numberposts' => '8' );
$recent_posts = wp_get_recent_posts( $args );
$noticias_highlight = true;
foreach( $recent_posts as $recent ){
?>
<div class="entry <?php if ($noticias_highlight) echo 'highlight'; $noticias_highlight = !$noticias_highlight; ?>">
<div class="title"><p><a href="<?php the_permalink($recent["ID"]); ?>"><?php the_title($recent["ID"]); ?></a></p></div>
<div class="subtitle"><?php the_excerpt($recent["ID"]); ?></div>
</div>
<?php
}
?>

Не используйте "вспомогательные" методы, они часто приносят больше проблем, чем пользы.
Каждый раз, когда вам нужно получить записи — будь то последние, самые старые, в определённой категории и т.д. — используйте цикл WP_Query
, вот его стандартная форма:
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// делаем что-то
}
wp_reset_postdata();
} else {
// записи не найдены
}
Именно это wp_recent_posts
делает внутри, хотя и не очень хорошо. Так что сохраните приведённый выше код в макрос автозаполнения вашего редактора.

Много ошибок в коде вопроса:
the_permalink()
не принимает аргументов и возвращает ссылку на текущую запись. Вместо этого используйтеecho get_permalink()
.the_title()
выводит заголовок текущей записи, и его первый аргумент — это строка, которая выводится перед заголовком. Именно поэтому заголовки получаются одинаковыми, но содержат числовые ID для правильных записей. Вместо этого используйтеecho get_the_title()
.the_excerpt()
не принимает аргументов и выводит анонс текущей записи. Не знаю, есть ли аналогичная функция, которая принимает ID записи в качестве аргумента.
Самое важное:
wp_get_recent_posts()
возвращает массив, содержащий по одному массиву для каждой записи (отсюда иforeach
). Поэтому вместоthe_title()
илиget_the_title()
заголовок можно получить через$array[post_title]
, анонс — через$array[post_excerpt]
(будет пустым, если анонс не задан, не усекает автоматически содержимое записи),$array[post_content]
для содержимого записи и т.д.wp_get_recent_posts()
, похоже, не использует цикл WordPress. Поэтому функции, работающие с текущей записью, будут всегда использовать одну и ту же запись. Именно это и происходит в примере.
И самое важное:
- Используйте
WP_Query()
вместоwp_get_recent_posts()
;

Вы можете использовать шорткод Display Posts в разметке вашего сайдбара. Плагин доступен по ссылке: http://wordpress.org/plugins/display-posts-shortcode/

Я предпочитаю не использовать плагин для простой функциональности, которую можно реализовать несколькими строками кода.
