Исключить только первое сообщение из одной категории из ленты последних сообщений, wordpress

Я администрирую веб-сайт (www.teknologia.no), работающий под управлением Wordpress. Как вы можете видеть на первой странице, у меня есть статья «главная/популярная» в верхней части страницы, показывающая последний пост из определенной категории. А под ним у меня есть основной цикл, показывающий все последние сообщения из всех категорий.

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

Мой вопрос, как говорится в моем заголовке: как я могу исключить самую новую / последнюю публикацию в определенной категории из всех последних сообщений.

Я знаю, что могу вручную управлять этим, изменяя категории через некоторое время и тому подобное, но я хочу, чтобы это делалось автоматически, и я не знаю, как это сделать.

Надеюсь, вы сможете уделить немного времени и помочь мне :)


person Lund    schedule 14.10.2013    source источник


Ответы (6)


Вам нужно будет обновить логику шаблона, чтобы основной цикл пропускал вывод сообщения, которое выводится вверху.

Не видя кода вашего шаблона, трудно сказать что-то конкретное, но что-то вроде этого, вероятно, сработает:

В верхнем разделе сохраните идентификатор поста, который вы выводите:

$exclude_post_id = get_the_ID();

Если вам нужно напрямую получить идентификатор последнего сообщения в данной категории, а не сохранять его во время цикла, вы можете сделать это следующим образом, используя WP_Query:

$my_query = new WP_Query('category_name=my_category_name&showposts=1');
while ($my_query->have_posts()):
    $my_query->next_post();
    $exclude_post_id = $my_query->post->ID;
endwhile;

Затем в основном цикле либо измените запрос, чтобы исключить это сообщение:

query_posts(array('post__not_in'=>$exclude_post_id));

или вручную исключить его внутри цикла, примерно так:

if (have_posts()): 
    while (have_posts()):
        the_post();
        if ($post->ID == $exclude_post_id) continue;
        the_content();
    endwhile;
 endif;

Дополнительная информация здесь, здесь и здесь.

person Duncan Lock    schedule 14.10.2013
comment
Спасибо, но как мне убедиться, что цикл последних сообщений всегда проверяет, что $top_post_id всегда содержит идентификатор последнего сообщения из определенной категории? - person Lund; 16.10.2013
comment
Я предположил, что ваш цикл последних сообщений уже работает — если это так, то вам не нужно — просто сохраните значение, возвращаемое get_the_id() или $post-›ID внутри цикла избранных сообщений, где вы выводите верхние post — это идентификатор поста, который вы выводите, и тот, который вы хотите исключить позже. По сути, когда вы выводите сообщение вверху, сохраните его идентификатор, а затем исключите этот идентификатор позже. - person Duncan Lock; 16.10.2013
comment
Проблема в том, что избранный пост получен из другого шаблона с использованием (get_template_part('includes/feat-slider')), и поэтому цикл рекомендуемого поста находится не в том же файле, что и последний цикл поста. Итак, если есть способ всегда получать идентификатор последнего сообщения в определенной категории. - person Lund; 16.10.2013
comment
Я обновил свой ответ, чтобы показать, как напрямую получить идентификатор последнего сообщения в данной категории, если вы не можете сохранить его во время цикла. - person Duncan Lock; 16.10.2013
comment
Большое спасибо! Я очень ценю это! Спасибо. - person Lund; 17.10.2013
comment
Если ответ решил вашу проблему, голосование за него поможет другим людям узнать, что это сработало, помогая тем, у кого может возникнуть аналогичная проблема в будущем. - person Duncan Lock; 18.10.2013

вот функция, которая делает именно это:

function get_lastest_post_of_category($cat){
$args = array( 'posts_per_page' => 1, 'order'=> 'DESC', 'orderby' => 'date', 'category__in' => (array)$cat);
$post_is = get_posts( $args );
return $post_is[0]->ID;

}

Использование: скажем, мой идентификатор категории равен 22, тогда:

$last_post_ID = get_lastest_post_of_category(22);

вы также можете передать этой функции массив категорий.

person Said Erraoudy    schedule 20.03.2015

Инициируйте переменную и проверьте внутри своего цикла. Простой способ:

$i=0;

while(have_posts() == true)
{
 ++$i;
 if($i==1) //first post
  continue;

 // Rest of the code
}
person seoul    schedule 14.10.2013

для этого вы можете использовать

query_posts('offset=1');

для получения дополнительной информации: блог

person Bhumi Shah    schedule 15.10.2013

Метод – 1

$cat_posts = new WP_Query('posts_per_page=1&cat=2'); //first 1 posts
while($cat_posts->have_posts()) { 
   $cat_posts->the_post(); 
   $do_not_duplicate[] = $post->ID;
}

//Then check this if exist in an array before display the posts as following.
 if (have_posts()) {
    while (have_posts()) {

    if (in_array($post->ID, $do_not_duplicate)) continue; // check if exist first post

     the_post_thumbnail('medium-thumb'); 

         the_title();

    } // end while
}

Метод 2

query_posts('posts_per_page=6&offset=1');
if ( have_posts() ) : while ( have_posts() ) : the_post();

Этот запрос указывает циклу отображать только 5 сообщений, которые следуют за самым последним первым сообщением. Важным элементом в этом коде является «смещение», и это волшебное слово выполняет все функции.

Подробнее здесь

person Sumith Harshan    schedule 15.01.2014

Исключить первый Из последних пяти постов

<?php 
   // the query
   $the_query = new WP_Query( array(
     'category_name' => 'Past_Category_Name',
      'posts_per_page' => 5,
              'offset' => 1
   )); 
?>
person Muhammad Bilal    schedule 12.01.2018