$ query-> query_var nicht für Seiten eingestellt

Mit dieser Antwort von @kaiser über die Möglichkeit, nach Post-Typen auf einer Suchseite zu filtern, wollte ich alle verfügbaren öffentlichen Post-Typen automatisch hinzufügen können. Also, nach etwas Hilfe mit @kaiser, kam ich auf:

function sw_custom_post_type_includes($query) { $args = array( 'public' => true ); $output = 'names'; // names or objects, note names is the default $operator = 'and'; // 'and' or 'or' $post_types = get_post_types( $args, $output, $operator ); if ( !is_search() && !in_array( get_post_type(), $post_types ) ) return; $query->set( 'post_type', $post_types ); return $query; } add_filter('pre_get_posts', 'sw_custom_post_type_includes'); 

Was anfänglich gut zu funktionieren schien, aber ich stieß auf ein Problem -> alles nach Post-Typ korrekt gefiltert, AUSSER wenn ich versuchte, &post_type=page . Ich habe tatsächlich einen undefinierten Indexerrors für post_type . Ich konnte nicht herausfinden, warum das nicht funktionierte. Also habe ich mich entschieden, print_r($query->query_vars) zu verwenden, um zu sehen, ob alles richtig eingezogen wurde. Low and Behold – für alle Post-Typen, außer für Seiten, wurde diese Variable gesetzt.

Ich beriet mich mit einem anderen Entwickler und sie verifizierten das Problem. Dies ist, was ich als Workaround verwendet habe:

 function sw_custom_post_type_includes($query) { if(isset($_GET['post_type']) && ((!isset($query->query_vars['post_type'])) || (isset($query->query_vars['post_type']) && $query->query_vars['post_type'] != 'nav_menu_item'))) { $query->set('post_type', urldecode($_GET['post_type'])); } } add_action('pre_get_posts', 'sw_custom_post_type_includes'); 

Dies scheint ehrlich gesagt eine seltsame Problemumgehung für etwas zu sein, das mich für ein paar Stunden verblüfft hat. Jeder, der etwas dazu sagt, wird mit virtuellen High-Fives belohnt.

Solutions Collecting From Web of "$ query-> query_var nicht für Seiten eingestellt"

Um Verwirrung in früheren Antworten zu beseitigen, ist pre_get_posts kein Filter, sodass Sie nichts zurückgeben müssen.

Ihr einziges Problem, das ich sehe, ist das, wenn:

 if ( !is_search() && !in_array( get_post_type(), $post_types ) ) return; 

Grundsätzlich wird get_post_type () während pre_get_posts false zurückgeben, weil der globale $ post noch nicht gesetzt wurde (normalerweise gesetzt, sobald Sie die Schleife starten).

Ich bin mir nicht ganz sicher, WENN Sie alle öffentlichen Beitragstypen möchten und wenn nicht. Wenn Sie alle Suchen so einstellen möchten, dass sie alle öffentlichen Beitragstypen enthalten, müssen Sie lediglich ise_search () überprüfen. Sie sollten auch sicherstellen, dass die abgefragte Abfrage die Hauptabfrage und keine benutzerdefinierte Abfrage ist, die eine Plugin- oder Designdatei erstellt. Der Code sollte folgendermaßen aussehen:

 function range_search_all_public_post_types( $q ) { if ( is_search() && is_main_query() ) $q->set( 'post_type', get_post_types( array( 'public' => true ) ) ); } add_action( 'pre_get_posts', 'range_search_all_public_post_types' ); 

Das ist es. Dadurch werden alle öffentlichen Beitragstypen für Suchanfragen abgefragt.

Wenn Sie alle öffentlichen Beitragstypen auf der Startseite und in der Suche verwenden möchten, verwenden Sie Folgendes:

 function range_search_all_public_post_types( $q ) { if ( ( is_search() || is_home() ) && is_main_query() ) $q->set( 'post_type', get_post_types( array( 'public' => true ) ) ); } add_action( 'pre_get_posts', 'range_search_all_public_post_types' ); 

AKTUALISIEREN:

Das Problem, das Sie haben, ist einzigartig für post_types, die public_queryable auf false gesetzt haben. Grundsätzlich möchten Sie, dass alle öffentlichen Typen funktionieren, auch wenn sie nicht öffentlich abfragbar sind. Um dies zu tun, benutze diesen Code:

 function range_search_all_public_post_types( $q ) { if ( is_search() && is_main_query() && '' == $q->get( 'post_type' ) && ! empty( $_GET['post_type'] ) && post_type_exists( $_GET['post_type'] ) && get_post_type_object( $_GET['post_type'] )->public ) $q->set( 'post_type', $_GET['post_type'] ); } add_action( 'pre_get_posts', 'range_search_all_public_post_types' ); 

Grundsätzlich, wenn ein post_type in URL, aber nicht in QP_Query ist, könnte es sein, weil es nicht öffentlich_queryable ist, und wenn ja, wir reparieren es. Hier ist, was überprüft wird:

  • Ist das eine Suchseite?
  • Ist das die Hauptabfrage?
  • Ist in der Abfrage kein post_type angegeben?
  • Ist in der URL ein post_type angegeben?
  • Gibt es den URL-spezifizierten post_type?
  • Ist der URL-type post_type öffentlich?

Wenn all dies wahr ist, wird der post_type auf den in der URL gesetzt.

Sie schrieben

 if ( !is_search() && !in_array( get_post_type(), $post_types ) ) return; 

Wenn die page nicht in Ihrem $post_types Array ist, gibt es eine leere return;

Eigentlich sehe ich nicht, warum Sie diese Sicherheit hinzufügen, diese function wird nur aufgerufen, wenn es einen tatsächlichen Bedarf gibt, dank dem pre_get_posts Filter

Sie sollten nur die Rückkehr ändern:

 function sw_custom_post_type_includes($query) { $args = array( 'public' => true ); $output = 'names'; // names or objects, note names is the default $operator = 'and'; // 'and' or 'or' $post_types = get_post_types( $args, $output, $operator ); if ( !is_search() && !in_array( get_post_type(), $post_types ) ) return $query; //#### keep it unchanged instead of removing everything #### $query->set( 'post_type', $post_types ); return $query; } add_filter('pre_get_posts', 'sw_custom_post_type_includes'); 

Es ist nur ein Gedanke, ich habe es nicht versucht

Als ich die Frage beantwortete, wo diese eine Folge ist und nachdem ich eine Menge zu den Fragen hier kommentiert habe, bin ich mir ziemlich sicher, dass Sie irgendwo einen anderen Filter oder eine Bedingung gefunden haben, die Sie davon abhält, ein Ergebnis für Seiten abzurufen. 99% Chance, dass dies dein Problem ist. Am besten beginnen Sie mit einer leeren Vanilla-Installation und versuchen, nichts als diesen Filter auszuführen, um zu beweisen, dass er funktioniert. Geh dann rein und fange an, alle Custom-Sachen zu entfernen / kommentieren, Plug-Ins usw. zu deaktivieren, bis du weißt, was passiert.