pre_get_posts: 'post__not_in' не работает с глобальной переменной

Я пытаюсь установить post__not_in которые используют глобальную переменную $popular , определенную в index.php .

-index.php-

 $popular[] = 1 //post id=1 $popular[] = 2 //post id=2 $popular[] = 3 //post id=3 

-functions.php-

 function modify_query_exclude_popular($query) { if ($query->is_main_query() && $query->is_home()){ global $popular; $query->set('post__not_in', $popular); } } add_action('pre_get_posts', 'modify_query_exclude_popular' ); 

Я просто не могу заставить его работать, цикл работает, но популярные post_ids не исключаются. Я пробовал все: определяю константу, используя «create_function» и т. Д. …

PS: Если я устанавливаю $popular массив внутри функции modify_query_exclude_popular() он действительно работает, но мне абсолютно необходимо установить массив в index.php ( $popular public use post_id другого цикла).

Solutions Collecting From Web of "pre_get_posts: 'post__not_in' не работает с глобальной переменной"

Вы должны объявить $popular чтобы быть глобальным, прежде чем использовать его. Основываясь на коде, который вы опубликовали, вы этого не сделали.

 global $popular; $popular[] = 1 //post id=1 $popular[] = 2 //post id=2 $popular[] = 3 //post id=3 

Однако, если вы имеете в виду index.php в теме, этот файл не всегда используется. Вы можете определить переменную в файле, который не загружается, когда вам это нужно. Трудно сказать, так ли это из-за ограниченного кода, который вы опубликовали.

pre_get_posts будет запускаться до любого из файлов темы в любом случае, кроме, если functions.php (или любые файлы включены оттуда). Вы можете эхо-значения из этого фильтра и из header.php чтобы доказать это самому себе.

Кроме того, может быть лучший способ сделать это, чем объявить глобальную переменную. Опять же, из-за ограниченного кода трудно сказать.

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

Справка

http://php.net/manual/en/language.variables.scope.php

Файл INDEX.php уточняется после pre_get_posts … так что вы должны определить переменную $popular до этого hook.