Fehlfunktion von is_front_page ()?


8

Ich habe ein ziemlich grundlegendes Problem, für das ich überrascht bin, dass WP keine native Lösung hat (es sei denn, ich übersehen hoffentlich etwas).

Ich habe eine WP-Site mit static pageals Startseite in der Leseeinstellung festgelegt. In einem Plugin-Code versuche ich festzustellen, ob WP die Startseite anzeigt, und dem $classesArray eine Klasse hinzuzufügen, wenn dies der Fall ist. Ich verwende folgenden Code, um dies zu erreichen

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

Ich verwende beide is_front_page()und is_home()für den Fall, dass sich die Einstellung der Startseite in Zukunft von der statischen Seite zum Blog-Layout ändert.

Das Problem, auf das ich stoße, ist, dass dieser Code sogar auf der Seite eine home-pageKlasse hinzufügt . bodywp-signup.php

Das Überprüfen des Codes zeigt, dass is_front_page()Aufrufe WP_Query::is_front_page(), die im Wesentlichen Ergebnisse von zurückgeben WP_Query::is_page(get_option('page_on_front')). Die Wurzel des Problems liegt also darin, dass es wp-signup.phpsich um die Seite (ID) handelt, die von zurückgegeben wird get_option('page_on_front')( die IDdie statische Seite zurückgibt, die in Einstellungen> Lesen als Startseite festgelegt wurde ).

WP_Query::is_page()wird WP_Query::get_queried_object()intern verwendet, um zu entscheiden, ob die aktuelle Seite die in Methodenargumenten vorhandene Seite ist. In diesem wp-signup.phpFall lautet der Code, der das aktuell abgefragte Objekt festlegt, wie folgt

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

Dies zeigt, dass WordPress aus irgendeinem Grund die Startseite abfragt, um sie anzuzeigen, wp-signup.phpund folgende Fragen aufwirft.

  • Warum werden is_front_page()falsche Ergebnisse zurückgegeben?
  • AFAIK wp-signup.phpkann niemals mit der Wordpress-Administratoreinstellung als Startseite festgelegt werden. Warum wird WordPress-Code dann nicht einfach durch Überprüfen von PHP_SELFoder gerettet REQUEST_URI?
  • Warum hat WP_Query $this->postzu diesem Zeitpunkt eine aktuelle Homepage ?

Ich habe ein Plugin-Problem ausgeschlossen, indem ich das Plugins-Verzeichnis (und das Mu-Plugins-Verzeichnis) entfernt habe. Es gilt weiterhin wp-signup.phpals Startseite, wo es für keine andere Seite gilt.

Jede Hilfe zu diesem Thema wird sehr geschätzt.

Update
Ich verwende WP Version 4.2.4 und es ist ein Multisite-Setup.

Vielen Dank.


Verwenden Sie definitiv die neueste Version von WordPress? Und ist das ein Multisite-Setup?
TheDeadMedic

Ich verwende Version 4.2.4 und ja, es ist ein Multisite-Setup. Zur Frage hinzugefügt.
Ejaz

Das ist komisch. Alles, was ich jetzt vorschlagen kann, ist die Verwendung der folgenden ifBedingung:( ! isset( $GLOBALS['pagenow'] ) || $GLOBALS['pagenow'] !== 'wp-signup.php' ) && ( is_front_page() || is_home() )
TheDeadMedic

Vielen Dank für den Vorschlag @TheDeadMedic, das wird es tun. Das Problem ist also ein WP-Fehler?
Ejaz

Ich habe tatsächlich schon einmal davon auf WPMU gehört. Versuchen Sie, Ihr Thema zu deaktivieren und wieder zu aktivieren.
Matt van Andel

Antworten:


1

Nur Spekulation, aber ich frage mich, ob Sie auf ein anonymes Funktionsproblem stoßen. Anonyme Funktionen sind in WP zulässig und funktionieren normalerweise einwandfrei (vorausgesetzt, aktualisiertes PHP). Wenn Sie sich jedoch umsehen, werden Sie Berichte über vermutete Fehler oder zumindest über unerwartetes Verhalten finden.

Im Übrigen bin ich mir nicht sicher, ob ich jemals eine anonyme Funktion gesehen habe, die als Beispiel im WordPress-Codex verwendet wurde, und ich kann mich nicht erinnern, jemals zuvor eine solche in Theme- und Plug-In-Code verwendet zu haben. Natürlich habe ich nicht nach anon-Funktionen Ausschau gehalten, aber ich denke trotzdem, dass die obige Funktion fast immer in einer Version des bekannteren zweiteiligen Formats geschrieben wird - dh:

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

Als Experiment würde ich also das oben genannte "konventionellere" Format ausprobieren und es auch mit einer festgelegten Priorität von mehr als 10 ausprobieren. Wenn mehrere anonyme Funktionen an denselben Filter angehängt werden, würde ich ihnen unterschiedliche Prioritäten geben. oder verwenden Sie ein Array (Beispiel hier: http://snippets.khromov.se/adding-multiple-actions-and-filters-using-anonymous-functions-in-wordpress/ ) oder schreiben Sie jedes Array wie folgt: auch Partner.

In Wahrheit finde ich den etwas längeren zweiteiligen Weg sowieso leichter zu lesen, zu verfolgen und anzupassen.


-4

WordPress verwendet verschiedene Vorlagen für Seiten auf Ihrer Website. Wenn Ihr Thema eine page.php-Vorlage enthält, wird diese zum Anzeigen Ihrer Seiten verwendet. Wenn Sie eine single.php haben, wird diese verwendet, um Ihre einzelnen Beiträge anzuzeigen. index.php oder home.php würde Ihre Homepage oder page.php anzeigen, wenn Sie eine bestimmte Seite über die Leseoptionen als Homepage ausgewählt haben.

Also, Ihre bedingte Aussage:

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

Wäre nur in der Datei header.php oder footer.php- oder in page.php wirklich nützlich, wenn Sie eine bestimmte Seite in den Leseoptionen ausgewählt haben.


Vielen Dank für die Antwort, aber ich kann nicht erkennen, wie sich dies auf die von den oben genannten Funktionen zurückgegebenen Werte auswirkt.
Ejaz

5
HÖR AUF ZU SPAMMEN!!!! . Ihre Links werden auf Ihre eigene Website zurückgeführt. Ihre nächsten Beiträge werden als Spam gekennzeichnet. Vielen Dank
Pieter Goosen

Dies beantwortet auch nicht einmal die vorliegende Frage
Pieter Goosen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.