Почему аргумент 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 можно редактировать, и вы тоже можете внести правки и добавить этот ответ в качестве справочной информации для других ;)
Fayaz
Этот ответ сильно недооценен. Я возвращался к нему уже дважды с разницей в год. Вот насколько запутанным может быть этот параметр.
Benji
Вот альтернативный вариант, который, на мой взгляд, проще, хотя некоторые из уже предложенных идей тоже довольно хороши.
$args=array(
'post__not_in'=>get_option('sticky_posts')
// добавьте любые другие аргументы, которые вам нужны
);
$posts=new WP_Query($args);
Однако будьте осторожны при этом. Теоретически, этот список может стать очень длинным, что потенциально приведёт к тяжёлой нагрузке на базу данных. То, что делает ваш запрос, не является изначально задуманной функцией sticky-записей, как правильно объясняется в этом ответе: https://wordpress.stackexchange.com/a/260951/1763
Coen Jacobs