Es gibt einen langjährigen WordPress-Kernfehler ( # 16373 ), bei dem die Abfrage nicht auf is_front_page()
true gesetzt wird, wenn benutzerdefinierte Abfragevariablen registriert sind und in der Abfragezeichenfolge vorhanden sind , selbst wenn 'page' == get_option( 'show_on_front' )
. Ausführliche Informationen finden Sie im Trac-Ticket. Das Endergebnis ist jedoch, dass die Startseite anstelle von eine ungültige Seite zurückgibt get_option( 'page_on_front' )
.
Ich habe einen bestimmten Anwendungsfall, in dem ich benutzerdefinierte Abfragevariablen an die Abfragezeichenfolge auf der Startseite übergeben muss (mithilfe eines Formulars zum Übergeben registrierter Abfragevariablen, die wiederum zum Filtern von Themenoptionen verwendet werden - eine Demo zu Front-End-Themenoptionen ). Das oben erwähnte Trac-Ticket wurde als ungültig geschlossen, daher brauche ich eine Problemumgehung.
Ich kann die Titelseitenvorlage einfach genug erzwingen, wie folgt:
function themeslug_force_front_page_template( $template ) {
if ( '' != get_query_var( 'foobar' ) ) { // Registered custom query var
return get_front_page_template();
}
return $template;
}
add_filter( 'template_include', 'themeslug_force_front_page_template' );
Die zugrunde liegenden Abfragebedingungen sind jedoch nicht betroffen. Code, der vom is_front_page()
Sein abhängt true
(z. B. ein Schieberegler, der nur auf der Startseite der Site angezeigt wird), wird daher immer noch nicht richtig gerendert.
Ich habe versucht , zu modifizieren , $query
zu pre_get_posts
, aber dies scheint nicht zu funktionieren:
function themeslug_force_static_front_page( $query ) {
if ( $query->is_main_query() ) {
if ( 'page' == get_option( 'show_on_front' ) ) {
if ( '' != get_query_var( 'foobar' ) ) { // Registered custom query var
$query->set( 'page_id', get_option( 'page_on_front' ) );
$query->set( 'is_home', false );
$query->set( 'is_page', true );
$query->set( 'is_front_page', true );
}
}
}
}
add_action( 'pre_get_posts', 'themeslug_force_static_front_page' );
Die Abfragebedingungen werden nicht geändert. Versuche ich es falsch in meinem Rückruf? Gibt es eine andere / bessere Möglichkeit, insbesondere die Abfragebedingungen zu erzwingen is_front_page()
?
Bearbeiten
Beachten Sie, dass die Einstellung page_id
tut Arbeit im pre_get_posts
Callback:
$query->set( 'page_id', get_option( 'page_on_front' ) );
Wenn ich den template_include
Filter weglasse , ist die angezeigte Seite tatsächlich die Seite, die der Startseite zugewiesen ist. wird jedoch get_page_template()
eher verwendet als get_front_page_template()
. Also, Einstellung page_id
bei pre_get_posts
verursacht is_page()
wahr zu sein. Der oben genannte Fehler verhindert is_front_page()
jedoch, dass er eingestellt wird true
.
Bearbeiten 2
Per @ toschos Anfrage, hier ist ein Abfrage-Var-Code für den Kontext.
Abfragevariablen registrieren:
/**
* Add options-related query variables
*/
function themslug_add_theme_demo_query_vars( $qvars ) {
$qvars[] = 'demo_foo';
$qvars[] = 'demo_bar';
$qvars[] = 'demo_baz';
return $qvars;
}
add_filter( 'query_vars', 'themeslug_add_theme_demo_query_vars' );
(Wo foo
, bar
und baz
sind Themenoptionen - Hintergrund, verschiedene Farben usw.)
Sie werden einfach verwendet, um einer Themenoption einen Filter hinzuzufügen - dieser Teil fällt nicht in den Geltungsbereich der Frage, daher werde ich ihn hier weglassen.
Sie werden am Frontend über ein benutzerdefiniertes Widget ausgegeben. Die Widget-Ausgabe ist nur ein Formular. Hier ist ein Beispiel für eines der Formularfelder:
<h3>Foo</h3>
<input name="demo_foo" id="demo_foo" class="pickcolor" type="text" value="<?php echo $foo_setting; ?>" data-default-color="<?php echo $foo_setting; ?>" />
Generierte Abfragezeichenfolge beim Senden:
www.example.com/?foo=some_value