Почему аргумент ignore_sticky_posts используется в запросе липких записей?

22 мар. 2017 г., 08:00:05
Просмотры: 28.2K
Голосов: 16

Мы все знаем, что 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 );

Это очень запутанно и не имеет смысла! Вы хотите получить липкие записи и при этом исключаете их?

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

Мы все знаем, что 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 (по умолчанию):

  1. Если в результатах запроса есть записи, которые являются sticky, WordPress переместит их в начало списка результатов.

  2. Если какие-то 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.

22 мар. 2017 г. 09:53:34
Комментарии

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

吉 宁 吉 宁
22 мар. 2017 г. 10:20:56

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

Fayaz Fayaz
22 мар. 2017 г. 11:23:28

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

Benji Benji
28 мар. 2018 г. 15:28:46

Блестящий ответ, fayaz. Подробный и основательный.

jdm2112 jdm2112
9 июн. 2021 г. 05:16:53
2

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

    $args=array(
        'post__not_in'=>get_option('sticky_posts')
        // добавьте любые другие аргументы, которые вам нужны
    );
    $posts=new WP_Query($args);
19 июн. 2020 г. 17:25:36
Комментарии

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

Coen Jacobs Coen Jacobs
20 июн. 2020 г. 10:52:22

Цель состоит в том, чтобы вообще не включать sticky-записи, а не просто игнорировать их особый механизм, а именно — просто не показывать их.

user2026338 user2026338
22 июн. 2020 г. 17:04:25