dysfonctionnement de is_front_page ()?

8

J'ai un problème assez basique pour lequel je suis surpris que WP n'ait pas de solution native (sauf si j'oublie quelque chose, espérons-le).

J'ai un site WP avec static pagedéfini comme première page dans le paramètre de lecture. Dans un code de plugin, j'essaie de déterminer si WP affiche la page d'accueil et d'ajouter une classe au $classestableau si c'est vrai. J'utilise le code suivant pour l'accomplir

add_filter('body_class', function($classes){
    if(is_front_page() || is_home()){
        $classes[] = 'home-page';
    }
    return $classes;
});  

J'utilise les deux is_front_page()et is_home()au cas où le paramètre de page d'accueil passerait de la page statique à la mise en page du blog à l'avenir.

Le problème que je rencontre est que ce code ajoute de la home-pageclasse à bodymême sur la wp-signup.phppage.

L'inspection du code révèle que les is_front_page()appels WP_Query::is_front_page(), ce qui renvoie essentiellement les résultats de WP_Query::is_page(get_option('page_on_front')). Ainsi, la racine du problème est celle qui se wp-signup.phpqualifie comme la page (id) retournée par get_option('page_on_front')( qui retourne IDla page statique définie comme première page dans les paramètres> lecture ).

WP_Query::is_page()utilise en WP_Query::get_queried_object()interne pour décider si la page actuelle est la page présente dans les arguments de méthode. Dans le wp-signup.phpcas, le code qui définit l'objet interrogé en cours est le suivant

/*...other code... */
elseif ( $this->is_singular && ! empty( $this->post ) ) {
    $this->queried_object = $this->post;
    $this->queried_object_id = (int) $this->post->ID;
}
/*...other code... */  

Cela montre que wordpress, pour une raison quelconque, interroge la première page afin d'afficher wp-signup.phpet soulève les questions suivantes.

  • Pourquoi is_front_page()renvoie des résultats erronés?
  • AFAIK wp-signup.phpne peut jamais être défini comme page d'accueil à l'aide des paramètres d'administrateur Wordpress, alors pourquoi le code wordpress ne sort pas simplement en vérifiant PHP_SELFou REQUEST_URI?
  • Pourquoi WP_Query a-t-il la page d'accueil actuelle $this->postà ce stade?

J'ai exclu le problème des plugins en supprimant le répertoire des plugins (et mu-plugins). Il est toujours considéré wp-signup.phpcomme la première page alors qu'il ne l'est pour aucune autre page.

Toute aide concernant ce problème sera grandement appréciée.

Mise à jour
J'utilise WP verison 4.2.4 et c'est une configuration multisite.

Merci.

Ejaz
la source
Utilisez-vous définitivement la dernière version de WordPress? Et est-ce une configuration multisite?
TheDeadMedic
J'utilise la version 4.2.4 et oui, c'est une configuration multisite. Ajouté à la question.
Ejaz
C'est étrange. Tout ce que je peux suggérer pour l'instant est d'utiliser la ifcondition suivante :( ! isset( $GLOBALS['pagenow'] ) || $GLOBALS['pagenow'] !== 'wp-signup.php' ) && ( is_front_page() || is_home() )
TheDeadMedic
Merci pour la suggestion @TheDeadMedic, ça va le faire. Le problème est donc un bogue WP?
Ejaz
J'ai déjà entendu parler de cela sur WPMU. Essayez de désactiver votre thème et de le réactiver.
Matt van Andel

Réponses:

1

Juste de la spéculation, mais je me demande si vous rencontrez un problème de fonction anonyme. Les fonctions anonymes sont autorisées dans WP et fonctionnent généralement bien (en supposant que PHP soit mis à jour), mais, si vous recherchez autour, vous trouverez des rapports de bogues suspectés ou au moins de comportement inattendu.

D'ailleurs, je ne suis pas sûr d'avoir jamais vu une fonction anonyme utilisée comme exemple dans le Codex WordPress, et je ne me souviens pas en avoir jamais rencontré auparavant dans le code de thème et de plug-in. Bien sûr, je n'ai pas pensé aux fonctions anon, mais je pense que la fonction ci-dessus sera presque toujours écrite dans une version du format en deux parties plus familier - à savoir:

add_filter('body_class', 'ejay_add_home_class');

function ejay_add_home_class($classes) {

    if (is_front_page() || is_home()) {

        $classes[] = 'home-page';
    }

    return $classes;
} 

Donc, à titre expérimental, j'essaierais le format plus "conventionnel" ci-dessus, et je l'essayerais également avec une priorité désignée supérieure ou inférieure à 10. Si vous attachez plusieurs fonctions anonymes au même filtre, je leur donnerais des priorités différentes, ou utilisez un tableau (exemple ici: http://snippets.khromov.se/adding-multiple-actions-and-filters-using-anonymous-functions-in-wordpress/ ), ou écrivez chacun d'eux comme nommé deux- parters, aussi.

En vérité, je trouve le moyen en deux parties légèrement plus long plus facile à lire, à suivre et à régler de toute façon.

CK MacLeod
la source
-4

WordPress utilise différents modèles de pages sur votre site. Si vous avez un modèle page.php dans votre thème, il sera utilisé pour afficher vos pages. Si vous avez un single.php, celui-ci sera utilisé pour afficher vos messages uniques. index.php ou home.php afficherait votre page d'accueil, ou page.php si vous avez une certaine page sélectionnée comme page d'accueil via les options de lecture.

Donc, votre déclaration conditionnelle:

<?php if (is_front_page()){ ?>
<p>Home Page</p>
<?php else { ?>
<p>Not Home Page</p>
<?php } ?>
?>

Ne serait vraiment utile dans le fichier header.php ou footer.php - ou dans page.php que si une certaine page était sélectionnée dans les options de lecture.

jim.duck
la source
Merci pour la réponse, mais je ne vois pas comment cela affecte les valeurs renvoyées par les fonctions susmentionnées.
Ejaz
5
ARRÊTE DE SPAMMER!!!! . Vos liens renvoient à votre propre site Web. Vos prochains messages seront signalés comme spam. Merci
Pieter Goosen
Cela ne répond même pas à la question posée
Pieter Goosen