Căutare tip postare personalizată după metadate

28 ian. 2014, 17:48:50
Vizualizări: 19.6K
Voturi: 6

Am un tip de postare personalizată 'Property' pe care utilizatorii trebuie să o poată căuta după metadate.

Am 3 funcții de căutare - 2 în frontend și 1 în zona de admin - dintre care 2 funcționează corect și una care nu pare să filtreze rezultatele deloc.

Cred că ar putea fi o problemă fie cu definirea, fie cu utilizarea mea a custom query_vars.

În functions.php am următoarele:

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');

Căutarea după codul proprietății funcționează fără probleme atât în frontend cât și în backend, dar încercarea de a filtra rezultatele după variabilele personalizate - location, type și bedrooms - eșuează de fiecare dată.

Un exemplu de șir de interogare care este creat este următorul:

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

Există o proprietate pe site care se potrivește cu aceste detalii, dar WordPress returnează toate rezultatele de fiecare dată.

Am omis ceva?

EDIT: S-a dovedit că pentru că formularul meu de căutare pentru interogările meta nu utiliza un element cu numele 's', condiția $query->is_search din instrucțiunea mea if returna false, ceea ce însemna că meta_query-ul meu pur și simplu nu era apelat.

Mulțumiri lui fischi pentru că a observat asta pentru mine! :D

5
Comentarii

Variabilele personalizate de interogare sunt recunoscute de WordPress? Dacă folosești var_dump pe ele, obții valori pentru $query->query_vars?

fischi fischi
28 ian. 2014 18:10:28

Hmm, toate variabilele personalizate de interogare returnează NULL când le afișez cu var dump. De ce s-ar întâmpla asta?

Jazibobs Jazibobs
28 ian. 2014 18:16:11

Probabil pentru că ai un amestec între permalink-uri frumoase și variabile $_GET. Poți încerca să inserezi datele din $_GET în loc de $query->query_vars? Nu uita să le saniezi dacă alegi această cale :)

fischi fischi
28 ian. 2014 18:18:59

folosind $_GET returnează variabilele așa cum era de așteptat: array(3) { [0]=> string(3) "Two" [1]=> string(9) "Apartment" [2]=> string(7) "Bahceli" } crezi că o înlocuire directă cu $_GET în functions.php va rezolva problema?

Jazibobs Jazibobs
28 ian. 2014 18:29:43

Acest răspuns îți rezolvă întrebarea? Utilizarea get_posts cu argumente găsite în meta chei

T.Todua T.Todua
30 ian. 2021 19:09:51
Toate răspunsurile la întrebare 1
6

În acest caz, deoarece amestecați legături permanente (pretty permalinks) cu parametri de cerere, aș folosi variabilele $_GET în interogarea dumneavoastră.

$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'
        )
    )
);

Asigurați-vă că utilizați corect funcțiile de sanitizare, în funcție de nevoile dumneavoastră, sau folosiți o funcție care verifică valorile permise (whitelisted) din datele $_GET.

De asemenea, verificați funcția cu condiționale - modificați interogarea doar dacă este o cerere de căutare (folosind parametrul s), sau modificați declarația if.

28 ian. 2014 18:35:31
Comentarii

Am făcut modificările pe care le-ai recomandat, dar rezultatele căutării încă nu par să fie filtrate deloc, chiar dacă știu că variabilele $_GET sunt preluate corect când folosesc var_dump...

Jazibobs Jazibobs
28 ian. 2014 18:38:13

Poți să verifici ce interogare rulează WordPress-ul tău? <?php echo $GLOBALS['wp_query']->request; ?>

fischi fischi
28 ian. 2014 18:42:07

Interogarea este următoarea: SELECT SQL_CALC_FOUND_ROWS north_posts.ID FROM north_posts WHERE 1=1 AND north_posts.post_type = 'nc_property' AND (north_posts.post_status = 'publish' OR north_posts.post_status = 'private') ORDER BY north_posts.post_date DESC LIMIT 0, 10

deci se pare că meta query-ul meu este pur și simplu ignorat? :/

Jazibobs Jazibobs
28 ian. 2014 18:45:28

ups, am observat altceva - dacă nu folosești parametrul s, condiția ta if (!is_admin() && $query->is_search ) nu este îndeplinită, deoarece WordPress nu știe că aceasta este o căutare. Încearcă să modifici și asta.

fischi fischi
28 ian. 2014 19:03:40

Ești un erou WordPress! Faptul că am făcut unul dintre câmpurile de căutare să aibă numele 's' a rezolvat problema!

Jazibobs Jazibobs
28 ian. 2014 19:14:14

Super. Am actualizat răspunsul :)

fischi fischi
28 ian. 2014 19:16:24
Arată celelalte 1 comentarii