Ergebnisse der Auftragssuche nach meta_value Wenn kein Wert zurückgibt Ergebnisse

Ich versuche, die Suchergebnisseite meiner Site mit einem bestimmten meta_key . Der Haken ist, dass ich alle Ergebnisse zurückgeben muss, auch wenn es keinen Wert im meta_key

Die Posts sind benutzerdefinierte Post-Typen, bei denen es sich um Ereignisse handelt.

Die Ergebnisse werden bereits nach einer bestimmten Gruppe von benutzerdefinierten Beitragstypen sortiert:

 function SearchFilter($query) { if (!is_admin() && $query->is_search() ) { $query->set('post_type', array( 'event', 'university', 'organization')); } return $query; } add_action('pre_get_posts','SearchFilter', 9999); 

Es wird eine andere Filterung durchgeführt, um herausgefilterte Ereignisse oder solche, die auf ein benutzerdefiniertes Feld “aus” gesetzt sind, herauszufiltern. Ich kann den Code, der dazu verwendet wird, bei Bedarf auch posten.

Im Wesentlichen kann ich verwenden

 $query->set('meta_key', 'wpcf-start-date'); $query->set('orderby', array('meta_value' => 'ASC')); 

um die Ereignisse nach Ereignisdatum zu sortieren. Das funktioniert gut, aber es werden keine Ergebnisse zurückgegeben, die '' (was ich für null wpcf-start-date ) im Feld ” wpcf-start-date .

Ich habe versucht, die Antwort in dieser Frage zu verwenden:

Bestellen Sie Beiträge nach benutzerdefiniertem Feld und wenn das benutzerdefinierte Feld leer ist, geben Sie die verbleibenden Beiträge zurück

Aber entweder verstehe ich nicht, was gut genug ist, um es für meine Zwecke anzupassen, oder es funktioniert einfach nicht für mich.

Ich kann zusätzliche Informationen auf Anfrage zur Verfügung stellen.

Jede Hilfe würde sehr geschätzt werden!

UPDATE: Ich habe mir wieder die andere Stack-Frage angesehen, auf die ich mich beziehe. Ich habe das, das funktioniert:

 function sortResults( $query ) { if ( is_admin() || ! $query->is_main_query() ) { return; } $query->set( 'meta_key', 'wpcf-start-date' ); $query->set( 'orderby', 'meta_value'); $query->set( 'order', 'DESC'); add_filter( 'get_meta_sql', 'filterResults' ); } add_action( 'pre_get_posts', 'sortResults' ); function filterResults( $clauses ) { remove_filter( 'get_meta_sql', 'filterResults' ); // Change the inner join to a left join, // and change the where so it is applied to the join, not the results of the query. $clauses['join'] = str_replace( 'INNER JOIN', 'LEFT JOIN', $clauses['join'] ) . $clauses['where']; $clauses['where'] = ''; return $clauses; } 

Aber wie bei der anderen Frage werden damit die Ereignisse ohne Daten an die Spitze und die Ereignisse mit den Daten unten gestellt. Die andere Frage schlägt vor, zwei Schleifen zu verwenden. Ich kann nicht scheinen, dass zwei Loops auf meiner Seite funktionieren. Die Suchergebnisseite ist stark angepasst.

Solutions Collecting From Web of "Ergebnisse der Auftragssuche nach meta_value Wenn kein Wert zurückgibt Ergebnisse"

Sie können dies mit mehreren Meta-Abfragen erreichen.

 $query->set( 'meta_query', [ 'relation' => 'OR', 'wpcf-start-date' => [ 'key' => 'wpcf-start-date', 'compare' => 'EXISTS', ], 'no-start-date' => [ 'key' => 'wpcf-start-date', 'compare' => 'NOT EXISTS' ], ] ); $query->set( 'orderby', 'wpcf-start-date' ); $query->set( 'order', 'ASC' ); 

Dadurch wird WP angewiesen, eine Abfrage zu erstellen, die jedem Post entspricht, unabhängig davon, ob der Schlüssel vorhanden ist oder nicht, und es als LEFT JOIN zu definieren. Anschließend wird der Wert dieses Schlüssels sortiert, einschließlich derjenigen mit NULL-Werten.