Отображение последнего поста из категории на странице

9 мар. 2015 г., 10:28:58
Просмотры: 36K
Голосов: 6

Я хочу отобразить на странице содержимое последнего поста из категории.

Например, в категории foo есть следующие посты:

    1. Hello World
    1. Hello Mars
    1. 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]

Однако ошибок не появляется, но содержимое поста не отображается.

0
Все ответы на вопрос 2
4

Вы можете использовать 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');
9 мар. 2015 г. 10:52:53
Комментарии

Куда мне нужно добавить этот код? Мне всё ещё неясно...

Ionică Bizău Ionică Bizău
9 мар. 2015 г. 10:54:17

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

Pieter Goosen Pieter Goosen
9 мар. 2015 г. 10:59:45

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

Ionică Bizău Ionică Bizău
11 мар. 2015 г. 21:56:07

Пожалуйста, ознакомьтесь с моим обновлением

Pieter Goosen Pieter Goosen
12 мар. 2015 г. 10:09:12
3
-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;
9 мар. 2015 г. 10:39:17
Комментарии

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

Ionică Bizău Ionică Bizău
9 мар. 2015 г. 10:44:47

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

Jorge Y. C. Rodriguez Jorge Y. C. Rodriguez
9 мар. 2015 г. 10:49:04

Можете ли вы отредактировать ваш пост с полными шагами по интеграции? Я не силён в PHP, но следование пошаговой инструкции должно сработать.

Ionică Bizău Ionică Bizău
9 мар. 2015 г. 10:53:06