wake-up-neo.com

Suche nach benutzerdefinierten Beitragstypen anhand von Metadaten

Ich habe einen benutzerdefinierten Beitragstyp "Eigenschaft", den meine Benutzer benötigen, um anhand von Metadaten suchen zu können.

Ich habe 3 Suchfunktionen - 2 im Frontend 1 im Admin-Bereich - von denen 2 wie erwartet ausgeführt werden und eine, bei der die Ergebnisse anscheinend überhaupt nicht gefiltert werden.

Ich glaube, es liegt möglicherweise ein Problem mit meiner Definition oder der Verwendung von benutzerdefinierten query_vars vor.

In meiner functions.php habe ich folgendes:

function add_query_vars($public_query_vars) {
    $public_query_vars[] = 'bedrooms';
    $public_query_vars[] = 'type';
    $public_query_vars[] = 'location';
    return $public_query_vars;
}
add_filter('query_vars', 'add_query_vars');

function meta_search_query($query) {

    $query_args_code = array(
      'posts_per_page' => 5,
      'post_type' => 'nc_property',
      'meta_key' => 'nc_code',
      'meta_value' => $query->query_vars['s'],
      'meta_compare' => 'LIKE'
    );


    $query_args_meta = array(
        'posts_per_page' => -1,
        'post_type' => 'nc_property',
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'nc_bedrooms',
                'value' => $query->query_vars['bedrooms'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_type',
                'value' => $query->query_vars['type'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_location',
                'value' => $query->query_vars['location'],
                'compare' => 'LIKE'
            )
        )
    );

    if (is_admin() && $query->is_search ) {
        query_posts($query_args_code);

    } elseif (!is_admin() && $query->is_search ) {
        if ($_REQUEST["which_form"] == 'meta_form') {
            query_posts($query_args_meta);

        } elseif ($_REQUEST["which_form"] == 'code_form'){
            query_posts($query_args_code);

        }
    }  
}
add_filter( 'pre_get_posts', 'meta_search_query');

Die Suche nach dem Eigenschaftscode funktioniert sowohl im Frontend als auch im Backend problemlos. Der Versuch, die Ergebnisse nach den benutzerdefinierten Abfragevarianten (Standort, Typ und Schlafzimmer) zu filtern, bleibt jedoch immer unverändert.

Eine Beispiel-Abfragezeichenfolge, die erstellt wird, lautet wie folgt:

/property/?post_type=nc_property&which_form=meta_form&bedrooms=Two&type=Apartment&location=Bahceli

Es gibt eine Eigenschaft auf der Site, die diesen Details entspricht, aber WordPress gibt jedes Mal alle Ergebnisse zurück.

Habe ich etwas verpasst

BEARBEITEN: Es stellte sich heraus, dass die 's'-Bedingung meiner if-Anweisung falsch war, da mein Suchformular für meine Metaabfragen kein Element mit $query->is_search als Namen verwendete, was bedeutete, dass meine meta_query einfach nicht aufgerufen wurde.

Ein dickes Lob an Fischi, dass er das für mich entdeckt hat! : D

3
Jazibobs

In diesem Fall würde ich, wenn Sie hübsche Permalinks mit Anforderungsparametern mischen, die Variablen $_GET in Ihrer Abfrage verwenden.

$query_args_meta = array(
    'posts_per_page' => -1,
    'post_type' => 'nc_property',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'nc_bedrooms',
            'value' => sanitize_text_field( $_GET['bedrooms'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_type',
            'value' => sanitize_text_field( $_GET['type'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_location',
            'value' => sanitize_text_field( $_GET['location'] ),
            'compare' => 'LIKE'
        )
    )
);

Achten Sie darauf, je nach Ihren Anforderungen die richtige Hygiene zu verwenden, oder verwenden Sie eine Funktion, die nach Whitelist-Werten für die $_GET-Daten sucht.

Überprüfen Sie auch Ihre Funktion der Bedingungen - Sie ändern nur die Abfrage, wenn es sich um eine Suchanfrage handelt (mit s als Suchparameter), oder ändern Sie die Anweisung if.

3
fischi