web-dev-qa-db-fra.com

pre_get_posts: 'post__not_in' ne fonctionne pas avec la variable globale

J'essaie de définir un post__not_in qui utilise une variable globale $popular, définie dans le index.php.

-index.php-

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

-fonctions.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' );

Je ne peux tout simplement pas le faire fonctionner, la boucle fonctionne, mais les post_ids populaires ne sont pas exclus. J'ai tout essayé: définir une constante, en utilisant "create_function" etc ...

PS: Si je mets le tableau $popular dans la fonction modify_query_exclude_popular(), cela fonctionne, mais je dois absolument définir le tableau dans index.php (le $popular utilise post_id d’une autre boucle).

1
hawkidoki

Vous devez déclarer $popular comme étant global avant de l'utiliser. Basé sur le code que vous avez posté, vous ne l'avez pas fait.

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

Cependant, si vous parlez du index.php dans le thème, ce fichier n'est pas toujours utilisé. Vous définissez peut-être la variable dans un fichier qui ne se charge pas lorsque vous en avez besoin. Il est difficile de dire si c'est le cas en raison du code limité que vous avez posté.

De toute façon, pre_get_posts sera exécuté avant l'un des fichiers de thème, sauf si functions.php (ou tout fichier inclus à partir de celui-ci). Vous pouvez faire écho aux valeurs de ce filtre et de header.php pour vous le prouver.

En outre, il peut exister un meilleur moyen de procéder que de déclarer une variable globale. Encore une fois, en raison du code limité, il est difficile de dire.

Globalement, il semble que vous deviez repenser la façon dont vous allez accomplir cela. Une description bien meilleure de ce que vous essayez d'accomplir serait utile.

Référence

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

2
s_ha_dum

Le fichier INDEX.php est raffiné bien après le hook pre_get_posts ... vous devez donc définir la variable $popular avant ce hook.

0
T.Todua