Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Исключить текущую запись из выборки в php

АлександрВоробьёв Знаток (294), закрыт 7 лет назад
Есть кусок кода:

<?php
global $post;
$args = array( 'posts_per_page' => 4, 'offset'=> 0, );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>

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

<?php
global $post;
$args = array( 'posts_per_page' => 4, 'offset'=> 0, 'exclude'=>$post->ID, );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>

Но не удаётся. Может быть, кто-то сможет острым глазом или опытным взглядом определить, где промах? Чего именно в коде не хватает для исключения текущей записи?
Лучший ответ
Андрей Высший разум (428578) 7 лет назад
А если так:

$args = array( 'posts_per_page' => 4, 'offset'=> 0, 'post__not_in'=>array($post->ID));
АлександрВоробьёвЗнаток (294) 7 лет назад
Вот не знаю, что я делаю не так, но не работает.
Есть один момент: при первом запуске после добавления post__not_in или exclude, если я глюков не ловлю, срабатывает, пост исключается, но любой следующий запуск - и исключение не работает. Даже после перезапуска браузера, обновления страницы через Ctrl + F5 или открытия страницы в режиме инкогнито в хроме.
Либо один раз затупил и так показалось.
Но не получается, почему-то.
Андрей Высший разум (428578) Действительно, очень странно. Имеет смысл сразу после global $post; вставить var_dump($post) - чтобы посмотреть, что именно содержится в этой переменной.
АлександрВоробьёвЗнаток (294) 7 лет назад
Я нашёл, в чём прокололся! Я - идиот!
У меня выше тоже есть виджет (самых интересных статей) с функцией query_posts, но я не поставил после неё wp_reset_query(), и, соответственно, следующий виджет брал в качестве id самую интересную статью! Поэтому новые не фильтровались.

Ну, хоть увидел, исправил
Остальные ответы
Metotron Искусственный Интеллект (114866) 7 лет назад
foreach( $myposts as $pst )
{
if ($pst->ID == $post->ID) continue;
setup_postdata($post);
}
Правда, надо тогда брать 5 постов на страницу и в foreach делать break, если дошли до 4.
А вообще, неплохо бы вывести в var_dump() весь $myposts и $post->ID
АлександрВоробьёвЗнаток (294) 7 лет назад
Я прошу прощения, но вырванный из контекста не смог, видимо, в нужное место вставить код. Куда бы ни писал, в итоге получаю ошибку при выполнении.
Например:

<?php
global $post;
$args = array( 'posts_per_page' => 4, 'offset'=> 0, );
$myposts = get_posts( $args );
foreach( $myposts as $pst )
{
if ($pst->ID == $post->ID) continue;
setup_postdata($post);
}
?>

Или глупостями занимаюсь? Не то заменил?
Metotron Искусственный Интеллект (114866) Я не знаю, есть ли в $pst атрибут ID. Он может называться id, например. Я написал по аналогии с $post->ID, но может быть и не так. Он на это ругается или на что-то ещё?
АлександрВоробьёвЗнаток (294) 7 лет назад
Я нашёл, в чём прокололся! Я - идиот!
У меня выше тоже есть виджет (самых интересных статей) с функцией query_posts, но я не поставил после неё wp_reset_query(), и, соответственно, следующий виджет брал в качестве id самую интересную статью! Поэтому новые не фильтровались.

Ну, хоть увидел, исправил
Metotron Искусственный Интеллект (114866) Неудобный какой-то этот вордпресс, создаёт неявные переменные, о которых нужно помнить.
Похожие вопросы