web-dev-qa-db-fra.com

is_front_page ne fonctionne que dans le fichier de thème et ne fonctionne pas dans functions.php

Si j'utilise is_front_page () dans mon fichier front-page.php, cela fonctionne comme prévu. Cependant, si j'utilise la même fonction dans mon fichier theme functions.php, cela ne fonctionne pas. Est-ce un comportement normal? Sinon, peut-il être dérangé?

Dans Settings-> reading, ma page d'accueil est définie sur une page appelée "page d'accueil", donc je pense que tout est défini.

MODIFIER

l'ajout de ce qui suit au fichier functions.php ne fonctionne pas, mais je vous promets qu'il fonctionnera correctement si j'ajoute is_home_page () à mon fichier header.php

add_action('init', 'my_test');

function my_test(){
    if(is_front_page())
        echo 'is it?';
}
4
Mike

Cela peut être un comportement normal, selon l'utilisation exacte de is_front_page dans votre fichier de fonctions.

Si vous l'utilisez dans la portée globale de functions.php, cela ne fonctionnera pas.

Pourquoi? Parce que WordPress charge functions.php avant que le $wp_query object ait été configuré avec la page en cours. is_front_page est un wrapper autour de $wp_query->is_front_page(), et si la requête n'a pas été configurée, elle retournera toujours false (ou émettra un avertissement si vous avez wp_debug sur.

Du codex:

Avertissement: Vous ne pouvez utiliser des balises de requête conditionnelles qu'après le raccordement d'action init dans WordPress. Pour les thèmes, cela signifie que la balise conditionnelle ne fonctionnera jamais correctement si vous l’utilisez dans le corps de functions.php, c’est-à-dire en dehors d’une fonction.

http://codex.wordpress.org/Conditional_Tags

5
chrisguitarguy

La citation codex de chrisguitarguy n'est plus valide !! Il a été mis à jour pour:

Avertissement: Vous ne pouvez utiliser que les balises de requête conditionnelles after le crochet d’action posts_selection dans WordPress ( le crochet d’action wp est le premier à travers lequel vous pouvez utiliser ces conditions ). Pour les thèmes, cela signifie que la balise conditionnelle ne fonctionnera jamais correctement si vous l’utilisez dans le corps de functions.php, c’est-à-dire en dehors d’une fonction.

Ainsi, le hook init ne fonctionne plus !!! Comme indiqué, le hook wp est le premier hook que vous pouvez utiliser si vous souhaitez utiliser des balises de requête conditionnelles. Donc, pour que les balises conditionnelles fonctionnent, voici le passe-partout minimal:

add_action('wp', 'function_that_uses_conditional_tags');

function function_that_uses_conditional_tags() {
    // place code here
}

Toutefois, veuillez noter que, bien que cet "avertissement" semble universellement applicable aux balises conditionnelles, comme il apparaît dans la toute introduction de la page du codex sur Balises conditionnelles , il n'insiste pas sur le fait qu'il ne s'applique vraiment qu'à l'interface.

Le crochet wp ne tire même pas dans le backend! Donc, si vous l'utilisez par exemple avec is_admin (), il ne sera jamais évalué à true. Utilisez un crochet différent dans ce cas. En fait, init fonctionne parfaitement pour is_admin ();).

5
Stephen Miller

C'est le comportement attendu. Le fichier functions.php est analysé avant que la requête ne soit configurée et disponible. Par conséquent, si vous avez if ( is_front_page() ) assis nu dans functions.php, il renverra false car il n'y a pas encore de requête.

Ce que vous devez faire est de mettre votre is_front_page() conditionnel à l'intérieur d'une fonction de rappel, c'est-à-dire ensuite accroché dans une action appropriée - c'est-à-dire une action qui déclenche aprèsla requête est installé/disponible.

Pour référence, je thinkfunctions.php est analysé à plugins_loadedil _ (pourraitêtre setup_theme), et les conditions de la requête devraient être disponibles à ou après la init.

Modifier

plugins_loaded et setup_theme ne fonctionnent pas pour moi

De parcoursces crochets ne fonctionneront pas pour vous. Ils se déclenchent avant que la requête ne soit configurée . La condition is_front_page() est uniquement disponible une fois la requête configurée , ce qui se produit àinit.

J'ai besoin de remove_action () si l'utilisateur visualise la page d'accueil.

Vous ne nous dites pas vraiment exactement ce que vous essayez de faire. Votre question demandait simplement quand is_front_page() était disponible, ce à quoi nous avons répondu. Savoir quand et comment supprimer une action est une question presque entièrement différente. Vous devez fournir l'appel add_action() que vous souhaitez supprimer.

4
Chip Bennett

Les hooks précédents utilisés par template_tags sont les actions wp hook. Tous les hooks précédents, comme init hook, ne fonctionneront pas pour les balises de template telles que is_front_page ()

1
chifliiiii