is_front_page () malfunzionamento?


8

Ho un problema piuttosto basilare per cui sono sorpreso che WP non abbia una soluzione nativa (a meno che non stia trascurando qualcosa, si spera).

Ho un sito WP con static pageimpostato come prima pagina nelle impostazioni di lettura. In un codice plug-in, sto cercando di determinare se WP sta visualizzando la prima pagina e aggiungere una classe $classesall'array se è vero. Sto usando il seguente codice per realizzarlo

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

Sto usando entrambi is_front_page()e is_home()nel caso in cui l'impostazione della prima pagina cambi da layout di pagina statica a blog in futuro.

Il problema che sto riscontrando è che questo codice aggiunge home-pageclasse bodyanche alla wp-signup.phppagina.

L'ispezione del codice rivela che le is_front_page()chiamate WP_Query::is_front_page(), che essenzialmente restituiscono risultati di WP_Query::is_page(get_option('page_on_front')). Quindi la radice del problema è che si wp-signup.phpqualifica come la pagina (id) restituita da get_option('page_on_front')( che restituisce IDla pagina statica impostata come prima pagina in impostazioni> lettura ).

WP_Query::is_page()utilizza WP_Query::get_queried_object()internamente per decidere se la pagina corrente è la pagina presente negli argomenti del metodo. Nel wp-signup.phpcaso, il codice che imposta l'oggetto interrogato corrente è il seguente

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

Questo dimostra che wordpress, per qualche motivo, interroga la prima pagina per visualizzare wp-signup.phpe solleva le seguenti domande.

  • Perché is_front_page()restituire risultati errati?
  • AFAIK wp-signup.phpnon può mai essere impostato come pagina iniziale utilizzando le impostazioni dell'amministratore di Wordpress, quindi perché il codice wordpress non viene salvato solo controllando PHP_SELFo REQUEST_URI?
  • Perché $this->posta questo punto WP_Query ha la home page corrente ?

Ho escluso il problema dei plug- in rimuovendo la directory dei plug-in (e mu-plugins). Si qualifica ancora wp-signup.phpcome prima pagina dove non lo è per qualsiasi altra pagina.

Qualsiasi aiuto in merito a questo problema sarà molto apprezzato.

Aggiornamento
Sto usando WP versione 4.2.4 ed è una configurazione multisito.

Grazie.


Stai sicuramente usando l'ultima versione di WordPress? E questa è una configurazione multisito?
TheDeadMedic

Sto usando la versione 4.2.4 e sì, è un'installazione multisito. Aggiunto alla domanda.
Ejaz,

Questo è ... strano. Tutto ciò che posso suggerire per ora è l'utilizzo della seguente ifcondizione:( ! isset( $GLOBALS['pagenow'] ) || $GLOBALS['pagenow'] !== 'wp-signup.php' ) && ( is_front_page() || is_home() )
TheDeadMedic

Grazie per il suggerimento @TheDeadMedic, lo farà. Quindi il problema è un bug WP allora?
Ejaz,

In realtà ne ho sentito parlare prima su WPMU. Prova a disattivare il tema e a riattivarlo.
Matt van Andel,

Risposte:


1

Solo speculazioni, ma mi chiedo se stai incontrando un problema di funzione anonima. Le funzioni anonime sono consentite in WP e di solito funzionano bene (presumendo PHP aggiornato), ma se cerchi in giro troverai segnalazioni di bug sospetti o almeno di comportamenti imprevisti.

Del resto, non sono sicuro di aver mai visto una funzione anonima utilizzata come esempio nel codice WordPress, e non ricordo di aver mai incontrato qualcuno prima nel tema e nel codice plug-in. Certo, non ho avuto occhio per le funzioni anon, ma, comunque, penso che la funzione di cui sopra sarà quasi sempre scritta in una versione del formato in due parti più familiare - cioè:

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;
} 

Quindi, come esperimento, proverei il formato più "convenzionale" sopra indicato, e lo proverei anche con una priorità designata superiore o inferiore a 10. Se collegando più funzioni anonime allo stesso filtro, darei loro priorità diverse, o usa un array (esempio qui: http://snippets.khromov.se/adding-multiple-actions-and-filters-using-anonymous-functions-in-wordpress/ ), oppure scrivi ognuno di essi come chiamato due- anche i genitori.

In verità, trovo che il modo in 2 parti leggermente più lungo sia più facile da leggere, tenere traccia e regolare comunque.


-4

WordPress utilizza diversi modelli per le pagine del tuo sito. Se hai un modello page.php nel tuo tema, verrà utilizzato per visualizzare le tue pagine. Se hai un singolo.php, verrà utilizzato per visualizzare i tuoi singoli post. index.php o home.php visualizzerebbe la tua home page, o page.php se hai una determinata pagina selezionata come home page attraverso le opzioni di lettura.

Quindi, la tua dichiarazione condizionale:

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

Sarebbe davvero utile solo nel file header.php o nel file footer.php- o in page.php se hai una determinata pagina selezionata nelle opzioni di lettura.


Grazie per la risposta, ma non riesco a vedere come questo influisce sui valori restituiti dalle funzioni di cui sopra.
Ejaz,

5
FERMARE LO SPAMMING !!!! . I tuoi collegamenti sono tornati al tuo sito web. I tuoi prossimi post saranno contrassegnati come spam. Grazie
Pieter Goosen il

Anche questo non risponde nemmeno alla domanda
Pieter Goosen il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.