Căutare tip postare personalizată după metadate
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

Î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
.

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
...

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

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? :/

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.

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