Почему аргумент ignore_sticky_posts используется в запросе липких записей?
Мы все знаем, что ignore_sticky_posts
используется для исключения липких записей из вашего пользовательского запроса.
Но почему в документации по разработке тем WordPress они используют ignore_sticky_posts
при запросе липких записей?
$args = array(
'posts_per_page' => 1,
'post__in' => get_option( 'sticky_posts' ),
'ignore_sticky_posts' => 1
);
$query = new WP_Query( $args );
Это очень запутанно и не имеет смысла! Вы хотите получить липкие записи и при этом исключаете их?

Мы все знаем, что
ignore_sticky_posts
используется для исключения sticky-записей из вашего пользовательского запроса.
- Нет, это предположение ошибочно.
Что на самом деле означает ignore_sticky_posts
:
Хотя на естественном английском ignore_sticky_posts
звучит так, будто WordPress должен игнорировать все sticky-записи в запросе, на самом деле это не так. Вместо этого, аргумент 'ignore_sticky_posts' => 1
следует понимать следующим образом:
Когда
ignore_sticky_posts
установлен вtrue
или1
, WordPress будет игнорировать процедуру установки sticky-записей в вашем пользовательском запросе.
Что делает WordPress, когда ignore_sticky_posts
не установлен:
Чтобы чётко понять, что делает 'ignore_sticky_posts' => 1
, нужно разобраться, как WordPress ведёт себя, когда этот аргумент не установлен или установлен в false
/0
(по умолчанию):
Если в результатах запроса есть записи, которые являются sticky, WordPress переместит их в начало списка результатов.
Если какие-то sticky-записи отсутствуют в результатах запроса, WordPress снова получит их из базы данных и добавит в начало списка результатов.
Таким образом, когда аргумент установлен как 'ignore_sticky_posts' => 1
, WordPress просто пропускает эту процедуру, и всё. Он не исключает sticky-записи специально. Для этого нужно использовать аргумент post__not_in
.
Разбор примера из Codex:
Теперь рассмотрим пример из Codex:
$args = array(
'posts_per_page' => 1,
'post__in' => get_option( 'sticky_posts' ),
'ignore_sticky_posts' => 1
);
$query = new WP_Query( $args );
Здесь Codex использует 'ignore_sticky_posts' => 1
только для оптимизации, не более того. Даже без этого аргумента вы получите тот же ожидаемый результат:
$args = array(
'posts_per_page' => 1,
'post__in' => get_option( 'sticky_posts' )
);
$query = new WP_Query( $args );
Однако в этом случае, поскольку аргумент 'ignore_sticky_posts' => 1
не установлен, WordPress будет впустую выполнять всю процедуру перемещения sticky-записей в начало, даже если все результаты (в этом примере) состоят только из sticky-записей.
Лучший способ изучить что-то в WordPress — это исследовать исходный КОД. Для ещё более ясного понимания изучите эту часть кода WordPress.

WordPress должен включить ваш ответ на свою страницу с закрепленными записями!

Рад, что помог. Кодекс WordPress можно редактировать, и вы тоже можете внести правки и добавить этот ответ в качестве справочной информации для других ;)

Этот ответ сильно недооценен. Я возвращался к нему уже дважды с разницей в год. Вот насколько запутанным может быть этот параметр.

Вот альтернативный вариант, который, на мой взгляд, проще, хотя некоторые из уже предложенных идей тоже довольно хороши.
$args=array(
'post__not_in'=>get_option('sticky_posts')
// добавьте любые другие аргументы, которые вам нужны
);
$posts=new WP_Query($args);

Однако будьте осторожны при этом. Теоретически, этот список может стать очень длинным, что потенциально приведёт к тяжёлой нагрузке на базу данных. То, что делает ваш запрос, не является изначально задуманной функцией sticky-записей, как правильно объясняется в этом ответе: https://wordpress.stackexchange.com/a/260951/1763
