Как использовать wp_get_recent_posts в WordPress?

12 авг. 2013 г., 18:08:40
Просмотры: 18.3K
Голосов: 0

Я пытаюсь вывести заголовки и краткие описания последних 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
        } 
?>
0
Все ответы на вопрос 3
0
11

Не используйте "вспомогательные" методы, они часто приносят больше проблем, чем пользы.

Каждый раз, когда вам нужно получить записи — будь то последние, самые старые, в определённой категории и т.д. — используйте цикл 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 делает внутри, хотя и не очень хорошо. Так что сохраните приведённый выше код в макрос автозаполнения вашего редактора.

12 авг. 2013 г. 18:15:17
0

Много ошибок в коде вопроса:

  • 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. Поэтому функции, работающие с текущей записью, будут всегда использовать одну и ту же запись. Именно это и происходит в примере.

И самое важное:

12 авг. 2013 г. 19:07:12
2

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

12 авг. 2013 г. 20:24:52
Комментарии

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

That Brazilian Guy That Brazilian Guy
12 авг. 2013 г. 21:12:06

Не все, кто читает wordpress.stackoverflow, живут в PHP-коде. Некоторым просто нужно решить задачу. Зачем наказывать альтернативные решения?

dthorpe dthorpe
12 авг. 2013 г. 21:21:59