wake-up-neo.com

Suchergebnisseite von meta_value bestellen, wenn kein Wert verbleibende Ergebnisse zurückgibt

Ich versuche, die Suchergebnisseite meiner Website nach einem bestimmten meta_key zu ordnen. Der Haken ist, dass ich alle Ergebnisse zurückgeben muss, auch wenn der meta_key keinen Wert enthält.

Bei den Beiträgen handelt es sich um benutzerdefinierte Beitragstypen, bei denen es sich um Ereignisse handelt.

Die Ergebnisse werden bereits nach bestimmten 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 gibt noch eine andere Filterung, um Ereignisse herauszufiltern, die verstrichen sind oder die auf ein benutzerdefiniertes Feld von "Aus" gesetzt sind. Bei Bedarf kann ich auch den dazu verwendeten Code posten.

Grundsätzlich kann ich verwenden

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

um die events nach eventdatum zu ordnen. Dies funktioniert gut, aber es werden keine Ergebnisse zurückgegeben, die '' (was ich für null halte) im Feld wpcf-start-date enthalten.

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

Beiträge nach benutzerdefiniertem Feld bestellen und wenn benutzerdefiniertes Feld leer ist, verbleibende Beiträge zurückgeben

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

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

Jede Hilfe wäre sehr dankbar!


UPDATE:

Ich habe mir noch einmal die andere Stapelfrage 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 stehen die Ereignisse ohne Datumsangaben oben und die Ereignisse mit Datumsangaben unten. Die andere Frage schlägt die Verwendung von zwei Schleifen vor. Ich kann nicht scheinen, zwei Schleifen auf meiner Site zum Laufen zu bringen. Die Suchergebnisseite ist stark angepasst.

5
Nick Taylor

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 Beitrag entspricht, unabhängig davon, ob der Schlüssel vorhanden ist oder nicht, und als LEFT JOIN einzurichten. Anschließend wird der Wert dieses Schlüssels sortiert, einschließlich der mit NULL Werte.

1