webentwicklung-frage-antwort-db.com.de

is_front_page () Störung?

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

Ich habe eine WP Site mit static page als Titelseite in der Leseeinstellung. In einem Plugin-Code versuche ich festzustellen, ob WP die Startseite anzeigt, und füge dem $classes-Array eine Klasse hinzu, wenn dies der Fall ist. Ich benutze 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 sowohl is_front_page() als auch is_home() für den Fall, dass sich die Einstellung der Startseite in Zukunft von statischer Seite zu Blog-Layout ändert.

Das Problem, auf das ich stoße, ist, dass dieser Code home-page class zu body hinzufügt, sogar auf wp-signup.php page.

Das Untersuchen des Codes zeigt, dass is_front_page()WP_Query::is_front_page() aufruft, was im Wesentlichen Ergebnisse von WP_Query::is_page(get_option('page_on_front')) zurückgibt. Die Wurzel des Problems liegt also darin, dass wp-signup.php als die von get_option('page_on_front') zurückgegebene Seite (id) qualifiziert ist ( gibt ID der statischen Seite zurück, die in settings> reading als Titelseite festgelegt wurde).

WP_Query::is_page() verwendet WP_Query::get_queried_object() intern, um zu entscheiden, ob die aktuelle Seite die Seite ist, die in Methodenargumenten enthalten ist. In wp-signup.php 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 wp-signup.php anzuzeigen, und die folgenden Fragen aufwirft.

  • Warum gibt is_front_page() falsche Ergebnisse zurück?
  • AFAIK wp-signup.php kann unter Verwendung der Wordpress-Administratoreinstellung niemals als Startseite festgelegt werden. Warum wird Wordpress-Code dann nicht durch einfaches Überprüfen von PHP_SELF oder REQUEST_URI beendet?
  • Warum hat WP_Query derzeit eine aktuelle Homepage in $this->post?

Ich habe das Plugin-Problem ausgeschlossen, indem ich das Plugins-Verzeichnis (und das mu-Plugins-Verzeichnis) entfernt habe. Es qualifiziert wp-signup.php immer noch als Titelseite, wohingegen es für keine andere Seite gilt.

Jede Hilfe in Bezug auf dieses Problem wird sehr geschätzt.

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

Vielen Dank.

8
Ejaz

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

Im Übrigen bin ich mir nicht sicher, ob ich jemals eine anonyme Funktion als Beispiel im WordPress-Codex gesehen habe, und ich kann mich nicht erinnern, jemals zuvor eine Funktion in Design- und Plug-In-Code ausgeführt zu haben. Natürlich habe ich mich nicht für anon-Funktionen interessiert, 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 das obige "konventionellere" Format ausprobieren und es auch mit einer festgelegten Priorität höher oder niedriger als 10 versuchen. Wenn mehrere anonyme Funktionen demselben Filter zugeordnet werden, würde ich ihnen unterschiedliche Prioritäten zuweisen. 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 von ihnen auch als Zweiteiler bezeichnet.

In Wahrheit finde ich die etwas längere, zweiteilige Methode ohnehin einfacher zu lesen, zu verfolgen und anzupassen.

1
CK MacLeod